Exemple #1
0
        /// <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);
            }
        }
Exemple #2
0
 /// <summary>
 ///     Notifies the application that a complete initialization absolutely necessary.
 /// </summary>
 internal void _RequireInitialization()
 {
     _initializationState = ApplicationInitializationState.None;
 }