diff --git a/libs/UIX.Asm/Disassembler.cs b/libs/UIX.Asm/Disassembler.cs index db2dff8..92f2f37 100644 --- a/libs/UIX.Asm/Disassembler.cs +++ b/libs/UIX.Asm/Disassembler.cs @@ -3,9 +3,6 @@ using Microsoft.Iris.Asm.Models; using Microsoft.Iris.Markup; using System; using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; namespace Microsoft.Iris.Asm; @@ -62,28 +59,73 @@ public class Disassembler switch (opCode) { - case OpCode.ConstructObject: - // COBJ + // CMD (No operands) + case OpCode.InitializeInstanceIndirect: // INITI + case OpCode.PushNull: // PSHN + case OpCode.PushThis: // PSHT + case OpCode.DiscardValue: // DIS + case OpCode.ReturnValue: // RET + case OpCode.ReturnVoid: // RETV + yield return new Instruction(opCode, []); + break; + + // CMD + case OpCode.ConstructObject: // COBJ + case OpCode.ConstructObjectIndirect: // COBJI + case OpCode.InitializeInstance: // INIT + case OpCode.LookupSymbol: // LSYM + case OpCode.WriteSymbol: // WSYM + case OpCode.WriteSymbolPeek: // WSYMP + case OpCode.ClearSymbol: // CSYM + case OpCode.PropertyInitialize: // PINI + case OpCode.PropertyInitializeIndirect: // PINII + case OpCode.PropertyListAdd: // PLAD + case OpCode.PropertyAssign: // PASS + case OpCode.PropertyAssignStatic: // PASST + case OpCode.PropertyGet: // PGET + case OpCode.PropertyGetPeek: // PGETP + case OpCode.PropertyGetStatic: // PGETT + case OpCode.MethodInvoke: // MINV + case OpCode.MethodInvokePeek: // MINVP + case OpCode.MethodInvokeStatic: // MINVT + case OpCode.MethodInvokePushLastParam: // MINVA + case OpCode.MethodInvokeStaticPushLastParam: // MINVAT + case OpCode.VerifyTypeCast: // VTC + case OpCode.IsCheck: // ISC + case OpCode.As: // ASC + case OpCode.TypeOf: // TYP + case OpCode.PushConstant: // PSHC + case OpCode.ConstructListenerStorage: // CLIS yield return new Instruction(opCode, [new(reader.ReadUInt16())]); break; - case OpCode.ConstructObjectIndirect: - // COBI - yield return new Instruction(opCode, [new(reader.ReadUInt16())]); + // CMD + case OpCode.JumpIfFalse: // JMPF + case OpCode.JumpIfFalsePeek: // JMPFP + case OpCode.JumpIfTruePeek: // JMPT + case OpCode.JumpIfNullPeek: // JMPNP + case OpCode.Jump: // JMP + yield return new Instruction(opCode, [new(reader.ReadUInt32())]); break; - case OpCode.ConstructObjectParam: - // COBP + // CMD + case OpCode.EnterDebugState: // DBG + yield return new Instruction(opCode, [new(reader.ReadInt32())]); + break; + + // CMD + case OpCode.ConstructObjectParam: // COBP + case OpCode.ConstructFromString: // CSTR + case OpCode.PropertyDictionaryAdd: // PDAD + case OpCode.ConvertType: // CON yield return new Instruction(opCode, [new(reader.ReadUInt16()), new(reader.ReadUInt16())]); break; - case OpCode.ConstructFromString: - // CSTR - yield return new Instruction(opCode, [new(reader.ReadUInt16()), new(reader.ReadUInt16())]); + case OpCode.JumpIfDictionaryContains: // JMPD + yield return new Instruction(opCode, [new(reader.ReadUInt16()), new(reader.ReadUInt16()), new(reader.ReadUInt32())]); break; - case OpCode.ConstructFromBinary: - // CBIN + case OpCode.ConstructFromBinary: // CBIN var cbinTypeIndex = reader.ReadUInt16(); TypeSchema cbinTypeSchema = _loadResult.ImportTables.TypeImports[cbinTypeIndex]; object cbinObject = cbinTypeSchema.DecodeBinary(reader); @@ -91,36 +133,26 @@ public class Disassembler yield return new Instruction(opCode, [new(cbinTypeIndex), new(cbinObject)]); break; - // TODO + case OpCode.Operation: // OPR + var opHostIndex = reader.ReadUInt16(); + var op = (OperationType)reader.ReadByte(); - case OpCode.PropertyInitialize: - // PINI - yield return new Instruction(opCode, [new(reader.ReadUInt16())]); + yield return new Instruction(opCode, op, [new(opHostIndex)]); break; - case OpCode.PropertyInitializeIndirect: - // PINII - yield return new Instruction(opCode, [new(reader.ReadUInt16())]); + case OpCode.Listen: // LIS + case OpCode.DestructiveListen: // LISD + List lisOperands = [new(reader.ReadUInt16()), new(reader.ReadByte()), + new(reader.ReadUInt16()), new(reader.ReadUInt32())]; + + if (opCode == OpCode.DestructiveListen) + lisOperands.Add(new(reader.ReadUInt32())); + + yield return new Instruction(opCode, lisOperands); break; - // TODO - - case OpCode.PushConstant: - // PSHC - yield return new Instruction(opCode, [new(reader.ReadUInt16())]); - break; - - // TODO - - case OpCode.ReturnValue: - // RET - yield return new Instruction(opCode, []); - break; - - case OpCode.ReturnVoid: - // RETV - yield return new Instruction(opCode, []); - break; + default: + throw new NotImplementedException($"The {opCode} instruction has not been implemented yet."); } }