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