|
@@ -8,12 +8,16 @@ using System.Linq;
|
|
|
using System.Text;
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
using System.Threading;
|
|
|
using MoonSharp.Interpreter.DataStructs;
|
|
using MoonSharp.Interpreter.DataStructs;
|
|
|
|
|
+using MoonSharp.Interpreter.Debugging;
|
|
|
|
|
|
|
|
namespace MoonSharp.Interpreter.Execution.VM
|
|
namespace MoonSharp.Interpreter.Execution.VM
|
|
|
{
|
|
{
|
|
|
public class ByteCode : ITrackableReference
|
|
public class ByteCode : ITrackableReference
|
|
|
{
|
|
{
|
|
|
public List<Instruction> Code = new List<Instruction>();
|
|
public List<Instruction> Code = new List<Instruction>();
|
|
|
|
|
+ private List<SourceRef> m_SourceRefStack = new List<SourceRef>();
|
|
|
|
|
+ private SourceRef m_CurrentSourceRef = null;
|
|
|
|
|
+
|
|
|
internal LoopTracker LoopTracker = new LoopTracker();
|
|
internal LoopTracker LoopTracker = new LoopTracker();
|
|
|
|
|
|
|
|
|
|
|
|
@@ -25,6 +29,42 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
|
|
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
+ public IDisposable EnterSource(SourceRef sref)
|
|
|
|
|
+ {
|
|
|
|
|
+ return new SourceCodeStackGuard(sref, this);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ private class SourceCodeStackGuard : IDisposable
|
|
|
|
|
+ {
|
|
|
|
|
+ ByteCode m_Bc;
|
|
|
|
|
+
|
|
|
|
|
+ public SourceCodeStackGuard(SourceRef sref, ByteCode bc)
|
|
|
|
|
+ {
|
|
|
|
|
+ m_Bc = bc;
|
|
|
|
|
+ m_Bc.PushSourceRef(sref);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void Dispose()
|
|
|
|
|
+ {
|
|
|
|
|
+ m_Bc.PopSourceRef();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ public void PushSourceRef(SourceRef sref)
|
|
|
|
|
+ {
|
|
|
|
|
+ m_SourceRefStack.Add(sref);
|
|
|
|
|
+ m_CurrentSourceRef = sref;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void PopSourceRef()
|
|
|
|
|
+ {
|
|
|
|
|
+ m_SourceRefStack.RemoveAt(m_SourceRefStack.Count - 1);
|
|
|
|
|
+ m_CurrentSourceRef = (m_SourceRefStack.Count > 0) ? m_SourceRefStack[m_SourceRefStack.Count - 1] : null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
public void Dump(string file)
|
|
public void Dump(string file)
|
|
|
{
|
|
{
|
|
|
StringBuilder sb = new StringBuilder();
|
|
StringBuilder sb = new StringBuilder();
|
|
@@ -62,53 +102,53 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
|
|
|
|
|
public Instruction Emit_Nop(string comment)
|
|
public Instruction Emit_Nop(string comment)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Nop, Name = comment });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Nop, Name = comment });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Invalid(string type)
|
|
public Instruction Emit_Invalid(string type)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Invalid, Name = type });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Invalid, Name = type });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Pop(int num = 1)
|
|
public Instruction Emit_Pop(int num = 1)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Pop, NumVal = num });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Pop, NumVal = num });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void Emit_Call(int argCount, string debugName)
|
|
public void Emit_Call(int argCount, string debugName)
|
|
|
{
|
|
{
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.Call, NumVal = argCount, Name = debugName });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Call, NumVal = argCount, Name = debugName });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void Emit_ThisCall(int argCount, string debugName)
|
|
public void Emit_ThisCall(int argCount, string debugName)
|
|
|
{
|
|
{
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.ThisCall, NumVal = argCount, Name = debugName });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.ThisCall, NumVal = argCount, Name = debugName });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Literal(DynValue value)
|
|
public Instruction Emit_Literal(DynValue value)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Literal, Value = value });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Literal, Value = value });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Jump(OpCode jumpOpCode, int idx, int optPar = 0)
|
|
public Instruction Emit_Jump(OpCode jumpOpCode, int idx, int optPar = 0)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = jumpOpCode, NumVal = idx, NumVal2 = optPar });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = jumpOpCode, NumVal = idx, NumVal2 = optPar });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_MkTuple(int cnt)
|
|
public Instruction Emit_MkTuple(int cnt)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.MkTuple, NumVal = cnt });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.MkTuple, NumVal = cnt });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Operator(OpCode opcode)
|
|
public Instruction Emit_Operator(OpCode opcode)
|
|
|
{
|
|
{
|
|
|
- var i = AppendInstruction(new Instruction() { OpCode = opcode });
|
|
|
|
|
|
|
+ var i = AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = opcode });
|
|
|
|
|
|
|
|
if (opcode == OpCode.LessEq)
|
|
if (opcode == OpCode.LessEq)
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.CNot });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.CNot });
|
|
|
|
|
|
|
|
if (opcode == OpCode.Eq || opcode == OpCode.Less)
|
|
if (opcode == OpCode.Eq || opcode == OpCode.Less)
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.ToBool });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.ToBool });
|
|
|
|
|
|
|
|
return i;
|
|
return i;
|
|
|
}
|
|
}
|
|
@@ -117,73 +157,73 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
//[Conditional("EMIT_DEBUG_OPS")]
|
|
//[Conditional("EMIT_DEBUG_OPS")]
|
|
|
public void Emit_Debug(string str)
|
|
public void Emit_Debug(string str)
|
|
|
{
|
|
{
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.Debug, Name = str.Substring(0, Math.Min(32, str.Length)) });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Debug, Name = str.Substring(0, Math.Min(32, str.Length)) });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Enter(RuntimeScopeBlock runtimeScopeBlock)
|
|
public Instruction Emit_Enter(RuntimeScopeBlock runtimeScopeBlock)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Enter, NumVal = runtimeScopeBlock.From, NumVal2 = runtimeScopeBlock.ToInclusive });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Enter, NumVal = runtimeScopeBlock.From, NumVal2 = runtimeScopeBlock.ToInclusive });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Leave(RuntimeScopeBlock runtimeScopeBlock)
|
|
public Instruction Emit_Leave(RuntimeScopeBlock runtimeScopeBlock)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Leave, NumVal = runtimeScopeBlock.From, NumVal2 = runtimeScopeBlock.To });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Leave, NumVal = runtimeScopeBlock.From, NumVal2 = runtimeScopeBlock.To });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Exit(RuntimeScopeBlock runtimeScopeBlock)
|
|
public Instruction Emit_Exit(RuntimeScopeBlock runtimeScopeBlock)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Exit, NumVal = runtimeScopeBlock.From, NumVal2 = runtimeScopeBlock.ToInclusive });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Exit, NumVal = runtimeScopeBlock.From, NumVal2 = runtimeScopeBlock.ToInclusive });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Closure(SymbolRef[] symbols, int jmpnum)
|
|
public Instruction Emit_Closure(SymbolRef[] symbols, int jmpnum)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Closure, SymbolList = symbols, NumVal = jmpnum });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Closure, SymbolList = symbols, NumVal = jmpnum });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Args(SymbolRef[] symbols)
|
|
public Instruction Emit_Args(SymbolRef[] symbols)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Args, SymbolList = symbols });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Args, SymbolList = symbols });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Ret(int retvals)
|
|
public Instruction Emit_Ret(int retvals)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Ret, NumVal = retvals });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Ret, NumVal = retvals });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_ToNum(int stage = 0)
|
|
public Instruction Emit_ToNum(int stage = 0)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.ToNum, NumVal = stage });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.ToNum, NumVal = stage });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Incr(int i)
|
|
public Instruction Emit_Incr(int i)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Incr, NumVal = i });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Incr, NumVal = i });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_NewTable()
|
|
public Instruction Emit_NewTable()
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.NewTable });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.NewTable });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_IterPrep()
|
|
public Instruction Emit_IterPrep()
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.IterPrep });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.IterPrep });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_ExpTuple(int stackOffset)
|
|
public Instruction Emit_ExpTuple(int stackOffset)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.ExpTuple, NumVal = stackOffset });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.ExpTuple, NumVal = stackOffset });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_IterUpd()
|
|
public Instruction Emit_IterUpd()
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.IterUpd });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.IterUpd });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
public Instruction Emit_BeginFn(RuntimeScopeFrame m_StackFrame, string funcName)
|
|
public Instruction Emit_BeginFn(RuntimeScopeFrame m_StackFrame, string funcName)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction()
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef)
|
|
|
{
|
|
{
|
|
|
OpCode = OpCode.BeginFn,
|
|
OpCode = OpCode.BeginFn,
|
|
|
SymbolList = m_StackFrame.DebugSymbols.ToArray(),
|
|
SymbolList = m_StackFrame.DebugSymbols.ToArray(),
|
|
@@ -195,7 +235,7 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
|
|
|
|
|
public Instruction Emit_Scalar()
|
|
public Instruction Emit_Scalar()
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Scalar });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Scalar });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public int Emit_Load(SymbolRef sym)
|
|
public int Emit_Load(SymbolRef sym)
|
|
@@ -204,13 +244,13 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
{
|
|
{
|
|
|
case SymbolRefType.Global:
|
|
case SymbolRefType.Global:
|
|
|
Emit_Load(sym.i_Env);
|
|
Emit_Load(sym.i_Env);
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.Index, Value = DynValue.NewString(sym.i_Name) });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Index, Value = DynValue.NewString(sym.i_Name) });
|
|
|
return 2;
|
|
return 2;
|
|
|
case SymbolRefType.Local:
|
|
case SymbolRefType.Local:
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.Local, Symbol = sym });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Local, Symbol = sym });
|
|
|
return 1;
|
|
return 1;
|
|
|
case SymbolRefType.Upvalue:
|
|
case SymbolRefType.Upvalue:
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.Upvalue, Symbol = sym });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Upvalue, Symbol = sym });
|
|
|
return 1;
|
|
return 1;
|
|
|
default:
|
|
default:
|
|
|
throw new InternalErrorException("Unexpected symbol type : {0}", sym);
|
|
throw new InternalErrorException("Unexpected symbol type : {0}", sym);
|
|
@@ -223,13 +263,13 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
{
|
|
{
|
|
|
case SymbolRefType.Global:
|
|
case SymbolRefType.Global:
|
|
|
Emit_Load(sym.i_Env);
|
|
Emit_Load(sym.i_Env);
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.IndexSet, Symbol = sym, NumVal = stackofs, NumVal2 = tupleidx, Value = DynValue.NewString(sym.i_Name) });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.IndexSet, Symbol = sym, NumVal = stackofs, NumVal2 = tupleidx, Value = DynValue.NewString(sym.i_Name) });
|
|
|
return 2;
|
|
return 2;
|
|
|
case SymbolRefType.Local:
|
|
case SymbolRefType.Local:
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.StoreLcl, Symbol = sym, NumVal = stackofs, NumVal2 = tupleidx });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.StoreLcl, Symbol = sym, NumVal = stackofs, NumVal2 = tupleidx });
|
|
|
return 1;
|
|
return 1;
|
|
|
case SymbolRefType.Upvalue:
|
|
case SymbolRefType.Upvalue:
|
|
|
- AppendInstruction(new Instruction() { OpCode = OpCode.StoreUpv, Symbol = sym, NumVal = stackofs, NumVal2 = tupleidx });
|
|
|
|
|
|
|
+ AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.StoreUpv, Symbol = sym, NumVal = stackofs, NumVal2 = tupleidx });
|
|
|
return 1;
|
|
return 1;
|
|
|
default:
|
|
default:
|
|
|
throw new InternalErrorException("Unexpected symbol type : {0}", sym);
|
|
throw new InternalErrorException("Unexpected symbol type : {0}", sym);
|
|
@@ -238,32 +278,32 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
|
|
|
|
|
public Instruction Emit_TblInitN()
|
|
public Instruction Emit_TblInitN()
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.TblInitN });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.TblInitN });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_TblInitI(bool lastpos)
|
|
public Instruction Emit_TblInitI(bool lastpos)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.TblInitI, NumVal = lastpos ? 1 : 0 });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.TblInitI, NumVal = lastpos ? 1 : 0 });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Index(DynValue index = null)
|
|
public Instruction Emit_Index(DynValue index = null)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Index, Value = index });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Index, Value = index });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_IndexSet(int stackofs, int tupleidx, DynValue index = null)
|
|
public Instruction Emit_IndexSet(int stackofs, int tupleidx, DynValue index = null)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.IndexSet, NumVal = stackofs, NumVal2 = tupleidx, Value = index });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.IndexSet, NumVal = stackofs, NumVal2 = tupleidx, Value = index });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Copy(int numval)
|
|
public Instruction Emit_Copy(int numval)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Copy, NumVal = numval });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Copy, NumVal = numval });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Instruction Emit_Swap(int p1, int p2)
|
|
public Instruction Emit_Swap(int p1, int p2)
|
|
|
{
|
|
{
|
|
|
- return AppendInstruction(new Instruction() { OpCode = OpCode.Swap, NumVal = p1, NumVal2 = p2 });
|
|
|
|
|
|
|
+ return AppendInstruction(new Instruction(m_CurrentSourceRef) { OpCode = OpCode.Swap, NumVal = p1, NumVal2 = p2 });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|