Beispiel #1
0
        internal override void CompileBy(FunctionCompiler compiler)
        {
            if (_catchBlock == null && _finallyBlock == null)
            {
                Errors.ThrowInternalError();
            }

            if (_catchBlock != null)
            {
                if (_finallyBlock == null)
                {
                    EmitTryCatch(compiler);
                }
                else
                {
                    EmitTryCatchFinally(compiler);
                }
            }
            else
            {
                EmitTryFinally(compiler);
            }

            compiler.MarkEndOfStatement();
        }
 internal override void CompileBy(FunctionCompiler compiler)
 {
     foreach (var statement in _statements)
     {
         statement.CompileBy(compiler);
     }
     compiler.MarkEndOfStatement();
 }
Beispiel #3
0
 internal override void CompileBy(FunctionCompiler compiler)
 {
     if (compiler.IsEvalMode)
     {
         // В случае режима eval необходимо оставлять результат последней операции в стеке вычислений,
         // но прежде необходимо вытолкнуть предыдущий результат
         compiler.Emitter.Emit(OpCode.Pop);
         _expression.CompileBy(compiler, false);
     }
     else
     {
         _expression.CompileBy(compiler, true);
     }
     compiler.MarkEndOfStatement();
 }
Beispiel #4
0
        internal override sealed void CompileBy(FunctionCompiler compiler)
        {
            DoEmitProlog(compiler);
            var context = new CompilingContext(compiler);

            try {
                compiler.StatementStarts.Add(this, context.StartLabel);
                compiler.StatementEnds.Add(this, context.EndLabel);
                compiler.Emitter.MarkLabel(context.StartLabel);
                DoEmit(context);
                compiler.Emitter.MarkLabel(context.EndLabel);
            }
            finally {
                compiler.StatementEnds.Remove(this);
                compiler.StatementStarts.Remove(this);
            }
            DoEmitEpilog(compiler);
            compiler.MarkEndOfStatement();
        }
        internal override void CompileBy(FunctionCompiler compiler)
        {
            var endLabel = compiler.Emitter.DefineLabel();

            compiler.StatementEnds.Add(this, endLabel);
            try {
                var jumps = new Dictionary <JSValue, int>();
                foreach (var caseClause in _beforeDefault)
                {
                    var offset = compiler.Emitter.Offset;
                    caseClause.Statements.CompileBy(compiler);
                    jumps.Add(caseClause.Expression.ToJSValue(), offset);
                }
                int?defaultOffset = null;
                if (_defaultClause != null)
                {
                    defaultOffset = compiler.Emitter.Offset;
                    _defaultClause.CompileBy(compiler);
                }
                foreach (var caseClause in _afterDefault)
                {
                    var offset = compiler.Emitter.Offset;
                    caseClause.Statements.CompileBy(compiler);
                    jumps.Add(caseClause.Expression.ToJSValue(), offset);
                }
                compiler.Emitter.MarkLabel(endLabel);
                Contract.Assert(endLabel.Offset.HasValue);
                if (!defaultOffset.HasValue)
                {
                    defaultOffset = endLabel.Offset.Value;
                }
                Contract.Assert(defaultOffset.HasValue);
                compiler.SwitchJumpTables.Add(new SwitchJumpTable(jumps, defaultOffset.Value));
            }
            finally {
                compiler.StatementEnds.Remove(this);
            }
            compiler.MarkEndOfStatement();
        }
Beispiel #6
0
 internal override void CompileBy(FunctionCompiler compiler)
 {
     Condition.CompileBy(compiler, false);
     if (_elseStatement == null)
     {
         var endLabel = compiler.Emitter.DefineLabel();
         compiler.Emitter.Emit(OpCode.GotoIfFalse, endLabel);
         ThenStatement.CompileBy(compiler);
         compiler.Emitter.MarkLabel(endLabel);
     }
     else
     {
         var endLabel   = compiler.Emitter.DefineLabel();
         var falseLabel = compiler.Emitter.DefineLabel();
         compiler.Emitter.Emit(OpCode.GotoIfFalse, falseLabel);
         _thenStatement.CompileBy(compiler);
         compiler.Emitter.Emit(OpCode.Goto, endLabel);
         compiler.Emitter.MarkLabel(falseLabel);
         _elseStatement.CompileBy(compiler);
         compiler.Emitter.MarkLabel(endLabel);
     }
     compiler.MarkEndOfStatement();
 }