mirror of
https://github.com/Wack0/IFPSTools.NET.git
synced 2025-06-18 10:45:36 -04:00
Revert "libifps: allow reading invalid operands"
This reverts commit 58e78597e7
.
This commit is contained in:
parent
58e78597e7
commit
6feeac38f7
@ -24,10 +24,6 @@ namespace IFPSLib.Emit
|
||||
/// <summary>
|
||||
/// Operand refers to an element of an indexed variable, where the index is specified as a local or global variable, or an argument.
|
||||
/// </summary>
|
||||
IndexedVariable,
|
||||
/// <summary>
|
||||
/// Operand is invalid. Stops execution.
|
||||
/// </summary>
|
||||
Invalid = 0xff
|
||||
IndexedVariable
|
||||
}
|
||||
}
|
||||
|
@ -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<uint>());
|
||||
}
|
||||
|
||||
private static T TryReadIndex<T>(BinaryReader br, IList<T> list)
|
||||
{
|
||||
var index = (int)br.Read<uint>();
|
||||
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<FunctionArgument>()
|
||||
};
|
||||
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<Operand>(2) { new Operand(new TypedData(InstructionType.Instance, FixBranchOffset(br, brOffset))), valOp };
|
||||
break;
|
||||
case OperandType.InlineFunction:
|
||||
ret.m_Operands = new List<Operand>(1) { TryReadFunction(br, script) };
|
||||
ret.m_Operands = new List<Operand>(1) { Operand.Create(script.Functions[(int)br.Read<uint>()]) };
|
||||
break;
|
||||
case OperandType.InlineType:
|
||||
ret.m_Operands = new List<Operand>(1) { TryReadType(br, script) };
|
||||
ret.m_Operands = new List<Operand>(1) { Operand.Create(script.Types[(int)br.Read<uint>()]) };
|
||||
break;
|
||||
case OperandType.InlineCmpValue:
|
||||
ret.m_Operands = new List<Operand>(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<Operand>(3) {
|
||||
Operand.LoadValue(br, script, function),
|
||||
Operand.LoadValue(br, script, function),
|
||||
TryReadType(br, script)
|
||||
Operand.Create(script.Types[(int)br.Read<uint>()])
|
||||
};
|
||||
break;
|
||||
case OperandType.InlineEH:
|
||||
@ -493,7 +466,7 @@ namespace IFPSLib.Emit
|
||||
break;
|
||||
case OperandType.InlineTypeVariable:
|
||||
ret.m_Operands = new List<Operand>(2) {
|
||||
TryReadType(br, script),
|
||||
Operand.Create(script.Types[(int)br.Read<uint>()]),
|
||||
new Operand(VariableBase.Load(br, script, function))
|
||||
};
|
||||
return ret;
|
||||
|
@ -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<TType>(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<uint>();
|
||||
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<uint>();
|
||||
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 "";
|
||||
}
|
||||
|
@ -313,11 +313,7 @@ namespace IFPSLib
|
||||
switch (Type.BaseType)
|
||||
{
|
||||
case PascalTypeCode.Type:
|
||||
{
|
||||
var type = ValueAs<IType>();
|
||||
if (type is UnknownType) return "$UNKNOWN";
|
||||
return type.Name;
|
||||
}
|
||||
return ValueAs<IType>().Name;
|
||||
case PascalTypeCode.Instruction:
|
||||
if (Value == null) return "null";
|
||||
return string.Format("loc_{0}", ValueAs<Emit.Instruction>().Offset.ToString("x"));
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user