Exemple #1
0
        async Task ProcessCanonicalForAsync(ParsingScript script, string forString)
        {
            string[] forTokens = forString.Split(Constants.END_STATEMENT);
            if (forTokens.Length != 3)
            {
                throw new ArgumentException("Expecting: for(init; condition; loopStatement)");
            }

            int startForCondition = script.Pointer;

            ParsingScript initScript = new ParsingScript(forTokens[0] + Constants.END_STATEMENT);
            ParsingScript condScript = new ParsingScript(forTokens[1] + Constants.END_STATEMENT);
            ParsingScript loopScript = new ParsingScript(forTokens[2] + Constants.END_STATEMENT);

            initScript.ParentScript = script;
            condScript.ParentScript = script;
            loopScript.ParentScript = script;

            await initScript.ExecuteFromAsync(0);

            int  cycles     = 0;
            bool stillValid = true;

            while (stillValid)
            {
                Variable condResult = await condScript.ExecuteFromAsync(0);

                stillValid = Convert.ToBoolean(condResult.Value);
                if (!stillValid)
                {
                    break;
                }

                if (MAX_LOOPS > 0 && ++cycles >= MAX_LOOPS)
                {
                    throw new ArgumentException("Looks like an infinite loop after " +
                                                cycles + " cycles.");
                }

                script.Pointer = startForCondition;
                Variable result = await ProcessBlockAsync(script);

                if (result.IsReturn || result.Type == Variable.VarType.BREAK)
                {
                    //script.Pointer = startForCondition;
                    //SkipBlock(script);
                    //return;
                    break;
                }
                await loopScript.ExecuteFromAsync(0);
            }

            script.Pointer = startForCondition;
            SkipBlock(script);
        }