/// <summary> /// Constructor /// </summary> /// <param name="e">Arguments</param> public ExecutionEngine(ExecutionEngineArgs e) : base(e) { _interopCache = new List <InteropCacheEntry>(); _interopCacheIndex = new List <object>(); _internalInvokeInterop = new NeoVM.InvokeInteropCallback(InternalInvokeInterop); _internalLoadScript = new NeoVM.LoadScriptCallback(InternalLoadScript); _internalGetMessage = new NeoVM.GetMessageCallback(InternalGetMessage); _handle = NeoVM.ExecutionEngine_Create ( _internalInvokeInterop, _internalLoadScript, _internalGetMessage, out IntPtr invHandle, out IntPtr resHandle ); if (_handle == IntPtr.Zero) { throw new ExternalException(); } _invocationStack = new ExecutionContextStack(this, invHandle); _resultStack = new StackItemStack(this, resHandle); if (Logger != null) { if (Logger.Verbosity.HasFlag(ELogVerbosity.StepInto)) { _internalOnStepInto = new NeoVM.OnStepIntoCallback(InternalOnStepInto); NeoVM.ExecutionEngine_AddLog(_handle, _internalOnStepInto); } } }
public void TestPushPop(StackBase <string> stack) { var threads = Enumerable .Range(0, threadCount) .Select( n => new Thread( () => { for (var j = 0; j < iterations; j++) { for (var i = 0; i < iterationDepth; i++) { stack.Push(i.ToString()); } string res; for (var i = 0; i < iterationDepth; i++) { stack.TryPop(out res); } } })) .ToArray(); foreach (var thread in threads) { thread.Start(); } foreach (var thread in threads) { thread.Join(); } }
/// <summary> /// Assert invocation stack /// </summary> /// <param name="stack">Stack</param> /// <param name="result">Result</param> /// <param name="message">Message</param> private void AssertResult(StackBase <ExecutionContextBase> stack, VMUTExecutionContextState[] result, string message) { AssertAreEqual(stack.Count, result == null ? 0 : result.Length, message + "Stack is different"); for (int x = 0, max = stack.Count; x < max; x++) { var context = stack.Peek(x); AssertAreEqual(context.ScriptHash, result[x].ScriptHash, message + "Script hash is different"); AssertAreEqual(context.NextInstruction, result[x].NextInstruction, message + "Next instruction is different"); AssertAreEqual(context.InstructionPointer, result[x].InstructionPointer, message + "Instruction pointer is different"); AssertResult(context.EvaluationStack, result[x].EvaluationStack, message); AssertResult(context.AltStack, result[x].AltStack, message); } }