/// <summary> /// http://www.ecma-international.org/ecma-262/5.1/#sec-12.14 /// </summary> /// <param name="tryStatement"></param> /// <returns></returns> public Completion ExecuteTryStatement(TryStatement tryStatement) { var b = ExecuteStatement(tryStatement.Block); if (b.Type == Completion.Throw) { // execute catch if (tryStatement.Handlers.Any()) { foreach (var catchClause in tryStatement.Handlers) { var c = _engine.GetValue(b); var oldEnv = _engine.ExecutionContext.LexicalEnvironment; var catchEnv = LexicalEnvironment.NewDeclarativeEnvironment(_engine, oldEnv); catchEnv.Record.CreateMutableBinding(catchClause.Param.Name); catchEnv.Record.SetMutableBinding(catchClause.Param.Name, c, false); _engine.ExecutionContext.LexicalEnvironment = catchEnv; b = ExecuteStatement(catchClause.Body); _engine.ExecutionContext.LexicalEnvironment = oldEnv; } } } if (tryStatement.Finalizer != null) { var f = ExecuteStatement(tryStatement.Finalizer); if (f.Type == Completion.Normal) { return b; } return f; } return b; }
private void EmitTryStatement(TryStatement s) { Write("try"); Emit(s.Block); foreach (var handler in s.Handlers) { Write("catch("); Emit(handler.Param); Write(") "); Emit(handler.Body); } if(null != s.Finalizer) { Write("finally"); Emit(s.Finalizer); } }