/// <summary> /// Constructor /// </summary> /// <param name="engine">Engine</param> /// <param name="handle">Handle</param> internal ExecutionContext(ExecutionEngine engine, IntPtr handle) : base(engine) { Handle = handle; Engine = engine; NeoVM.ExecutionContext_Claim(Handle, out IntPtr evHandle, out IntPtr altHandle); _AltStack = new StackItemStack(Engine, altHandle); _EvaluationStack = new StackItemStack(Engine, evHandle); if (engine.Logger == null) { return; } if (engine.Logger.Verbosity.HasFlag(ELogVerbosity.AltStackChanges)) { _InternalOnAltStackChange = new NeoVM.OnStackChangeCallback(InternalOnAltStackChange); NeoVM.StackItems_AddLog(altHandle, _InternalOnAltStackChange); } if (engine.Logger.Verbosity.HasFlag(ELogVerbosity.EvaluationStackChanges)) { _InternalOnEvaluationStackChange = new NeoVM.OnStackChangeCallback(InternalOnEvaluationStackChange); NeoVM.StackItems_AddLog(evHandle, _InternalOnEvaluationStackChange); } }
/// <summary> /// Constructor /// </summary> /// <param name="e">Arguments</param> public ExecutionEngine(ExecutionEngineArgs e) : base(e) { _interopCache = 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); } } }
/// <summary> /// Check Array (using peek) /// </summary> /// <param name="stack">Stack</param> /// <param name="isStruct">Is struct</param> /// <param name="values">Values</param> protected void CheckArrayPop(IStackItemsStack stack, bool isStruct, params object[] values) { using (var arr = stack.Pop <IArrayStackItem>()) { Assert.IsTrue(arr != null); CheckArray(arr, isStruct, values); } }
/// <summary> /// Constructor /// </summary> /// <param name="engine">Engine</param> /// <param name="handle">Handle</param> internal ExecutionContext(ExecutionEngine engine, IntPtr handle) { _handle = handle; NeoVM.ExecutionContext_Claim(_handle, out IntPtr evHandle, out IntPtr altHandle); _altStack = new StackItemStack(engine, altHandle); _evaluationStack = new StackItemStack(engine, evHandle); }
/// <summary> /// Check Array (using peek) /// </summary> /// <param name="stack">Stack</param> /// <param name="index">Index</param> /// <param name="isStruct">Is struct</param> /// <param name="count">Count</param> /// <param name="values">Values</param> protected void CheckArrayPeek(IStackItemsStack stack, int index, bool isStruct, params object[] values) { using (var arr = stack.Peek <IArrayStackItem>(index)) { Assert.IsTrue(arr != null); Assert.AreEqual(isStruct, arr.IsStruct); CheckArray(arr, isStruct, values); } }
/// <summary> /// Raise OnAltStackChange /// </summary> /// <param name="stack">Stack</param> /// <param name="item">Item</param> /// <param name="index">Index</param> /// <param name="operation">Operation</param> public virtual void RaiseOnAltStackChange(IStackItemsStack stack, IStackItem item, int index, ELogStackOperation operation) { OnAltStackChange?.Invoke(stack, item, index, operation); }