|
@@ -150,12 +150,12 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- static object LoadSre(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode)
|
|
|
|
|
|
+ static object LoadSre(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode, bool useCompiledBindingsByDefault)
|
|
{
|
|
{
|
|
var success = false;
|
|
var success = false;
|
|
try
|
|
try
|
|
{
|
|
{
|
|
- var rv = LoadSreCore(xaml, localAssembly, rootInstance, uri, isDesignMode);
|
|
|
|
|
|
+ var rv = LoadSreCore(xaml, localAssembly, rootInstance, uri, isDesignMode, useCompiledBindingsByDefault);
|
|
success = true;
|
|
success = true;
|
|
return rv;
|
|
return rv;
|
|
}
|
|
}
|
|
@@ -167,7 +167,7 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- static object LoadSreCore(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode)
|
|
|
|
|
|
+ static object LoadSreCore(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool isDesignMode, bool useCompiledBindingsByDefault)
|
|
{
|
|
{
|
|
|
|
|
|
InitializeSre();
|
|
InitializeSre();
|
|
@@ -178,15 +178,14 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
var clrPropertyBuilder = tb.DefineNestedType("ClrProperties_" + Guid.NewGuid().ToString("N"));
|
|
var clrPropertyBuilder = tb.DefineNestedType("ClrProperties_" + Guid.NewGuid().ToString("N"));
|
|
var indexerClosureType = _sreBuilder.DefineType("IndexerClosure_" + Guid.NewGuid().ToString("N"));
|
|
var indexerClosureType = _sreBuilder.DefineType("IndexerClosure_" + Guid.NewGuid().ToString("N"));
|
|
var trampolineBuilder = _sreBuilder.DefineType("Trampolines_" + Guid.NewGuid().ToString("N"));
|
|
var trampolineBuilder = _sreBuilder.DefineType("Trampolines_" + Guid.NewGuid().ToString("N"));
|
|
-
|
|
|
|
|
|
+
|
|
var compiler = new AvaloniaXamlIlCompiler(new AvaloniaXamlIlCompilerConfiguration(_sreTypeSystem, asm,
|
|
var compiler = new AvaloniaXamlIlCompiler(new AvaloniaXamlIlCompilerConfiguration(_sreTypeSystem, asm,
|
|
_sreMappings, _sreXmlns, AvaloniaXamlIlLanguage.CustomValueConverter,
|
|
_sreMappings, _sreXmlns, AvaloniaXamlIlLanguage.CustomValueConverter,
|
|
new XamlIlClrPropertyInfoEmitter(_sreTypeSystem.CreateTypeBuilder(clrPropertyBuilder)),
|
|
new XamlIlClrPropertyInfoEmitter(_sreTypeSystem.CreateTypeBuilder(clrPropertyBuilder)),
|
|
new XamlIlPropertyInfoAccessorFactoryEmitter(_sreTypeSystem.CreateTypeBuilder(indexerClosureType)),
|
|
new XamlIlPropertyInfoAccessorFactoryEmitter(_sreTypeSystem.CreateTypeBuilder(indexerClosureType)),
|
|
new XamlIlTrampolineBuilder(_sreTypeSystem.CreateTypeBuilder(trampolineBuilder))),
|
|
new XamlIlTrampolineBuilder(_sreTypeSystem.CreateTypeBuilder(trampolineBuilder))),
|
|
_sreEmitMappings,
|
|
_sreEmitMappings,
|
|
- _sreContextType) { EnableIlVerification = true };
|
|
|
|
-
|
|
|
|
|
|
+ _sreContextType) { EnableIlVerification = true, DefaultCompileBindings = useCompiledBindingsByDefault };
|
|
|
|
|
|
IXamlType overrideType = null;
|
|
IXamlType overrideType = null;
|
|
if (rootInstance != null)
|
|
if (rootInstance != null)
|
|
@@ -204,8 +203,8 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
return LoadOrPopulate(created, rootInstance);
|
|
return LoadOrPopulate(created, rootInstance);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
- static object LoadOrPopulate(Type created, object rootInstance)
|
|
|
|
|
|
+
|
|
|
|
+ static object LoadOrPopulate(Type created, object rootInstance)
|
|
{
|
|
{
|
|
var isp = Expression.Parameter(typeof(IServiceProvider));
|
|
var isp = Expression.Parameter(typeof(IServiceProvider));
|
|
|
|
|
|
@@ -251,15 +250,15 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
}
|
|
}
|
|
|
|
|
|
public static object Load(Stream stream, Assembly localAssembly, object rootInstance, Uri uri,
|
|
public static object Load(Stream stream, Assembly localAssembly, object rootInstance, Uri uri,
|
|
- bool isDesignMode)
|
|
|
|
|
|
+ bool isDesignMode, bool useCompiledBindingsByDefault)
|
|
{
|
|
{
|
|
string xaml;
|
|
string xaml;
|
|
using (var sr = new StreamReader(stream))
|
|
using (var sr = new StreamReader(stream))
|
|
xaml = sr.ReadToEnd();
|
|
xaml = sr.ReadToEnd();
|
|
#if RUNTIME_XAML_CECIL
|
|
#if RUNTIME_XAML_CECIL
|
|
- return LoadCecil(xaml, localAssembly, rootInstance, uri);
|
|
|
|
|
|
+ return LoadCecil(xaml, localAssembly, rootInstance, uri, useCompiledBindingsByDefault);
|
|
#else
|
|
#else
|
|
- return LoadSre(xaml, localAssembly, rootInstance, uri, isDesignMode);
|
|
|
|
|
|
+ return LoadSre(xaml, localAssembly, rootInstance, uri, isDesignMode, useCompiledBindingsByDefault);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
@@ -293,7 +292,7 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
}
|
|
}
|
|
|
|
|
|
private static Dictionary<string, Type> _cecilGeneratedCache = new Dictionary<string, Type>();
|
|
private static Dictionary<string, Type> _cecilGeneratedCache = new Dictionary<string, Type>();
|
|
- static object LoadCecil(string xaml, Assembly localAssembly, object rootInstance, Uri uri)
|
|
|
|
|
|
+ static object LoadCecil(string xaml, Assembly localAssembly, object rootInstance, Uri uri, bool useCompiledBindingsByDefault)
|
|
{
|
|
{
|
|
if (uri == null)
|
|
if (uri == null)
|
|
throw new InvalidOperationException("Please, go away");
|
|
throw new InvalidOperationException("Please, go away");
|
|
@@ -303,8 +302,6 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
{
|
|
{
|
|
overrideType = _cecilTypeSystem.GetType(rootInstance.GetType().FullName);
|
|
overrideType = _cecilTypeSystem.GetType(rootInstance.GetType().FullName);
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
|
|
|
|
var safeUri = uri.ToString()
|
|
var safeUri = uri.ToString()
|
|
.Replace(":", "_")
|
|
.Replace(":", "_")
|
|
@@ -328,13 +325,16 @@ namespace Avalonia.Markup.Xaml.XamlIl
|
|
asm.MainModule.Types.Add(contextDef);
|
|
asm.MainModule.Types.Add(contextDef);
|
|
|
|
|
|
var tb = _cecilTypeSystem.CreateTypeBuilder(def);
|
|
var tb = _cecilTypeSystem.CreateTypeBuilder(def);
|
|
-
|
|
|
|
|
|
+
|
|
var compiler = new AvaloniaXamlIlCompiler(new XamlIlTransformerConfiguration(_cecilTypeSystem,
|
|
var compiler = new AvaloniaXamlIlCompiler(new XamlIlTransformerConfiguration(_cecilTypeSystem,
|
|
localAssembly == null ? null : _cecilTypeSystem.FindAssembly(localAssembly.GetName().Name),
|
|
localAssembly == null ? null : _cecilTypeSystem.FindAssembly(localAssembly.GetName().Name),
|
|
_cecilMappings, XamlIlXmlnsMappings.Resolve(_cecilTypeSystem, _cecilMappings),
|
|
_cecilMappings, XamlIlXmlnsMappings.Resolve(_cecilTypeSystem, _cecilMappings),
|
|
AvaloniaXamlIlLanguage.CustomValueConverter),
|
|
AvaloniaXamlIlLanguage.CustomValueConverter),
|
|
_cecilEmitMappings,
|
|
_cecilEmitMappings,
|
|
- _cecilTypeSystem.CreateTypeBuilder(contextDef));
|
|
|
|
|
|
+ _cecilTypeSystem.CreateTypeBuilder(contextDef))
|
|
|
|
+ {
|
|
|
|
+ DefaultCompileBindings = useCompiledBindingsByDefault
|
|
|
|
+ };
|
|
compiler.ParseAndCompile(xaml, uri.ToString(), tb, overrideType);
|
|
compiler.ParseAndCompile(xaml, uri.ToString(), tb, overrideType);
|
|
var asmPath = Path.Combine(_cecilEmitDir, safeUri + ".dll");
|
|
var asmPath = Path.Combine(_cecilEmitDir, safeUri + ".dll");
|
|
using(var f = File.Create(asmPath))
|
|
using(var f = File.Create(asmPath))
|