Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="e">Arguments</param>
        public ExecutionEngine(ExecutionEngineArgs e) : base(e)
        {
            _InternalInvokeInterop = new NeoVM.InvokeInteropCallback(InternalInvokeInterop);
            _InternalLoadScript    = new NeoVM.LoadScriptCallback(InternalLoadScript);
            _InternalGetMessage    = new NeoVM.GetMessageCallback(InternalGetMessage);
            InteropCache           = new List <object>();

            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);
                }

                if (Logger.Verbosity.HasFlag(ELogVerbosity.ExecutionContextStackChanges))
                {
                    _InternalOnExecutionContextChange = new NeoVM.OnStackChangeCallback(InternalOnExecutionContextChange);
                    NeoVM.ExecutionContextStack_AddLog(invHandle, _InternalOnExecutionContextChange);
                }

                if (Logger.Verbosity.HasFlag(ELogVerbosity.ResultStackChanges))
                {
                    _InternalOnResultStackChange = new NeoVM.OnStackChangeCallback(InternalOnResultStackChange);
                    NeoVM.StackItems_AddLog(resHandle, _InternalOnResultStackChange);
                }
            }
        }