Begin Assembly markup loader

This commit is contained in:
Yoshi Askharoun
2024-02-03 20:51:45 -06:00
parent 2d4c6d5f6d
commit d95fcab104
4 changed files with 64 additions and 25 deletions
+30 -20
View File
@@ -20,20 +20,25 @@ internal class AsmMarkupLoader
private readonly AsmMarkupLoadResult _loadResult; private readonly AsmMarkupLoadResult _loadResult;
private bool _usingSharedBinaryDataTable; private bool _usingSharedBinaryDataTable;
private SourceMarkupImportTables _importTables; private SourceMarkupImportTables _importTables;
private Dictionary<object, object> _importedNamespaces = new(); private Dictionary<string, LoadResult> _importedNamespaces = new();
protected AsmMarkupLoader(AsmMarkupLoadResult loadResult) => _loadResult = loadResult; 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); AsmMarkupLoader owner = new(loadResult);
if (resource.Status != ResourceStatus.Available) if (resource.Status != ResourceStatus.Available)
throw new InvalidOperationException("Resource must be available for reading"); throw new InvalidOperationException("Resource must be available for reading");
var data = new byte[resource.Length]; var data = (byte*)resource.Buffer;
Marshal.Copy(resource.Buffer, data, 0, (int)resource.Length);
owner._asmSource = Encoding.UTF8.GetString(data); // 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); var parseResult = Lexer.Program.TryParse(owner._asmSource);
if (parseResult.WasSuccessful) if (parseResult.WasSuccessful)
@@ -101,6 +106,7 @@ internal class AsmMarkupLoader
} }
} }
} }
foreach (LoadResult loadResult in _importedNamespaces.Values) foreach (LoadResult loadResult in _importedNamespaces.Values)
{ {
if (loadResult != _loadResult && loadResult != MarkupSystem.UIXGlobal) if (loadResult != _loadResult && loadResult != MarkupSystem.UIXGlobal)
@@ -110,25 +116,29 @@ internal class AsmMarkupLoader
MarkHasErrors(); MarkHasErrors();
} }
} }
if (_program != null && currentPass != LoadPass.Done) if (_program != null && currentPass != LoadPass.Done)
{ {
foreach (ValidateClass validateClass in _program.ClassList) //foreach (ValidateClass validateClass in _program.ClassList)
validateClass.Validate(_currentValidationPass); // validateClass.Validate(_currentValidationPass);
foreach (ValidateDataMapping dataMapping in _program.DataMappingList)
dataMapping.Validate(_currentValidationPass); //foreach (ValidateDataMapping dataMapping in _program.DataMappingList)
foreach (ValidateAlias alias in _program.AliasList) // dataMapping.Validate(_currentValidationPass);
alias.Validate(_currentValidationPass);
if (_currentValidationPass == LoadPass.Full) //foreach (ValidateAlias alias in _program.AliasList)
{ // alias.Validate(_currentValidationPass);
for (ValidateNamespace validateNamespace = _program.XmlnsList; validateNamespace != null; validateNamespace = validateNamespace.Next)
{ //if (_currentValidationPass == LoadPass.Full)
if (!_referencedNamespaces.ContainsKey(validateNamespace.Prefix)) //{
ErrorManager.ReportWarning(validateNamespace.Line, validateNamespace.Column, "Unreferenced namespace {0}", validateNamespace.Prefix); // 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) public void ReportError(string error, int line, int column)
+32 -4
View File
@@ -1,9 +1,37 @@
using System; using Microsoft.Iris.Data;
using System.Collections.Generic; using Microsoft.Iris.Markup;
using System.Text; using Microsoft.Iris.Session;
namespace Microsoft.Iris.Asm; 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;
}
} }
+1
View File
@@ -3,6 +3,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks> <TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
<LangVersion>12</LangVersion> <LangVersion>12</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefaultNamespace>Microsoft.Iris.Asm</DefaultNamespace> <DefaultNamespace>Microsoft.Iris.Asm</DefaultNamespace>
<Version>0.0.1-beta</Version> <Version>0.0.1-beta</Version>