blob: 4b6b706e68f2cb5c99a76be1cf75c4977b9e50be [file] [log] [blame]
// 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(Abrupt) 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)).
---*/
var fn, count = {};
// 1: try Abrupt, catch Abrupt, finally Abrupt; Completion: finally
count.catch = 0;
count.finally = 0;
fn = function() {
try {
throw 'try';
} catch(e) {
count.catch += 1;
throw 'catch';
} finally {
count.finally += 1;
throw new Test262Error('finally'); // If F.[[Type]] is normal, set F to C.
}
return 'wat';
};
assert.throws(Test262Error, fn, '1: try Abrupt, catch Abrupt, finally Abrupt; Completion: finally');
assert.sameValue(count.catch, 1, '1: catch count');
assert.sameValue(count.finally, 1, '1: finally count');
// 2: try Abrupt, catch Return, finally Abrupt; Completion: finally
count.catch = 0;
count.finally = 0;
fn = function() {
try {
throw 'try';
} catch(e) {
count.catch += 1;
return 'catch';
} finally {
count.finally += 1;
throw new Test262Error('finally'); // If F.[[Type]] is normal, set F to C.
}
return 'wat';
};
assert.throws(Test262Error, fn, '2: try Abrupt, catch Return, finally Abrupt; Completion: finally');
assert.sameValue(count.catch, 1, '2: catch count');
assert.sameValue(count.finally, 1, '2: fiinally count');
// 3: try Return, catch Return, finally Abrupt; Completion: finally
count.catch = 0;
count.finally = 0;
fn = function() {
try {
return 'try';
} catch(e) {
count.catch += 1;
return 'catch';
} finally {
count.finally += 1;
throw new Test262Error('finally'); // If F.[[Type]] is normal, set F to C.
}
return 'wat';
};
assert.throws(Test262Error, fn, '3: try Normal, catch Normal, finally Abrupt; Completion: finally');
assert.sameValue(count.catch, 0, '3: catch count');
assert.sameValue(count.finally, 1, '3: fiinally count');