Update RegExp tests (#614)

The RegExpBuiltinExec internal operation was modified in March of 2016
[1]: instead of referencing the `global` and `sticky` properties of the
"this" value, the algorithm now infers those values from the object's
[[OriginalFlags]] internal slot.

This change invalidated a number of tests. In cases where the change
resulted in an observable behavior, update the tests to assert the
latest specification text. In cases where the change removed a
previously-observable behavior, remove the files completely.

Specification text change set:

>        1. Assert: Type(_S_) is String.
>        1. Let _length_ be the number of code units in _S_.
>        1. Let _lastIndex_ be ? ToLength(? Get(_R_, `"lastIndex"`)).
>      - 1. Let _global_ be ToBoolean(? Get(_R_, `"global"`)).
>      - 1. Let _sticky_ be ToBoolean(? Get(_R_, `"sticky"`)).
>      + 1. Let _flags_ be the value of _R_'s [[OriginalFlags]] internal slot.
>      + 1. If _flags_ contains `"g"`, let _global_ be *true*, else let _global_ be *false*.
>      + 1. If _flags_ contains `"y"`, let _sticky_ be *true*, else let _sticky_ be *false*.
>        1. If _global_ is *false* and _sticky_ is *false*, let _lastIndex_ be 0.
>        1. Let _matcher_ be the value of _R_'s [[RegExpMatcher]] internal slot.
>      - 1. Let _flags_ be the value of _R_'s [[OriginalFlags]] internal slot.
>        1. If _flags_ contains `"u"`, let _fullUnicode_ be *true*, else let _fullUnicode_ be *false*.
>        1. Let _matchSucceeded_ be *false*.
>        1. Repeat, while _matchSucceeded_ is *false*

[1] https://github.com/tc39/ecma262/pull/494
This commit is contained in:
jugglinmike 2016-05-09 19:34:52 -04:00 committed by Leo Balter
parent f7a61edc6f
commit d9d3f7cf4f
17 changed files with 119 additions and 689 deletions

View File

@ -1,97 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Type coercion of `global` property value
es6id: 21.2.5.6
info: >
[...]
5. Let global be ToBoolean(Get(rx, "global")).
6. ReturnIfAbrupt(global).
7. If global is false, then
a. Return RegExpExec(rx, S).
21.2.5.2.1 Runtime Semantics: RegExpExec ( R, S )
[...]
7. Return RegExpBuiltinExec(R, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
6. Let global be ToBoolean(Get(R, "global")).
features: [Symbol.match]
---*/
var r = /./;
var val, result;
Object.defineProperty(r, 'global', {
get: function() {
return val;
}
});
val = false;
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], 'a');
val = '';
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], 'a');
val = 0;
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], 'a');
val = null;
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], 'a');
val = undefined;
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
assert.sameValue(result[0], 'a');
val = true;
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
assert.sameValue(result[0], 'a');
assert.sameValue(result[1], 'b');
val = 'truthy';
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
assert.sameValue(result[0], 'a');
assert.sameValue(result[1], 'b');
val = 86;
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
assert.sameValue(result[0], 'a');
assert.sameValue(result[1], 'b');
val = [];
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
assert.sameValue(result[0], 'a');
assert.sameValue(result[1], 'b');
val = Symbol.match;
result = r[Symbol.match]('ab');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
assert.sameValue(result[0], 'a');
assert.sameValue(result[1], 'b');

View File

@ -1,79 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Type coercion of `sticky` property value
es6id: 21.2.5.6
info: >
[...]
5. Let global be ToBoolean(Get(rx, "global")).
6. ReturnIfAbrupt(global).
7. If global is false, then
a. Return RegExpExec(rx, S).
21.2.5.2.1 Runtime Semantics: RegExpExec ( R, S )
[...]
7. Return RegExpBuiltinExec(R, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
[...]
18. If global is true or sticky is true,
a. Let setStatus be Set(R, "lastIndex", e, true).
features: [Symbol.match]
---*/
var r = /./;
var val;
Object.defineProperty(r, 'sticky', {
get: function() {
return val;
}
});
val = false;
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 0, 'literal false');
val = '';
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 0, 'empty string');
val = 0;
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 0, 'zero');
val = null;
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 0, 'null');
val = undefined;
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 0, 'undefined');
val = true;
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 1, 'literal true');
r.lastIndex = 0;
val = 'truthy';
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 1, 'non-empty string');
r.lastIndex = 0;
val = 86;
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 1, 'nonzero number');
r.lastIndex = 0;
val = [];
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 1, 'array');
r.lastIndex = 0;
val = Symbol.match;
r[Symbol.match]('a');
assert.sameValue(r.lastIndex, 1, 'symbol');

View File

@ -1,41 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Behavior when error thrown by accessing the `global` property
es6id: 21.2.5.6
info: >
[...]
5. Let global be ToBoolean(Get(rx, "global")).
6. ReturnIfAbrupt(global).
7. If global is false, then
a. Return RegExpExec(rx, S).
21.2.5.2.1 Runtime Semantics: RegExpExec ( R, S )
[...]
7. Return RegExpBuiltinExec(R, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
6. Let global be ToBoolean(Get(R, "global")).
7. ReturnIfAbrupt(global).
features: [Symbol.match]
---*/
var r = /./;
var callCount = 0;
Object.defineProperty(r, 'global', {
get: function() {
callCount += 1;
if (callCount > 1) {
throw new Test262Error();
}
}
});
assert.throws(Test262Error, function() {
r[Symbol.match]('');
});

View File

@ -1,37 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Behavior when error thrown by accessing the `sticky` property
es6id: 21.2.5.6
info: >
[...]
5. Let global be ToBoolean(Get(rx, "global")).
6. ReturnIfAbrupt(global).
7. If global is false, then
a. Return RegExpExec(rx, S).
21.2.5.2.1 Runtime Semantics: RegExpExec ( R, S )
[...]
7. Return RegExpBuiltinExec(R, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
9. ReturnIfAbrupt(sticky).
features: [Symbol.match]
---*/
var r = /./;
var shouldThrow = false;
Object.defineProperty(r, 'sticky', {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
r[Symbol.match]('');
});

View File

@ -27,14 +27,23 @@ info: >
features: [Symbol.match]
---*/
var r = /b/;
var r = /b/g;
var callCount = 0;
Object.defineProperty(r, 'lastIndex', { writable: false });
Object.defineProperty(r, 'global', {
// Because this test speicifically concerns the behavior when setting
// "lastIndex" following a match, care must be taken to avoid triggering a
// similar error when `lastIndex` is initially set to `0` earlier in the
// algorithm.
//
// Because the `lastIndex` property is non-configurable, this cannot be
// accomplished with a simple "set" accessor function.
//
// Defer disabling modification of `lastIndex` until after the "this" value's
// `exec` property has been accessed, ensuring that the resultant abrupt
// completion originates from the second property modification.
Object.defineProperty(r, 'exec', {
get: function() {
callCount += 1;
return callCount > 1;
Object.defineProperty(r, 'lastIndex', { writable: false });
}
});

View File

@ -3,7 +3,7 @@
/*---
description: Setting `lastIndex` after a "global" match success
es6id: 21.2.5.6
esid: sec-regexp.prototype-@@match
info: >
[...]
5. Let global be ToBoolean(Get(rx, "global")).
@ -18,6 +18,9 @@ info: >
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
5. Let flags be the value of R's [[OriginalFlags]] internal slot.
6. If flags contains "g", let global be true, else let global be false.
[...]
16. Let e be r's endIndex value.
[...]
@ -26,15 +29,10 @@ info: >
features: [Symbol.match]
---*/
var r = /b/;
var callCount = 0;
Object.defineProperty(r, 'global', {
get: function() {
callCount += 1;
return callCount > 1;
}
});
// The conflicting values for the "global" flag are necessary to observe the
// final modification of `lastIndex` in RegExpBuiltinExec
var r = /b/g;
Object.defineProperty(r, 'global', { value: false });
r[Symbol.match]('abc');

View File

@ -3,66 +3,83 @@
/*---
description: Boolean coercion of `global` property
es6id: 21.2.5.6
esid: sec-regexp.prototype-@@match
info: >
21.2.5.6 RegExp.prototype [ @@match ] ( string )
[...]
5. Let global be ToBoolean(Get(rx, "global")).
[...]
4. Let global be ToBoolean(? Get(rx, "global")).
5. If global is false, then
a. Return ? RegExpExec(rx, S).
6. Else global is true,
a. Let fullUnicode be ToBoolean(? Get(rx, "unicode")).
[...]
features: [Symbol.match]
---*/
var r = /a/;
var result;
var exec = function() {
execCount += 1;
if (execCount === 1) {
return [''];
}
return null;
};
var r, result, execCount;
r = /a/g;
r.exec = exec;
Object.defineProperty(r, 'global', { writable: true });
execCount = 0;
r.global = undefined;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
r[Symbol.match]('aa');
assert.sameValue(execCount, 1, 'value: undefined');
execCount = 0;
r.global = null;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
r[Symbol.match]('aa');
assert.sameValue(execCount, 1, 'value: null');
execCount = 0;
r.global = false;
r[Symbol.match]('aa');
assert.sameValue(execCount, 1, 'value: false');
execCount = 0;
r.global = NaN;
r[Symbol.match]('aa');
assert.sameValue(execCount, 1, 'value: NaN');
execCount = 0;
r.global = 0;
r[Symbol.match]('aa');
assert.sameValue(execCount, 1, 'value: 0');
execCount = 0;
r.global = '';
r[Symbol.match]('aa');
assert.sameValue(execCount, 1, 'value: ""');
r = /a/;
r.exec = exec;
Object.defineProperty(r, 'global', { writable: true });
r.global = true;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.notSameValue(result.length, 1);
r.global = false;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
r.global = NaN;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
r.global = 0;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
r.global = '';
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 1);
execCount = 0;
r[Symbol.match]('aa');
assert.sameValue(execCount, 2, 'value: true');
r.global = 86;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
execCount = 0;
r[Symbol.match]('aa');
assert.sameValue(execCount, 2, 'value: 86');
r.global = Symbol.match;
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
execCount = 0;
r[Symbol.match]('aa');
assert.sameValue(execCount, 2, 'value: Symbol.match');
r.global = {};
result = r[Symbol.match]('aa');
assert.notSameValue(result, null);
assert.sameValue(result.length, 2);
execCount = 0;
r[Symbol.match]('aa');
assert.sameValue(execCount, 2, 'value: {}');

View File

@ -1,54 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Boolean coercion of `sticky` property
es6id: 21.2.5.6
info: >
21.2.5.6 RegExp.prototype [ @@match ] ( string )
[...]
5. Let global be ToBoolean(Get(rx, "global")).
6. ReturnIfAbrupt(global).
7. If global is false, then
a. Return RegExpExec(rx, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
features: [Symbol.match]
---*/
var r = /a/;
Object.defineProperty(r, 'sticky', { writable: true });
r.sticky = undefined;
assert.notSameValue(r[Symbol.match]('ba'), null);
r.sticky = null;
assert.notSameValue(r[Symbol.match]('ba'), null);
r.sticky = true;
assert.sameValue(r[Symbol.match]('ba'), null);
r.sticky = false;
assert.notSameValue(r[Symbol.match]('ba'), null);
r.sticky = NaN;
assert.notSameValue(r[Symbol.match]('ba'), null);
r.sticky = 0;
assert.notSameValue(r[Symbol.match]('ba'), null);
r.sticky = '';
assert.notSameValue(r[Symbol.match]('ba'), null);
r.sticky = 86;
assert.sameValue(r[Symbol.match]('ba'), null);
r.sticky = Symbol.match;
assert.sameValue(r[Symbol.match]('ba'), null);
r.sticky = {};
assert.sameValue(r[Symbol.match]('ba'), null);

View File

@ -1,33 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Behavior if error is thrown when accessing `sticky` property
es6id: 21.2.5.6
info: >
21.2.5.6 RegExp.prototype [ @@match ] ( string )
[...]
5. Let global be ToBoolean(Get(rx, "global")).
6. ReturnIfAbrupt(global).
7. If global is false, then
a. Return RegExpExec(rx, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
9. ReturnIfAbrupt(sticky).
features: [Symbol.match]
---*/
var r = /./;
Object.defineProperty(r, 'sticky', {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
r[Symbol.match]();
});

View File

@ -13,35 +13,61 @@ info: >
features: [Symbol.replace]
---*/
var r = /a/;
Array.print = print;
var r = /a/g;
Object.defineProperty(r, 'global', { writable: true });
r.lastIndex = 0;
r.global = undefined;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba');
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba', 'value: undefined');
r.lastIndex = 0;
r.global = null;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba');
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba', 'value: null');
r.lastIndex = 0;
r.global = false;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba');
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba', 'value: false');
r.lastIndex = 0;
r.global = NaN;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba');
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba', 'value: NaN');
r.lastIndex = 0;
r.global = 0;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba');
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba', 'value: global');
r.lastIndex = 0;
r.global = '';
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba');
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'ba', 'value: ""');
var execCount = 0;
r = /a/;
Object.defineProperty(r, 'global', { writable: true });
r.exec = function() {
execCount += 1;
if (execCount === 1) {
return ['a'];
}
return null;
};
execCount = 0;
r.global = true;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'bb');
r[Symbol.replace]('aa', 'b');
assert.sameValue(execCount, 2, 'value: true');
execCount = 0;
r.global = 86;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'bb');
r[Symbol.replace]('aa', 'b');
assert.sameValue(execCount, 2, 'value: 86');
execCount = 0;
r.global = Symbol.replace;
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'bb');
r[Symbol.replace]('aa', 'b');
assert.sameValue(execCount, 2, 'value: Symbol.replace');
execCount = 0;
r.global = {};
assert.sameValue(r[Symbol.replace]('aa', 'b'), 'bb');
r[Symbol.replace]('aa', 'b');
assert.sameValue(execCount, 2, 'value: {}');

View File

@ -1,53 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Boolean coercion of `sticky` property
es6id: 21.2.5.8
info: >
21.2.5.8 RegExp.prototype [ @@replace ] ( string, replaceValue )
[...]
13. Repeat, while done is false
a. Let result be RegExpExec(rx, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
9. ReturnIfAbrupt(sticky).
features: [Symbol.replace]
---*/
var r = /a/;
Object.defineProperty(r, 'sticky', { writable: true });
r.sticky = undefined;
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'bx');
r.sticky = null;
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'bx');
r.sticky = true;
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'ba');
r.sticky = false;
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'bx');
r.sticky = NaN;
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'bx');
r.sticky = 0;
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'bx');
r.sticky = 86;
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'ba');
r.sticky = '';
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'bx');
r.sticky = Symbol();
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'ba');
r.sticky = {};
assert.sameValue(r[Symbol.replace]('ba', 'x'), 'ba');

View File

@ -1,31 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Behavior if error is thrown when accessing `sticky` property
es6id: 21.2.5.8
info: >
21.2.5.8 RegExp.prototype [ @@replace ] ( string, replaceValue )
[...]
13. Repeat, while done is false
a. Let result be RegExpExec(rx, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
9. ReturnIfAbrupt(sticky).
features: [Symbol.replace]
---*/
var r = /./;
Object.defineProperty(r, 'sticky', {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
r[Symbol.replace]();
});

View File

@ -1,54 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Boolean coercion of `sticky` property
es6id: 21.2.5.9
info: >
21.2.5.9 RegExp.prototype [ @@search ] ( string )
[...]
9. Let result be RegExpExec(rx, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
4. Let lastIndex be ToLength(Get(R,"lastIndex")).
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
[...]
features: [Symbol, Symbol.search]
---*/
var r = /a/;
Object.defineProperty(r, 'sticky', { writable: true });
r.sticky = undefined;
assert.sameValue(r[Symbol.search]('ba'), 1);
r.sticky = null;
assert.sameValue(r[Symbol.search]('ba'), 1);
r.sticky = true;
assert.sameValue(r[Symbol.search]('ba'), -1);
r.sticky = false;
assert.sameValue(r[Symbol.search]('ba'), 1);
r.sticky = NaN;
assert.sameValue(r[Symbol.search]('ba'), 1);
r.sticky = 0;
assert.sameValue(r[Symbol.search]('ba'), 1);
r.sticky = 86;
assert.sameValue(r[Symbol.search]('ba'), -1);
r.sticky = '';
assert.sameValue(r[Symbol.search]('ba'), 1);
r.sticky = Symbol();
assert.sameValue(r[Symbol.search]('ba'), -1);
r.sticky = {};
assert.sameValue(r[Symbol.search]('ba'), -1);

View File

@ -1,30 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Behavior if error is thrown when accessing `sticky` property
es6id: 21.2.5.9
info: >
21.2.5.9 RegExp.prototype [ @@search ] ( string )
[...]
9. Let result be RegExpExec(rx, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
9. ReturnIfAbrupt(sticky).
features: [Symbol.search]
---*/
var r = /./;
Object.defineProperty(r, 'sticky', {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
r[Symbol.search]();
});

View File

@ -1,52 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Boolean coercion of `sticky` property
es6id: 21.2.5.2
info: >
21.2.5.2 RegExp.prototype.exec ( string )
[...]
6. Return RegExpBuiltinExec(R, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
[...]
features: [Symbol]
---*/
var r = /a/;
Object.defineProperty(r, 'sticky', { writable: true });
r.sticky = undefined;
assert.notSameValue(r.exec('ba'), null);
r.sticky = null;
assert.notSameValue(r.exec('ba'), null);
r.sticky = true;
assert.sameValue(r.exec('ba'), null);
r.sticky = false;
assert.notSameValue(r.exec('ba'), null);
r.sticky = NaN;
assert.notSameValue(r.exec('ba'), null);
r.sticky = 0;
assert.notSameValue(r.exec('ba'), null);
r.sticky = 86;
assert.sameValue(r.exec('ba'), null);
r.sticky = '';
assert.notSameValue(r.exec('ba'), null);
r.sticky = Symbol();
assert.sameValue(r.exec('ba'), null);
r.sticky = {};
assert.sameValue(r.exec('ba'), null);

View File

@ -1,29 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Behavior if error is thrown when accessing `sticky` property
es6id: 21.2.5.2
info: >
21.2.5.2 RegExp.prototype.exec ( string )
[...]
6. Return RegExpBuiltinExec(R, S).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
9. ReturnIfAbrupt(sticky).
---*/
var r = /./;
Object.defineProperty(r, 'sticky', {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
r.exec();
});

View File

@ -1,30 +0,0 @@
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Behavior if error is thrown when accessing `sticky` property
es6id: 21.2.5.13
info: >
21.2.5.13 RegExp.prototype.test( S )
[...]
5. Let match be RegExpExec(R, string).
21.2.5.2.2 Runtime Semantics: RegExpBuiltinExec ( R, S )
[...]
8. Let sticky be ToBoolean(Get(R, "sticky")).
9. ReturnIfAbrupt(sticky).
---*/
var r = /./;
Object.defineProperty(r, 'sticky', {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
r.test();
});