From d95fcab104164c69f00336e88018f8d6fd821225 Mon Sep 17 00:00:00 2001 From: Yoshi Askharoun Date: Sat, 3 Feb 2024 20:51:41 -0600 Subject: [PATCH] Begin Assembly markup loader --- libs/MicrosoftIris | 2 +- libs/UIX.Asm/AsmMarkupLoader.cs | 50 ++++++++++++++++++++------------- libs/UIX.Asm/Assembler.cs | 36 +++++++++++++++++++++--- libs/UIX.Asm/UIX.Asm.csproj | 1 + 4 files changed, 64 insertions(+), 25 deletions(-) diff --git a/libs/MicrosoftIris b/libs/MicrosoftIris index ab51ed6..488ba6e 160000 --- a/libs/MicrosoftIris +++ b/libs/MicrosoftIris @@ -1 +1 @@ -Subproject commit ab51ed67bf26fafdfcab46b6015f0c4327c6dbf5 +Subproject commit 488ba6e08912a646301e8527dd5c76136d4b69c0 diff --git a/libs/UIX.Asm/AsmMarkupLoader.cs b/libs/UIX.Asm/AsmMarkupLoader.cs index a65e0a1..13e44fb 100644 --- a/libs/UIX.Asm/AsmMarkupLoader.cs +++ b/libs/UIX.Asm/AsmMarkupLoader.cs @@ -20,20 +20,25 @@ internal class AsmMarkupLoader private readonly AsmMarkupLoadResult _loadResult; private bool _usingSharedBinaryDataTable; private SourceMarkupImportTables _importTables; - private Dictionary _importedNamespaces = new(); + private Dictionary _importedNamespaces = new(); protected AsmMarkupLoader(AsmMarkupLoadResult loadResult) => _loadResult = loadResult; - internal static AsmMarkupLoader Load(AsmMarkupLoadResult loadResult, Resource resource) + internal static unsafe AsmMarkupLoader Load(AsmMarkupLoadResult loadResult, Resource resource) { AsmMarkupLoader owner = new(loadResult); if (resource.Status != ResourceStatus.Available) throw new InvalidOperationException("Resource must be available for reading"); - var data = new byte[resource.Length]; - Marshal.Copy(resource.Buffer, data, 0, (int)resource.Length); - owner._asmSource = Encoding.UTF8.GetString(data); + var data = (byte*)resource.Buffer; + + // Check for BOM (byte order mark) + int sourceStartOffset = 0; + if (resource.Length >= 4 && *data == 0xEF && *(data + 1) == 0xBB && *(data + 2) == 0xBF) + sourceStartOffset = 3; + + owner._asmSource = Encoding.UTF8.GetString(data + sourceStartOffset, (int)(resource.Length - sourceStartOffset)); var parseResult = Lexer.Program.TryParse(owner._asmSource); if (parseResult.WasSuccessful) @@ -101,6 +106,7 @@ internal class AsmMarkupLoader } } } + foreach (LoadResult loadResult in _importedNamespaces.Values) { if (loadResult != _loadResult && loadResult != MarkupSystem.UIXGlobal) @@ -110,25 +116,29 @@ internal class AsmMarkupLoader MarkHasErrors(); } } + if (_program != null && currentPass != LoadPass.Done) { - foreach (ValidateClass validateClass in _program.ClassList) - validateClass.Validate(_currentValidationPass); - foreach (ValidateDataMapping dataMapping in _program.DataMappingList) - dataMapping.Validate(_currentValidationPass); - foreach (ValidateAlias alias in _program.AliasList) - alias.Validate(_currentValidationPass); - if (_currentValidationPass == LoadPass.Full) - { - for (ValidateNamespace validateNamespace = _program.XmlnsList; validateNamespace != null; validateNamespace = validateNamespace.Next) - { - if (!_referencedNamespaces.ContainsKey(validateNamespace.Prefix)) - ErrorManager.ReportWarning(validateNamespace.Line, validateNamespace.Column, "Unreferenced namespace {0}", validateNamespace.Prefix); - } - } + //foreach (ValidateClass validateClass in _program.ClassList) + // validateClass.Validate(_currentValidationPass); + + //foreach (ValidateDataMapping dataMapping in _program.DataMappingList) + // dataMapping.Validate(_currentValidationPass); + + //foreach (ValidateAlias alias in _program.AliasList) + // alias.Validate(_currentValidationPass); + + //if (_currentValidationPass == LoadPass.Full) + //{ + // for (ValidateNamespace validateNamespace = _program.XmlnsList; validateNamespace != null; validateNamespace = validateNamespace.Next) + // { + // if (!_referencedNamespaces.ContainsKey(validateNamespace.Prefix)) + // ErrorManager.ReportWarning(validateNamespace.Line, validateNamespace.Column, "Unreferenced namespace {0}", validateNamespace.Prefix); + // } + //} } - CompleteValidationPass(); + //CompleteValidationPass(); } public void ReportError(string error, int line, int column) diff --git a/libs/UIX.Asm/Assembler.cs b/libs/UIX.Asm/Assembler.cs index bbc5e67..5a42147 100644 --- a/libs/UIX.Asm/Assembler.cs +++ b/libs/UIX.Asm/Assembler.cs @@ -1,9 +1,37 @@ -using System; -using System.Collections.Generic; -using System.Text; +using Microsoft.Iris.Data; +using Microsoft.Iris.Markup; +using Microsoft.Iris.Session; namespace Microsoft.Iris.Asm; -public class Assembler +public static class Assembler { + public static void RegisterLoader() + { + MarkupSystem.RegisterFactoryByExtension(".uixa", Load); + } + + public static LoadResult Load(string uri) + { + Resource resource = ResourceManager.AcquireResource(uri); + if (resource == null) + return null; + + ErrorManager.EnterContext(resource.Uri); + LoadResult loadResult = LoadResultCache.Read(resource.Uri); + if (loadResult != null) + { + LoadResultCache.Write(uri, loadResult); + } + else + { + loadResult = new AsmMarkupLoadResult(resource, uri); + if (loadResult != null) + resource = null; + } + + resource?.Free(); + ErrorManager.ExitContext(); + return loadResult; + } } diff --git a/libs/UIX.Asm/UIX.Asm.csproj b/libs/UIX.Asm/UIX.Asm.csproj index 80cb1ad..7c5cb4e 100644 --- a/libs/UIX.Asm/UIX.Asm.csproj +++ b/libs/UIX.Asm/UIX.Asm.csproj @@ -3,6 +3,7 @@ netstandard2.0;net6.0 12 + true Microsoft.Iris.Asm 0.0.1-beta