diff --git a/IFPSLib/Emit/BytecodeOperandType.cs b/IFPSLib/Emit/BytecodeOperandType.cs index 72e40ce..d336e95 100644 --- a/IFPSLib/Emit/BytecodeOperandType.cs +++ b/IFPSLib/Emit/BytecodeOperandType.cs @@ -24,10 +24,6 @@ namespace IFPSLib.Emit /// /// Operand refers to an element of an indexed variable, where the index is specified as a local or global variable, or an argument. /// - IndexedVariable, - /// - /// Operand is invalid. Stops execution. - /// - Invalid = 0xff + IndexedVariable } } diff --git a/IFPSLib/Emit/Instruction.cs b/IFPSLib/Emit/Instruction.cs index 161968e..cb11f82 100644 --- a/IFPSLib/Emit/Instruction.cs +++ b/IFPSLib/Emit/Instruction.cs @@ -5,8 +5,6 @@ using System.IO; using System.Text; using System.Linq; using System.Collections; -using System.Net; -using System.Data; namespace IFPSLib.Emit { @@ -382,31 +380,6 @@ namespace IFPSLib.Emit return FixBranchOffset(br, br.Read()); } - private static T TryReadIndex(BinaryReader br, IList list) - { - var index = (int)br.Read(); - if (index < list.Count) return list[index]; - return default; - } - - private static Operand TryReadFunction(BinaryReader br, Script script) - { - var func = TryReadIndex(br, script.Functions); - if (func == null) func = new ScriptFunction() - { - Name = "INVALID", - Arguments = new List() - }; - return Operand.Create(func); - } - - private static Operand TryReadType(BinaryReader br, Script script) - { - var type = TryReadIndex(br, script.Types); - if (type == null) type = UnknownType.Instance; - return Operand.Create(type); - } - internal static Instruction Load(BinaryReader br, Script script, ScriptFunction function) { var ret = new Instruction(); @@ -464,10 +437,10 @@ namespace IFPSLib.Emit ret.m_Operands = new List(2) { new Operand(new TypedData(InstructionType.Instance, FixBranchOffset(br, brOffset))), valOp }; break; case OperandType.InlineFunction: - ret.m_Operands = new List(1) { TryReadFunction(br, script) }; + ret.m_Operands = new List(1) { Operand.Create(script.Functions[(int)br.Read()]) }; break; case OperandType.InlineType: - ret.m_Operands = new List(1) { TryReadType(br, script) }; + ret.m_Operands = new List(1) { Operand.Create(script.Types[(int)br.Read()]) }; break; case OperandType.InlineCmpValue: ret.m_Operands = new List(3) { Operand.LoadValue(br, script, function), Operand.LoadValue(br, script, function), Operand.LoadValue(br, script, function) }; @@ -476,7 +449,7 @@ namespace IFPSLib.Emit ret.m_Operands = new List(3) { Operand.LoadValue(br, script, function), Operand.LoadValue(br, script, function), - TryReadType(br, script) + Operand.Create(script.Types[(int)br.Read()]) }; break; case OperandType.InlineEH: @@ -493,7 +466,7 @@ namespace IFPSLib.Emit break; case OperandType.InlineTypeVariable: ret.m_Operands = new List(2) { - TryReadType(br, script), + Operand.Create(script.Types[(int)br.Read()]), new Operand(VariableBase.Load(br, script, function)) }; return ret; diff --git a/IFPSLib/Emit/Operand.cs b/IFPSLib/Emit/Operand.cs index 769afd8..bb29da1 100644 --- a/IFPSLib/Emit/Operand.cs +++ b/IFPSLib/Emit/Operand.cs @@ -105,12 +105,6 @@ namespace IFPSLib.Emit m_Value = op.m_Value; } - private Operand(Exception ex = null) - { - m_Type = BytecodeOperandType.Invalid; - if (ex != null) m_Value.Immediate = new TypedData(Types.UnknownType.Instance, ex); - } - public static Operand Create(Types.PrimitiveType type, TType value) { return new Operand(TypedData.Create(type, value)); @@ -162,39 +156,31 @@ namespace IFPSLib.Emit return new Operand(arr, varIdx); } - public static Operand CreateInvalid(Exception ex = null) - { - return new Operand(ex); - } - internal static Operand LoadValue(BinaryReader br, Script script, ScriptFunction function) { var type = (BytecodeOperandType)br.ReadByte(); - try + switch (type) { - switch (type) - { - case BytecodeOperandType.Variable: - return new Operand(VariableBase.Load(br, script, function)); - case BytecodeOperandType.Immediate: - return new Operand(TypedData.Load(br, script)); - case BytecodeOperandType.IndexedImmediate: - { - var variable = VariableBase.Load(br, script, function); - var idx = br.Read(); - return Create(variable, idx); - } - case BytecodeOperandType.IndexedVariable: - { - var variable = VariableBase.Load(br, script, function); - var idx = VariableBase.Load(br, script, function); - return new Operand(variable, idx); - } - default: - throw new ArgumentOutOfRangeException(string.Format("Invalid operand type {0}", (byte)type)); - } - } catch (Exception ex) { return new Operand(ex); } + case BytecodeOperandType.Variable: + return new Operand(VariableBase.Load(br, script, function)); + case BytecodeOperandType.Immediate: + return new Operand(TypedData.Load(br, script)); + case BytecodeOperandType.IndexedImmediate: + { + var variable = VariableBase.Load(br, script, function); + var idx = br.Read(); + return Create(variable, idx); + } + case BytecodeOperandType.IndexedVariable: + { + var variable = VariableBase.Load(br, script, function); + var idx = VariableBase.Load(br, script, function); + return new Operand(variable, idx); + } + default: + throw new ArgumentOutOfRangeException(string.Format("Invalid operand type {0}", (byte)type)); + } } public override string ToString() @@ -209,8 +195,6 @@ namespace IFPSLib.Emit return String.Format("{0}[{1}]", IndexedVariable.Name, IndexImmediate); case BytecodeOperandType.IndexedVariable: return String.Format("{0}[{1}]", IndexedVariable.Name, IndexVariable.Name); - case BytecodeOperandType.Invalid: - return "$INVALID"; default: return ""; } diff --git a/IFPSLib/TypedData.cs b/IFPSLib/TypedData.cs index 25d7d6c..2c3dcf3 100644 --- a/IFPSLib/TypedData.cs +++ b/IFPSLib/TypedData.cs @@ -313,11 +313,7 @@ namespace IFPSLib switch (Type.BaseType) { case PascalTypeCode.Type: - { - var type = ValueAs(); - if (type is UnknownType) return "$UNKNOWN"; - return type.Name; - } + return ValueAs().Name; case PascalTypeCode.Instruction: if (Value == null) return "null"; return string.Format("loc_{0}", ValueAs().Offset.ToString("x")); diff --git a/readme.md b/readme.md index adcd8aa..324e34b 100644 --- a/readme.md +++ b/readme.md @@ -19,7 +19,7 @@ Library implementing an assembler for IFPS scripts. Depends on IFPSLib. -Assembling the output of IFPSLib's disassembler (for sane bytecode with no invalid instructions/operands) is expected to output an identical binary, not doing so is considered a bug. +Assembling the output of IFPSLib's disassembler is expected to output an identical binary, not doing so is considered a bug. ## ifpsdasm