/// <summary> /// <para>Makes the application ensure that it is initialized.</para> /// </summary> /// <param name = "targetEngine">The engine in which to perform initialization.</param> /// <remarks> /// <para> /// <ul> /// <list type = "table"> /// <listheader> /// <term><see cref = "InitializationState" /></term> /// <description>Behaviour</description> /// </listheader> /// <item> /// <term><see cref = "ApplicationInitializationState.None" /></term> /// <description>Initialization always required.</description> /// </item> /// <item> /// <term><see cref = "ApplicationInitializationState.Complete" /></term> /// <description>No initialization required.</description> /// </item> /// </list> /// </ul> /// </para> /// </remarks> public void EnsureInitialization(Engine targetEngine) { if (_SuppressInitialization) return; switch (_initializationState) { #pragma warning disable 612,618 case ApplicationInitializationState.Partial: #pragma warning restore 612,618 case ApplicationInitializationState.None: try { _SuppressInitialization = true; FunctionContext fctx = _initializationFunction.CreateFunctionContext ( targetEngine, new PValue[0], // \init has no arguments new PVariable[0], // \init is not a closure true // don't initialize. That's what WE are trying to do here. ); //Find offset at which to continue initialization. fctx.Pointer = _initializationOffset; #if Verbose Console.WriteLine("#Initialization (offset = {0}).", _initializationOffset); #endif //Execute the part of the initialize function that is missing targetEngine.Stack.AddLast(fctx); try { targetEngine.Process(); } finally { //Save the current initialization state (offset) _initializationOffset = _initializationFunction.Code.Count; _initializationState = ApplicationInitializationState.Complete; } } finally { _SuppressInitialization = false; } break; case ApplicationInitializationState.Complete: break; default: throw new PrexoniteException( "Invalid InitializationState " + _initializationState); } }
/// <summary> /// Notifies the application that a complete initialization absolutely necessary. /// </summary> internal void _RequireInitialization() { _initializationState = ApplicationInitializationState.None; }