|
@@ -9,9 +9,9 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
{
|
|
{
|
|
|
sealed partial class Processor
|
|
sealed partial class Processor
|
|
|
{
|
|
{
|
|
|
- public RValue Execute()
|
|
|
|
|
|
|
+ private RValue Processing_Loop()
|
|
|
{
|
|
{
|
|
|
- while (m_InstructionPtr < m_CurChunk.Code.Count && !m_Terminate)
|
|
|
|
|
|
|
+ while (m_InstructionPtr < m_CurChunk.Code.Count && m_InstructionPtr >= 0)
|
|
|
{
|
|
{
|
|
|
Instruction i = m_CurChunk.Code[m_InstructionPtr];
|
|
Instruction i = m_CurChunk.Code[m_InstructionPtr];
|
|
|
|
|
|
|
@@ -26,13 +26,12 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
{
|
|
{
|
|
|
case OpCode.Nop:
|
|
case OpCode.Nop:
|
|
|
case OpCode.Debug:
|
|
case OpCode.Debug:
|
|
|
- case OpCode.DebugFn:
|
|
|
|
|
break;
|
|
break;
|
|
|
case OpCode.Pop:
|
|
case OpCode.Pop:
|
|
|
m_ValueStack.RemoveLast(i.NumVal);
|
|
m_ValueStack.RemoveLast(i.NumVal);
|
|
|
break;
|
|
break;
|
|
|
case OpCode.Load:
|
|
case OpCode.Load:
|
|
|
- m_ValueStack.Push(m_Scope.Get(i.Symbol));
|
|
|
|
|
|
|
+ m_ValueStack.Push(this.GetGenericSymbol(i.Symbol));
|
|
|
break;
|
|
break;
|
|
|
case OpCode.Literal:
|
|
case OpCode.Literal:
|
|
|
m_ValueStack.Push(i.Value);
|
|
m_ValueStack.Push(i.Value);
|
|
@@ -102,19 +101,20 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
m_ValueStack.Push(RValue.FromPotentiallyNestedTuple(StackTopToArrayReverse(i.NumVal, true)));
|
|
m_ValueStack.Push(RValue.FromPotentiallyNestedTuple(StackTopToArrayReverse(i.NumVal, true)));
|
|
|
break;
|
|
break;
|
|
|
case OpCode.Enter:
|
|
case OpCode.Enter:
|
|
|
- m_Scope.PushFrame(i.Frame);
|
|
|
|
|
|
|
+ NilifyBlockData(i.Block);
|
|
|
break;
|
|
break;
|
|
|
case OpCode.Leave:
|
|
case OpCode.Leave:
|
|
|
- m_Scope.PopFrame();
|
|
|
|
|
- break;
|
|
|
|
|
case OpCode.Exit:
|
|
case OpCode.Exit:
|
|
|
- ExecExit(i);
|
|
|
|
|
|
|
+ ClearBlockData(i.Block, i.OpCode == OpCode.Exit);
|
|
|
break;
|
|
break;
|
|
|
case OpCode.Closure:
|
|
case OpCode.Closure:
|
|
|
- m_ValueStack.Push(new RValue(new Closure(i.NumVal, i.SymbolList, m_Scope)));
|
|
|
|
|
|
|
+ m_ValueStack.Push(new RValue(new Closure(i.NumVal, i.SymbolList, m_ExecutionStack.Peek().LocalScope)));
|
|
|
break;
|
|
break;
|
|
|
case OpCode.ExitClsr:
|
|
case OpCode.ExitClsr:
|
|
|
- m_Scope.LeaveClosure();
|
|
|
|
|
|
|
+ this.LeaveClosure();
|
|
|
|
|
+ break;
|
|
|
|
|
+ case OpCode.BeginFn:
|
|
|
|
|
+ ExecBeginFn(i);
|
|
|
break;
|
|
break;
|
|
|
case OpCode.Args:
|
|
case OpCode.Args:
|
|
|
ExecArgs(i);
|
|
ExecArgs(i);
|
|
@@ -177,6 +177,8 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
private void ExecJNil(Instruction i)
|
|
private void ExecJNil(Instruction i)
|
|
|
{
|
|
{
|
|
|
RValue v = m_ValueStack.Pop();
|
|
RValue v = m_ValueStack.Pop();
|
|
@@ -232,19 +234,6 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
m_ValueStack.Push(v);
|
|
m_ValueStack.Push(v);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private void ExecExit(Instruction i)
|
|
|
|
|
- {
|
|
|
|
|
- if (i.Frame == null)
|
|
|
|
|
- {
|
|
|
|
|
- m_Scope.PopFramesToFunction();
|
|
|
|
|
- if (m_ExecutionStack.Count > 0)
|
|
|
|
|
- m_Scope.LeaveClosure();
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- m_Scope.PopFramesToFrame(i.Frame);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
private void ExecJFor(Instruction i)
|
|
private void ExecJFor(Instruction i)
|
|
|
{
|
|
{
|
|
@@ -286,12 +275,6 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
|
|
|
|
|
private void ExecRet(Instruction i)
|
|
private void ExecRet(Instruction i)
|
|
|
{
|
|
{
|
|
|
- if (m_ExecutionStack.Count == 0)
|
|
|
|
|
- {
|
|
|
|
|
- m_Terminate = true;
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
if (i.NumVal == 0)
|
|
if (i.NumVal == 0)
|
|
|
{
|
|
{
|
|
|
int retpoint = PopToBasePointer();
|
|
int retpoint = PopToBasePointer();
|
|
@@ -315,6 +298,21 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private void ExecBeginFn(Instruction i)
|
|
|
|
|
+ {
|
|
|
|
|
+ CallStackItem c = m_ExecutionStack.Peek();
|
|
|
|
|
+ c.Debug_Symbols = i.SymbolList;
|
|
|
|
|
+ c.LocalScope = new RValue[i.NumVal];
|
|
|
|
|
+
|
|
|
|
|
+ if (i.NumVal2 >= 0 && i.NumVal > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (int idx = 0; idx < i.NumVal2; idx++)
|
|
|
|
|
+ {
|
|
|
|
|
+ c.LocalScope[idx] = new RValue();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private int PopToBasePointer()
|
|
private int PopToBasePointer()
|
|
|
{
|
|
{
|
|
|
var xs = m_ExecutionStack.Pop();
|
|
var xs = m_ExecutionStack.Pop();
|
|
@@ -339,11 +337,11 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
{
|
|
{
|
|
|
if (i >= numargs)
|
|
if (i >= numargs)
|
|
|
{
|
|
{
|
|
|
- m_Scope.Assign(I.SymbolList[i], new RValue());
|
|
|
|
|
|
|
+ this.AssignGenericSymbol(I.SymbolList[i], new RValue());
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- m_Scope.Assign(I.SymbolList[i], m_ValueStack.Peek(numargs - i).CloneAsWritable());
|
|
|
|
|
|
|
+ this.AssignGenericSymbol(I.SymbolList[i], m_ValueStack.Peek(numargs - i).CloneAsWritable());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -370,7 +368,7 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
Debug_EntryPoint = fn.Function.ByteCodeLocation
|
|
Debug_EntryPoint = fn.Function.ByteCodeLocation
|
|
|
});
|
|
});
|
|
|
m_InstructionPtr = fn.Function.ByteCodeLocation;
|
|
m_InstructionPtr = fn.Function.ByteCodeLocation;
|
|
|
- fn.Function.EnterClosureBeforeCall(m_Scope);
|
|
|
|
|
|
|
+ this.EnterClosure(fn.Function.ClosureContext);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -546,7 +544,7 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- m_Scope.Assign(l, r.ToSimplestValue());
|
|
|
|
|
|
|
+ this.AssignGenericSymbol(l, r.ToSimplestValue());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -608,7 +606,7 @@ namespace MoonSharp.Interpreter.Execution.VM
|
|
|
|
|
|
|
|
private void ExecSymStorN(Instruction i)
|
|
private void ExecSymStorN(Instruction i)
|
|
|
{
|
|
{
|
|
|
- m_Scope.Assign(i.Symbol, m_ValueStack.Peek());
|
|
|
|
|
|
|
+ this.AssignGenericSymbol(i.Symbol, m_ValueStack.Peek());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|