Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support optional catch binding #900

Merged
merged 3 commits into from
May 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions Jint.Tests.Test262/Language/Statements/TryTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Xunit;

namespace Jint.Tests.Test262.Language.Statements
{
public class TryTests : Test262Test
{
[Theory(DisplayName = "language\\statements\\try")]
[MemberData(nameof(SourceFiles), "language\\statements\\try", false)]
[MemberData(nameof(SourceFiles), "language\\statements\\try", true, Skip = "Skipped")]
protected void For(SourceFile sourceFile)
{
RunTestInternal(sourceFile);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try(e1){
try(e1){
}
catch(e){}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try{
try{
}
finally(e){}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
catch
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
finally
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
try{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ negative:
type: SyntaxError
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

// CHECK#1
catch(){}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ negative:
flags: [onlyStrict]
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

try { } catch (arguments) { }
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ negative:
flags: [onlyStrict]
---*/

throw "Test262: This statement should not be evaluated.";
$DONOTEVALUATE();

try { } catch (eval) { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// 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');
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// 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');