本文整理汇总了C#中MoonSharp.Interpreter.Execution.VM.Instruction类的典型用法代码示例。如果您正苦于以下问题:C# Instruction类的具体用法?C# Instruction怎么用?C# Instruction使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
Instruction类属于MoonSharp.Interpreter.Execution.VM命名空间,在下文中一共展示了Instruction类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ClearBlockData
private void ClearBlockData(Instruction I)
{
var from = I.NumVal;
var to = I.NumVal2;
var array = m_ExecutionStack.Peek().LocalScope;
if (to >= 0 && from >= 0 && to >= from)
{
Array.Clear(array, from, to - from + 1);
}
}
示例2: ExecIndex
private int ExecIndex(Instruction i, int instructionPtr)
{
int nestedMetaOps = 100; // sanity check, to avoid potential infinite loop here
// stack: base - index
bool isNameIndex = i.OpCode == OpCode.IndexN;
bool isMultiIndex = (i.OpCode == OpCode.IndexL);
DynValue originalIdx = i.Value ?? m_ValueStack.Pop();
DynValue idx = originalIdx.ToScalar();
DynValue obj = m_ValueStack.Pop().ToScalar();
DynValue h = null;
while (nestedMetaOps > 0)
{
--nestedMetaOps;
if (obj.Type == DataType.Table)
{
if (!isMultiIndex)
{
var v = obj.Table.Get(idx);
if (!v.IsNil())
{
m_ValueStack.Push(v.AsReadOnly());
return instructionPtr;
}
}
h = GetMetamethodRaw(obj, "__index");
if (h == null || h.IsNil())
{
if (isMultiIndex) throw new ScriptRuntimeException("cannot multi-index a table. userdata expected");
m_ValueStack.Push(DynValue.Nil);
return instructionPtr;
}
}
else if (obj.Type == DataType.UserData)
{
UserData ud = obj.UserData;
var v = ud.Descriptor.Index(this.GetScript(), ud.Object, originalIdx, isNameIndex);
if (v == null)
{
throw ScriptRuntimeException.UserDataMissingField(ud.Descriptor.Name, idx.String);
}
m_ValueStack.Push(v.AsReadOnly());
return instructionPtr;
}
else
{
h = GetMetamethodRaw(obj, "__index");
if (h == null || h.IsNil())
throw ScriptRuntimeException.IndexType(obj);
}
if (h.Type == DataType.Function || h.Type == DataType.ClrFunction)
{
if (isMultiIndex) throw new ScriptRuntimeException("cannot multi-index through metamethods. userdata expected");
m_ValueStack.Push(h);
m_ValueStack.Push(obj);
m_ValueStack.Push(idx);
return Internal_ExecCall(2, instructionPtr);
}
else
{
obj = h;
h = null;
}
}
throw ScriptRuntimeException.LoopInIndex();
}
示例3: ListenDebugger
private void ListenDebugger(Instruction instr, int instructionPtr)
{
bool isOnDifferentRef = false;
if (instr.SourceCodeRef != null && m_Debug.LastHlRef != null)
{
if (m_Debug.LineBasedBreakPoints)
{
isOnDifferentRef = instr.SourceCodeRef.SourceIdx != m_Debug.LastHlRef.SourceIdx ||
instr.SourceCodeRef.FromLine != m_Debug.LastHlRef.FromLine;
}
else
{
isOnDifferentRef = instr.SourceCodeRef != m_Debug.LastHlRef;
}
}
else if (m_Debug.LastHlRef == null)
{
isOnDifferentRef = instr.SourceCodeRef != null;
}
if (m_Debug.DebuggerAttached.IsPauseRequested() ||
(instr.SourceCodeRef != null && instr.SourceCodeRef.Breakpoint && isOnDifferentRef))
{
m_Debug.DebuggerCurrentAction = DebuggerAction.ActionType.None;
m_Debug.DebuggerCurrentActionTarget = -1;
}
switch (m_Debug.DebuggerCurrentAction)
{
case DebuggerAction.ActionType.Run:
if (m_Debug.LineBasedBreakPoints)
m_Debug.LastHlRef = instr.SourceCodeRef;
return;
case DebuggerAction.ActionType.ByteCodeStepOver:
if (m_Debug.DebuggerCurrentActionTarget != instructionPtr) return;
break;
case DebuggerAction.ActionType.ByteCodeStepOut:
case DebuggerAction.ActionType.StepOut:
if (m_ExecutionStack.Count >= m_Debug.ExStackDepthAtStep) return;
break;
case DebuggerAction.ActionType.StepIn:
if ((m_ExecutionStack.Count >= m_Debug.ExStackDepthAtStep) && (instr.SourceCodeRef == null || instr.SourceCodeRef == m_Debug.LastHlRef)) return;
break;
case DebuggerAction.ActionType.StepOver:
if (instr.SourceCodeRef == null || instr.SourceCodeRef == m_Debug.LastHlRef || m_ExecutionStack.Count > m_Debug.ExStackDepthAtStep) return;
break;
}
RefreshDebugger(false, instructionPtr);
while (true)
{
var action = m_Debug.DebuggerAttached.GetAction(instructionPtr, instr.SourceCodeRef);
switch (action.Action)
{
case DebuggerAction.ActionType.StepIn:
case DebuggerAction.ActionType.StepOver:
case DebuggerAction.ActionType.StepOut:
case DebuggerAction.ActionType.ByteCodeStepOut:
m_Debug.DebuggerCurrentAction = action.Action;
m_Debug.LastHlRef = instr.SourceCodeRef;
m_Debug.ExStackDepthAtStep = m_ExecutionStack.Count;
return;
case DebuggerAction.ActionType.ByteCodeStepIn:
m_Debug.DebuggerCurrentAction = DebuggerAction.ActionType.ByteCodeStepIn;
m_Debug.DebuggerCurrentActionTarget = -1;
return;
case DebuggerAction.ActionType.ByteCodeStepOver:
m_Debug.DebuggerCurrentAction = DebuggerAction.ActionType.ByteCodeStepOver;
m_Debug.DebuggerCurrentActionTarget = instructionPtr + 1;
return;
case DebuggerAction.ActionType.Run:
m_Debug.DebuggerCurrentAction = DebuggerAction.ActionType.Run;
m_Debug.LastHlRef = instr.SourceCodeRef;
m_Debug.DebuggerCurrentActionTarget = -1;
return;
case DebuggerAction.ActionType.ToggleBreakpoint:
ToggleBreakPoint(action, null);
RefreshDebugger(true, instructionPtr);
break;
case DebuggerAction.ActionType.ResetBreakpoints:
ResetBreakPoints(action);
RefreshDebugger(true, instructionPtr);
break;
case DebuggerAction.ActionType.SetBreakpoint:
ToggleBreakPoint(action, true);
RefreshDebugger(true, instructionPtr);
break;
case DebuggerAction.ActionType.ClearBreakpoint:
ToggleBreakPoint(action, false);
RefreshDebugger(true, instructionPtr);
break;
case DebuggerAction.ActionType.Refresh:
RefreshDebugger(false, instructionPtr);
break;
case DebuggerAction.ActionType.HardRefresh:
//.........这里部分代码省略.........
示例4: Compile
public int Compile(ByteCode bc, Func<int> afterDecl, string friendlyName)
{
using (bc.EnterSource(m_Begin))
{
var symbs = m_Closure
//.Select((s, idx) => s.CloneLocalAndSetFrame(m_ClosureFrames[idx]))
.ToArray();
m_ClosureInstruction = bc.Emit_Closure(symbs, bc.GetJumpPointForNextInstruction());
var ops = afterDecl();
m_ClosureInstruction.NumVal += 2 + ops;
}
return CompileBody(bc, friendlyName);
}
示例5: ExecNeg
private int ExecNeg(Instruction i, int instructionPtr)
{
DynValue r = m_ValueStack.Pop().ToScalar();
double? rn = r.CastToNumber();
if (rn.HasValue)
{
m_ValueStack.Push(DynValue.NewNumber(-rn.Value));
return instructionPtr;
}
else
{
int ip = Internal_InvokeUnaryMetaMethod(r, "__unm", instructionPtr);
if (ip >= 0) return ip;
else throw ScriptRuntimeException.ArithmeticOnNonNumber(r);
}
}
示例6: ExecMod
private int ExecMod(Instruction i, int instructionPtr)
{
DynValue r = m_ValueStack.Pop().ToScalar();
DynValue l = m_ValueStack.Pop().ToScalar();
double? rn = r.CastToNumber();
double? ln = l.CastToNumber();
if (ln.HasValue && rn.HasValue)
{
double mod = Math.IEEERemainder(ln.Value, rn.Value);
if (mod < 0) mod += rn.Value;
m_ValueStack.Push(DynValue.NewNumber(mod));
return instructionPtr;
}
else
{
int ip = Internal_InvokeBinaryMetaMethod(l, r, "__mod", instructionPtr);
if (ip >= 0) return ip;
else throw ScriptRuntimeException.ArithmeticOnNonNumber(l, r);
}
}
示例7: JumpBool
private int JumpBool(Instruction i, bool expectedValueForJump, int instructionPtr)
{
DynValue op = m_ValueStack.Pop().ToScalar();
if (op.CastToBool() == expectedValueForJump)
return i.NumVal;
return instructionPtr;
}
示例8: ExecRet
private int ExecRet(Instruction i)
{
CallStackItem csi;
int retpoint = 0;
if (i.NumVal == 0)
{
csi = PopToBasePointer();
retpoint = csi.ReturnAddress;
var argscnt = (int)(m_ValueStack.Pop().Number);
m_ValueStack.RemoveLast(argscnt + 1);
m_ValueStack.Push(DynValue.Void);
}
else if (i.NumVal == 1)
{
var retval = m_ValueStack.Pop();
csi = PopToBasePointer();
retpoint = csi.ReturnAddress;
var argscnt = (int)(m_ValueStack.Pop().Number);
m_ValueStack.RemoveLast(argscnt + 1);
m_ValueStack.Push(retval);
retpoint = Internal_CheckForTailRequests(i, retpoint);
}
else
{
throw new InternalErrorException("RET supports only 0 and 1 ret val scenarios");
}
if (csi.Continuation != null)
m_ValueStack.Push(csi.Continuation.Invoke(new ScriptExecutionContext(this, csi.Continuation, i.SourceCodeRef),
new DynValue[1] { m_ValueStack.Pop() }));
return retpoint;
}
示例9: ExecToNum
private void ExecToNum(Instruction i)
{
double? v = m_ValueStack.Pop().ToScalar().CastToNumber();
if (v.HasValue)
m_ValueStack.Push(DynValue.NewNumber(v.Value));
else
throw ScriptRuntimeException.ConvertToNumberFailed(i.NumVal);
}
示例10: ExecMkTuple
private void ExecMkTuple(Instruction i)
{
Slice<DynValue> slice = new Slice<DynValue>(m_ValueStack, m_ValueStack.Count - i.NumVal, i.NumVal, false);
var v = Internal_AdjustTuple(slice);
m_ValueStack.RemoveLast(i.NumVal);
m_ValueStack.Push(DynValue.NewTuple(v));
}
示例11: ExecClosure
private void ExecClosure(Instruction i)
{
Closure c = new Closure(this.m_Script, i.NumVal, i.SymbolList,
i.SymbolList.Select(s => this.GetUpvalueSymbol(s)).ToList());
m_ValueStack.Push(DynValue.NewClosure(c));
}
示例12: GetStoreValue
private DynValue GetStoreValue(Instruction i)
{
int stackofs = i.NumVal;
int tupleidx = i.NumVal2;
DynValue v = m_ValueStack.Peek(stackofs);
if (v.Type == DataType.Tuple)
{
return (tupleidx < v.Tuple.Length) ? v.Tuple[tupleidx] : DynValue.NewNil();
}
else
{
return (tupleidx == 0) ? v : DynValue.NewNil();
}
}
示例13: ExecSwap
private void ExecSwap(Instruction i)
{
DynValue v1 = m_ValueStack.Peek(i.NumVal);
DynValue v2 = m_ValueStack.Peek(i.NumVal2);
m_ValueStack.Set(i.NumVal, v2);
m_ValueStack.Set(i.NumVal2, v1);
}
示例14: ExecStoreUpv
private void ExecStoreUpv(Instruction i)
{
DynValue value = GetStoreValue(i);
SymbolRef symref = i.Symbol;
var stackframe = m_ExecutionStack.Peek();
DynValue v = stackframe.ClosureScope[symref.i_Index];
if (v == null)
stackframe.ClosureScope[symref.i_Index] = v = DynValue.NewNil();
v.Assign(value);
}
示例15: ExecStoreLcl
private void ExecStoreLcl(Instruction i)
{
DynValue value = GetStoreValue(i);
SymbolRef symref = i.Symbol;
AssignLocal(symref, value);
}