// Copyright (C) 2020 Salesforce.com. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-try-statement-runtime-semantics-evaluation description: > Returns the correct completion values of try-catch-finally(Normal) in functions info: | TryStatement : try Block Catch Finally Let B be the result of evaluating Block. If B.[[Type]] is throw, let C be CatchClauseEvaluation of Catch with argument B.[[Value]]. Else, let C be B. Let F be the result of evaluating Finally. If F.[[Type]] is normal, set F to C. Return Completion(UpdateEmpty(F, undefined)). ---*/ // 1: try Return, catch Return, finally Normal; Completion: try var count = { catch: 0, finally: 0 }; var fn = function() { try { return 'try'; } catch(e) { count.catch += 1; return 'catch'; } finally { count.finally += 1; 'normal'; } return 'wat'; }; assert.sameValue(fn(), 'try', '1: try Return, catch Return, finally Normal; Completion: try'); assert.sameValue(count.catch, 0, '1'); assert.sameValue(count.finally, 1, '1'); // 2: try Abrupt, catch Return, finally Normal; Completion: catch count.catch = 0; count.finally = 0; fn = function() { try { throw 'try'; } catch(e) { count.catch += 1; return 'catch'; } finally { count.finally += 1; 'finally'; } return 'wat'; }; assert.sameValue(fn(), 'catch', '2: try Abrupt, catch Return, finally Normal; Completion: catch'); assert.sameValue(count.catch, 1, '2: catch count'); assert.sameValue(count.finally, 1, '2: fiinally count'); // 3: try Abrupt, catch Abrupt, finally Normal; Completion: catch count.catch = 0; count.finally = 0; fn = function() { try { throw 'try'; } catch(e) { count.catch += 1; throw new Test262Error('catch'); } finally { count.finally += 1; 'finally'; } return 'wat'; }; assert.throws(Test262Error, fn, '3: try Abrupt, catch Abrupt, finally Normal; Completion: catch'); assert.sameValue(count.catch, 1, '3: catch count'); assert.sameValue(count.finally, 1, '3: fiinally count'); reportCompare(0, 0);