/// <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();
            }
        }
Exemple #3
0
        /// <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);
            }
        }