Skip to content

Commit

Permalink
Support optional catch binding (#900)
Browse files Browse the repository at this point in the history
  • Loading branch information
lahma authored May 19, 2021
1 parent e6f54b5 commit b29573b
Show file tree
Hide file tree
Showing 132 changed files with 575 additions and 164 deletions.
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');
Loading

0 comments on commit b29573b

Please sign in to comment.