Add support for string-encodable constants to assembler and disassembler

This commit is contained in:
Yoshi Askharoun
2024-02-12 12:16:31 -06:00
parent 07840d5ee5
commit f0f712f9d9
3 changed files with 54 additions and 26 deletions
+18 -8
View File
@@ -136,19 +136,19 @@ public class Disassembler
{
var constantsTable = _loadResult.ConstantsTable;
List<(int c, TypeSchema typeSchema, object constantValue)> constants = new();
bool canUsePersistList = constantsTable.PersistList is not null;
if (canUsePersistList)
{
var constants = _loadResult.ConstantsTable.PersistList;
var persistedList = _loadResult.ConstantsTable.PersistList;
for (int c = 0; c < constants.Length; c++)
for (int c = 0; c < persistedList.Length; c++)
{
var persistedConstant = constants[c];
var persistedConstant = persistedList[c];
var typeSchema = persistedConstant.Type;
var qualifiedTypeName = GetQualifiedName(typeSchema);
yield return new ConstantDirective($"const{c:D}", qualifiedTypeName, persistedConstant.Data.ToString());
constants.Add((c, typeSchema, persistedConstant));
}
}
else
@@ -169,10 +169,20 @@ public class Disassembler
var runtimeType = constantValue.GetType();
var typeSchema = _loadResult.ImportTables.TypeImports.FirstOrDefault(t => t.RuntimeType == runtimeType);
QualifiedTypeName qualifiedTypeName = GetQualifiedName(typeSchema);
yield return new ConstantDirective($"const{c:D}", qualifiedTypeName, constantValue.ToString());
constants.Add((c, typeSchema, constantValue));
}
}
foreach (var (c, typeSchema, constantValue) in constants)
{
string encodedValue = constantValue is IStringEncodable encodable
? encodable.EncodeString()
: constantValue.ToString();
QualifiedTypeName qualifiedTypeName = GetQualifiedName(typeSchema);
yield return new ConstantDirective($"const{c:D}", qualifiedTypeName, encodedValue);
}
}
public IEnumerable<IBodyItem> GetCode()