mirror of https://github.com/tc39/test262.git
[v8-test262-automation] Changes from https://github.com/v8/v8.git at sha f85a3554 on Mon Feb 04 2019 19:40:41 GMT+0000 (Coordinated Universal Time)
This commit is contained in:
parent
04ae1c1359
commit
8d9f7690f8
|
@ -26,7 +26,8 @@ let locales = [
|
|||
];
|
||||
|
||||
invalid_hc.forEach(function(hc) {
|
||||
let df = new Intl.DateTimeFormat(["en-u-hc-" + hc + "-fo-obar"]);
|
||||
let df = new Intl.DateTimeFormat(
|
||||
["en-u-hc-" + hc + "-fo-obar"], {hour: "2-digit"});
|
||||
assertEquals("en", df.resolvedOptions().locale);
|
||||
}
|
||||
);
|
||||
|
@ -34,7 +35,8 @@ invalid_hc.forEach(function(hc) {
|
|||
valid_hc.forEach(function(hc) {
|
||||
locales.forEach(function(base) {
|
||||
let l = base + "-u-hc-" + hc;
|
||||
let df = new Intl.DateTimeFormat([l + "-fo-obar"]);
|
||||
let df = new Intl.DateTimeFormat(
|
||||
[l + "-fo-obar"], {hour: "2-digit"});
|
||||
assertEquals(l, df.resolvedOptions().locale);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -46,6 +46,9 @@
|
|||
|
||||
# Unable to change locale on Windows:
|
||||
'default_locale': [SKIP],
|
||||
|
||||
# Unable to change locale and TZ on Windows:
|
||||
'regress-7770': [SKIP],
|
||||
}], # system == windows'
|
||||
|
||||
['system == android', {
|
||||
|
@ -56,5 +59,7 @@
|
|||
'relative-time-format/default-locale-fr-CA': [SKIP],
|
||||
'relative-time-format/default-locale-pt-BR': [SKIP],
|
||||
'default_locale': [SKIP],
|
||||
# Unable to change locale and TZ on Android:
|
||||
'regress-7770': [SKIP],
|
||||
}], # 'system == android'
|
||||
]
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
let getCount = 0;
|
||||
|
||||
new Intl.ListFormat(['en-US'], {
|
||||
get type() {
|
||||
get localeMatcher() {
|
||||
assertEquals(0, getCount++);
|
||||
},
|
||||
get style() {
|
||||
get type() {
|
||||
assertEquals(1, getCount++);
|
||||
},
|
||||
get localeMatcher() {
|
||||
get style() {
|
||||
assertEquals(2, getCount++);
|
||||
},
|
||||
});
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
|
||||
var locales = ["tlh", "id", "en"];
|
||||
var referenceRelativeTimeFormat = new Intl.RelativeTimeFormat(locales);
|
||||
var referenceFormatted = referenceRelativeTimeFormat.format(3, "day");
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
|
||||
// RelativeTimeFormat constructor can't be called as function.
|
||||
assertThrows(() => Intl.RelativeTimeFormat('sr'), TypeError);
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format --harmony-locale
|
||||
// Environment Variables: LC_ALL=fr_CA
|
||||
assertEquals(
|
||||
'fr-CA',
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format --harmony-locale
|
||||
// Environment Variables: LC_ALL=pt_BR
|
||||
assertEquals(
|
||||
'pt-BR',
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
|
||||
// The following test are not part of the comformance. Just some output in
|
||||
// English to verify the format does return something reasonable for English.
|
||||
// It may be changed when we update the CLDR data.
|
||||
|
@ -96,14 +94,4 @@ assertEquals('second', parts[3].unit);
|
|||
assertEquals(3, Object.getOwnPropertyNames(parts[4]).length);
|
||||
assertEquals('decimal', parts[4].type);
|
||||
assertEquals('.', parts[4].value);
|
||||
assertEquals('second', parts[4].unit);
|
||||
// 5: "78"
|
||||
assertEquals(3, Object.getOwnPropertyNames(parts[4]).length);
|
||||
assertEquals('fraction', parts[5].type);
|
||||
assertEquals('78', parts[5].value);
|
||||
assertEquals('second', parts[5].unit);
|
||||
// 6: " seconds"
|
||||
assertEquals(2, Object.getOwnPropertyNames(parts[6]).length);
|
||||
assertEquals('literal', parts[6].type);
|
||||
assertEquals(' seconds', parts[6].value);
|
||||
assertEquals(undefined, parts[6].unit);
|
||||
assertEquals('second', pa
|
|
@ -1,28 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
|
||||
// Check plural w/ formatToParts
|
||||
// http://tc39.github.io/proposal-intl-relative-time/
|
||||
|
||||
let rtf = new Intl.RelativeTimeFormat();
|
||||
|
||||
// Test 1.4.4 Intl.RelativeTimeFormat.prototype.formatToParts( value, unit )
|
||||
function verifyElement(part, expectedUnit) {
|
||||
assertEquals(true, part.type == 'literal' || part.type == 'integer');
|
||||
assertEquals('string', typeof part.value);
|
||||
if (part.type == 'integer') {
|
||||
assertEquals('string', typeof part.unit);
|
||||
assertEquals(expectedUnit, part.unit);
|
||||
}
|
||||
};
|
||||
|
||||
['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'].forEach(
|
||||
function(unit) {
|
||||
rtf.formatToParts(100, unit + 's').forEach(
|
||||
function(part) {
|
||||
verifyElement(part, unit);
|
||||
});
|
||||
});
|
|
@ -1,82 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
|
||||
// Make sure that RelativeTimeFormat exposes all required properties. Those not specified
|
||||
// should have undefined value.
|
||||
// http://tc39.github.io/proposal-intl-relative-time/
|
||||
|
||||
let rtf = new Intl.RelativeTimeFormat();
|
||||
|
||||
// Test 1.4.4 Intl.RelativeTimeFormat.prototype.formatToParts( value, unit )
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'seconds')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'second')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'minutes')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'minute')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'hours')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'hour')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'days')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'day')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'weeks')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'week')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'months')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'month')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'quarters')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'quarter')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'years')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-1, 'year')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'seconds')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'second')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'minutes')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'minute')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'hours')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'hour')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'days')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'day')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'weeks')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'week')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'months')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'month')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'quarters')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'quarter')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'years')));
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(-0, 'year')));
|
||||
|
||||
assertThrows(() => rtf.formatToParts(-1, 'decades'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'decade'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'centuries'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'century'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'milliseconds'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'millisecond'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'microseconds'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'microsecond'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'nanoseconds'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(-1, 'nanosecond'), RangeError);
|
||||
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'seconds'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'second'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'minutes'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'minute'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'hours'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'hour'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'days'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'day'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'weeks'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'week'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'months'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'month'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'years'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'year'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'quarters'), RangeError);
|
||||
assertThrows(() => rtf.formatToParts(NaN, 'quarter'), RangeError);
|
||||
|
||||
assertEquals(true, Array.isArray(rtf.formatToParts(100, 'day')));
|
||||
rtf.formatToParts(100, 'day').forEach(function(part) {
|
||||
assertEquals(true, part.type == 'literal' || part.type == 'integer');
|
||||
assertEquals('string', typeof part.value);
|
||||
if (part.type == 'integer') {
|
||||
assertEquals('string', typeof part.unit);
|
||||
}
|
||||
});
|
|
@ -1,82 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
|
||||
// Make sure that RelativeTimeFormat exposes all required properties. Those not specified
|
||||
// should have undefined value.
|
||||
// http://tc39.github.io/proposal-intl-relative-time/
|
||||
|
||||
let rtf = new Intl.RelativeTimeFormat();
|
||||
|
||||
// Test 1.4.3 Intl.RelativeTimeFormat.prototype.format( value, unit )
|
||||
assertEquals('string', typeof rtf.format(-1, 'seconds'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'second'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'minutes'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'minute'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'hours'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'hour'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'days'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'day'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'weeks'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'week'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'months'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'month'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'years'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'year'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'quarter'));
|
||||
assertEquals('string', typeof rtf.format(-1, 'quarters'));
|
||||
|
||||
assertEquals('string', typeof rtf.format(-0, 'seconds'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'second'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'minutes'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'minute'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'hours'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'hour'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'days'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'day'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'weeks'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'week'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'months'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'month'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'years'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'year'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'quarter'));
|
||||
assertEquals('string', typeof rtf.format(-0, 'quarters'));
|
||||
|
||||
assertThrows(() => rtf.format(NaN, 'seconds'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'second'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'minutes'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'minute'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'hours'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'hour'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'days'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'day'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'weeks'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'week'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'months'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'month'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'years'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'year'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'quarters'), RangeError);
|
||||
assertThrows(() => rtf.format(NaN, 'quarter'), RangeError);
|
||||
|
||||
assertThrows(() => rtf.format(-1, 'decades'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'decade'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'centuries'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'century'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'milliseconds'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'millisecond'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'microseconds'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'microsecond'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'nanoseconds'), RangeError);
|
||||
assertThrows(() => rtf.format(-1, 'nanosecond'), RangeError);
|
||||
|
||||
assertEquals('string', typeof rtf.format(5, 'day'));
|
||||
assertEquals('string', typeof rtf.format('5', 'day'));
|
||||
assertEquals('string', typeof rtf.format('-5', 'day'));
|
||||
assertEquals('string', typeof rtf.format('534', 'day'));
|
||||
assertEquals('string', typeof rtf.format('-534', 'day'));
|
||||
|
||||
//assertThrows(() => rtf.format('xyz', 'day'), RangeError);
|
|
@ -1,164 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
|
||||
let rtf = new Intl.RelativeTimeFormat();
|
||||
// Test 1.4.5 Intl.RelativeTimeFormat.prototype.resolvedOptions ()
|
||||
// The default style is 'long'
|
||||
assertEquals('long', rtf.resolvedOptions().style);
|
||||
|
||||
// The default numeric is 'always'
|
||||
assertEquals('always', rtf.resolvedOptions().numeric);
|
||||
|
||||
// contains style, numeric and locale key
|
||||
assertEquals(4, Object.getOwnPropertyNames(rtf.resolvedOptions()).length);
|
||||
|
||||
// contains style, numeric and locale key
|
||||
assertEquals(
|
||||
4,
|
||||
Object.getOwnPropertyNames(
|
||||
new Intl.RelativeTimeFormat("en").resolvedOptions()
|
||||
).length
|
||||
);
|
||||
|
||||
assertEquals(
|
||||
'short',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'short'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'always',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'short'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'narrow',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'narrow'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'always',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'narrow'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'long',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'long'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'always',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'long'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'auto',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {numeric: 'auto'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'long',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {numeric: 'auto'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'always',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {numeric: 'always'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'long',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {numeric: 'always'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'long',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'auto'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'auto',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'auto'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'long',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'always'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'always',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'always'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'short',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'auto'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'auto',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'auto'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'short',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'always'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'always',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'always'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'narrow',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'auto'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'auto',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'auto'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'narrow',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'always'}))
|
||||
.resolvedOptions().style);
|
||||
|
||||
assertEquals(
|
||||
'always',
|
||||
(new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'always'}))
|
||||
.resolvedOptions().numeric);
|
||||
|
||||
assertEquals(
|
||||
'ar',
|
||||
(new Intl.RelativeTimeFormat(['ar'])).resolvedOptions().locale);
|
||||
|
||||
assertEquals(
|
||||
'ar',
|
||||
(new Intl.RelativeTimeFormat(['ar', 'en'])).resolvedOptions().locale);
|
||||
|
||||
assertEquals(
|
||||
'fr',
|
||||
(new Intl.RelativeTimeFormat(['fr', 'en'])).resolvedOptions().locale);
|
||||
|
||||
assertEquals(
|
||||
'ar',
|
||||
(new Intl.RelativeTimeFormat(['xyz', 'ar'])).resolvedOptions().locale);
|
||||
|
||||
{
|
||||
var receiver = 1;
|
||||
assertThrows(() =>
|
||||
Intl.RelativeTimeFormat.prototype.resolvedOptions.call(receiver), TypeError);
|
||||
|
||||
receiver = {};
|
||||
assertThrows(() =>
|
||||
Intl.RelativeTimeFormat.prototype.resolvedOptions.call(receiver), TypeError);
|
||||
}
|
||||
|
||||
assertEquals(
|
||||
'ar',
|
||||
(new Intl.RelativeTimeFormat(['i-default', 'ar'])).resolvedOptions().locale);
|
|
@ -1,19 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-relative-time-format
|
||||
assertEquals(typeof Intl.RelativeTimeFormat.supportedLocalesOf, "function",
|
||||
"Intl.RelativeTimeFormat.supportedLocalesOf should be a function");
|
||||
|
||||
var undef = Intl.RelativeTimeFormat.supportedLocalesOf();
|
||||
assertEquals([], undef);
|
||||
|
||||
var empty = Intl.RelativeTimeFormat.supportedLocalesOf([]);
|
||||
assertEquals([], empty);
|
||||
|
||||
var strLocale = Intl.RelativeTimeFormat.supportedLocalesOf('sr');
|
||||
assertEquals('sr', strLocale[0]);
|
||||
|
||||
var multiLocale = ['sr-Thai-RS', 'de', 'zh-CN'];
|
||||
assertEquals(multiLocale, Intl.RelativeTimeFormat.supportedLocalesOf(multiLocale));
|
|
@ -1,41 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
let invalid_lb = [
|
||||
"invalid",
|
||||
"abce",
|
||||
"breakall",
|
||||
"keepall",
|
||||
"none",
|
||||
"standard",
|
||||
];
|
||||
|
||||
let valid_lb= [
|
||||
"strict",
|
||||
"normal",
|
||||
"loose",
|
||||
];
|
||||
|
||||
let locales = [
|
||||
"en",
|
||||
"ja",
|
||||
"zh",
|
||||
];
|
||||
|
||||
invalid_lb.forEach(function(lb) {
|
||||
let df = new Intl.Segmenter(["en-u-lb-" + lb + "-fo-obar"]);
|
||||
assertEquals("en", df.resolvedOptions().locale);
|
||||
}
|
||||
);
|
||||
|
||||
valid_lb.forEach(function(lb) {
|
||||
locales.forEach(function(base) {
|
||||
let l = base + "-u-lb-" + lb;
|
||||
let df = new Intl.Segmenter([l + "-fo-obar"]);
|
||||
assertEquals(l, df.resolvedOptions().locale);
|
||||
});
|
||||
}
|
||||
);
|
|
@ -1,23 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
// Throws only once during construction.
|
||||
// Check for all getters to prevent regression.
|
||||
// Preserve the order of getter initialization.
|
||||
let getCount = 0;
|
||||
|
||||
new Intl.Segmenter(['en-US'], {
|
||||
get localeMatcher() {
|
||||
assertEquals(0, getCount++);
|
||||
},
|
||||
get lineBreakStyle() {
|
||||
assertEquals(1, getCount++);
|
||||
},
|
||||
get granularity() {
|
||||
assertEquals(2, getCount++);
|
||||
},
|
||||
});
|
||||
assertEquals(3, getCount);
|
|
@ -1,15 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
const text = "Hello World, Test 123! Foo Bar. How are you?";
|
||||
for (const granularity of ["grapheme", "word", "sentence", "line"]) {
|
||||
const segmenter = new Intl.Segmenter("en", { granularity });
|
||||
const iter = segmenter.segment(text);
|
||||
|
||||
assertEquals("number", typeof iter.index);
|
||||
assertEquals(0, iter.index);
|
||||
assertEquals(undefined, iter.breakType);
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
const seg = new Intl.Segmenter([], {granularity: "line"})
|
||||
for (const text of [
|
||||
"Hello world!", // English
|
||||
" Hello world! ", // English with space before/after
|
||||
" Hello world? Foo bar!", // English
|
||||
"Jedovatou mambu objevila žena v zahrádkářské kolonii.", // Czech
|
||||
"Việt Nam: Nhất thể hóa sẽ khác Trung Quốc?", // Vietnamese
|
||||
"Σοβαρές ενστάσεις Κομισιόν για τον προϋπολογισμό της Ιταλίας", // Greek
|
||||
"Решение Индии о покупке российских С-400 расценили как вызов США", // Russian
|
||||
"הרופא שהציל נשים והנערה ששועבדה ע", // Hebrew,
|
||||
"ترامب للملك سلمان: أنا جاد للغاية.. عليك دفع المزيد", // Arabic
|
||||
"भारत की एस 400 मिसाइल के मुकाबले पाक की थाड, जानें कौन कितना ताकतवर", // Hindi
|
||||
"ரெட் அலர்ட் எச்சரிக்கை; புதுச்சேரியில் நாளை அரசு விடுமுறை!", // Tamil
|
||||
"'ఉత్తర్వులు అందే వరకు ఓటర్ల తుది జాబితాను వెబ్సైట్లో పెట్టవద్దు'", // Telugu
|
||||
"台北》抹黑柯P失敗?朱學恒酸:姚文智氣pupu嗆大老闆", // Chinese
|
||||
"วัดไทรตีระฆังเบาลงช่วงเข้าพรรษา เจ้าอาวาสเผยคนร้องเรียนรับผลกรรมแล้ว", // Thai
|
||||
"九州北部の一部が暴風域に入りました(日直予報士 2018年10月06日) - 日本気象協会 tenki.jp", // Japanese
|
||||
"법원 “다스 지분 처분권·수익권 모두 MB가 보유”", // Korean
|
||||
]) {
|
||||
const iter = seg.segment(text);
|
||||
let prev = 0;
|
||||
let segments = [];
|
||||
while (!iter.following()) {
|
||||
assertTrue(["soft", "hard"].includes(iter.breakType), iter.breakType);
|
||||
assertTrue(iter.index >= 0);
|
||||
assertTrue(iter.index <= text.length);
|
||||
assertTrue(iter.index > prev);
|
||||
segments.push(text.substring(prev, iter.index));
|
||||
prev = iter.index;
|
||||
}
|
||||
assertEquals(text, segments.join(""));
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
const seg = new Intl.Segmenter([], {granularity: "line"})
|
||||
for (const text of [
|
||||
"Hello world!", // English
|
||||
" Hello world! ", // English with space before/after
|
||||
" Hello world? Foo bar!", // English
|
||||
"Jedovatou mambu objevila žena v zahrádkářské kolonii.", // Czech
|
||||
"Việt Nam: Nhất thể hóa sẽ khác Trung Quốc?", // Vietnamese
|
||||
"Σοβαρές ενστάσεις Κομισιόν για τον προϋπολογισμό της Ιταλίας", // Greek
|
||||
"Решение Индии о покупке российских С-400 расценили как вызов США", // Russian
|
||||
"הרופא שהציל נשים והנערה ששועבדה ע", // Hebrew,
|
||||
"ترامب للملك سلمان: أنا جاد للغاية.. عليك دفع المزيد", // Arabic
|
||||
"भारत की एस 400 मिसाइल के मुकाबले पाक की थाड, जानें कौन कितना ताकतवर", // Hindi
|
||||
"ரெட் அலர்ட் எச்சரிக்கை; புதுச்சேரியில் நாளை அரசு விடுமுறை!", // Tamil
|
||||
"'ఉత్తర్వులు అందే వరకు ఓటర్ల తుది జాబితాను వెబ్సైట్లో పెట్టవద్దు'", // Telugu
|
||||
"台北》抹黑柯P失敗?朱學恒酸:姚文智氣pupu嗆大老闆", // Chinese
|
||||
"วัดไทรตีระฆังเบาลงช่วงเข้าพรรษา เจ้าอาวาสเผยคนร้องเรียนรับผลกรรมแล้ว", // Thai
|
||||
"九州北部の一部が暴風域に入りました(日直予報士 2018年10月06日) - 日本気象協会 tenki.jp", // Japanese
|
||||
"법원 “다스 지분 처분권·수익권 모두 MB가 보유”", // Korean
|
||||
]) {
|
||||
let segments = [];
|
||||
// Create another %SegmentIterator% to compare with result from the one that
|
||||
// created in the for of loop.
|
||||
let iter = seg.segment(text);
|
||||
let prev = 0;
|
||||
for (const v of seg.segment(text)) {
|
||||
assertTrue(["soft", "hard"].includes(v.breakType), v.breakType);
|
||||
assertEquals("string", typeof v.segment);
|
||||
assertTrue(v.segment.length > 0);
|
||||
segments.push(v.segment);
|
||||
|
||||
// manually advance the iter.
|
||||
assertFalse(iter.following());
|
||||
assertEquals(iter.breakType, v.breakType);
|
||||
assertEquals(text.substring(prev, iter.index), v.segment);
|
||||
prev = iter.index;
|
||||
}
|
||||
assertTrue(iter.following());
|
||||
assertEquals(text, segments.join(''));
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
const seg = new Intl.Segmenter([], {granularity: "line"})
|
||||
for (const text of [
|
||||
"Hello world!", // English
|
||||
" Hello world! ", // English with space before/after
|
||||
" Hello world? Foo bar!", // English
|
||||
"Jedovatou mambu objevila žena v zahrádkářské kolonii.", // Czech
|
||||
"Việt Nam: Nhất thể hóa sẽ khác Trung Quốc?", // Vietnamese
|
||||
"Σοβαρές ενστάσεις Κομισιόν για τον προϋπολογισμό της Ιταλίας", // Greek
|
||||
"Решение Индии о покупке российских С-400 расценили как вызов США", // Russian
|
||||
"הרופא שהציל נשים והנערה ששועבדה ע", // Hebrew,
|
||||
"ترامب للملك سلمان: أنا جاد للغاية.. عليك دفع المزيد", // Arabic
|
||||
"भारत की एस 400 मिसाइल के मुकाबले पाक की थाड, जानें कौन कितना ताकतवर", // Hindi
|
||||
"ரெட் அலர்ட் எச்சரிக்கை; புதுச்சேரியில் நாளை அரசு விடுமுறை!", // Tamil
|
||||
"'ఉత్తర్వులు అందే వరకు ఓటర్ల తుది జాబితాను వెబ్సైట్లో పెట్టవద్దు'", // Telugu
|
||||
"台北》抹黑柯P失敗?朱學恒酸:姚文智氣pupu嗆大老闆", // Chinese
|
||||
"วัดไทรตีระฆังเบาลงช่วงเข้าพรรษา เจ้าอาวาสเผยคนร้องเรียนรับผลกรรมแล้ว", // Thai
|
||||
"九州北部の一部が暴風域に入りました(日直予報士 2018年10月06日) - 日本気象協会 tenki.jp", // Japanese
|
||||
"법원 “다스 지분 처분권·수익권 모두 MB가 보유”", // Korean
|
||||
]) {
|
||||
const iter = seg.segment(text);
|
||||
let segments = [];
|
||||
let oldPos = -1;
|
||||
for (let result = iter.next(); !result.done; result = iter.next()) {
|
||||
const v = result.value;
|
||||
assertTrue(["soft", "hard"].includes(iter.breakType), iter.breakType);
|
||||
assertEquals("string", typeof v.segment);
|
||||
assertTrue(v.segment.length > 0);
|
||||
segments.push(v.segment);
|
||||
assertEquals("number", typeof v.index);
|
||||
assertTrue(oldPos < v.index);
|
||||
oldPos = v.index;
|
||||
}
|
||||
assertEquals(text, segments.join(''));
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
const seg = new Intl.Segmenter([], {granularity: "line"})
|
||||
for (const text of [
|
||||
"Hello world!", // English
|
||||
" Hello world! ", // English with space before/after
|
||||
" Hello world? Foo bar!", // English
|
||||
"Jedovatou mambu objevila žena v zahrádkářské kolonii.", // Czech
|
||||
"Việt Nam: Nhất thể hóa sẽ khác Trung Quốc?", // Vietnamese
|
||||
"Σοβαρές ενστάσεις Κομισιόν για τον προϋπολογισμό της Ιταλίας", // Greek
|
||||
"Решение Индии о покупке российских С-400 расценили как вызов США", // Russian
|
||||
"הרופא שהציל נשים והנערה ששועבדה ע", // Hebrew,
|
||||
"ترامب للملك سلمان: أنا جاد للغاية.. عليك دفع المزيد", // Arabic
|
||||
"भारत की एस 400 मिसाइल के मुकाबले पाक की थाड, जानें कौन कितना ताकतवर", // Hindi
|
||||
"ரெட் அலர்ட் எச்சரிக்கை; புதுச்சேரியில் நாளை அரசு விடுமுறை!", // Tamil
|
||||
"'ఉత్తర్వులు అందే వరకు ఓటర్ల తుది జాబితాను వెబ్సైట్లో పెట్టవద్దు'", // Telugu
|
||||
"台北》抹黑柯P失敗?朱學恒酸:姚文智氣pupu嗆大老闆", // Chinese
|
||||
"วัดไทรตีระฆังเบาลงช่วงเข้าพรรษา เจ้าอาวาสเผยคนร้องเรียนรับผลกรรมแล้ว", // Thai
|
||||
"九州北部の一部が暴風域に入りました(日直予報士 2018年10月06日) - 日本気象協会 tenki.jp", // Japanese
|
||||
"법원 “다스 지분 처분권·수익권 모두 MB가 보유”", // Korean
|
||||
]) {
|
||||
const iter = seg.segment(text);
|
||||
let prev = text.length;
|
||||
let segments = [];
|
||||
iter.preceding(prev)
|
||||
assertTrue(["soft", "hard"].includes(iter.breakType), iter.breakType);
|
||||
assertTrue(iter.index >= 0);
|
||||
assertTrue(iter.index < prev);
|
||||
segments.push(text.substring(iter.index, prev));
|
||||
prev = iter.index;
|
||||
while (!iter.preceding()) {
|
||||
assertTrue(["soft", "hard"].includes(iter.breakType), iter.breakType);
|
||||
assertTrue(iter.index >= 0);
|
||||
assertTrue(iter.index <= text.length);
|
||||
assertTrue(iter.index < prev);
|
||||
segments.push(text.substring(iter.index, prev));
|
||||
prev = iter.index;
|
||||
}
|
||||
assertEquals(text, segments.reverse().join(""));
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-intl-segmenter
|
||||
|
||||
const seg = new Intl.Segmenter([], {granularity: "line"})
|
||||
for (const text of [
|
||||
"Hello world!", // English
|
||||
" Hello world! ", // English with space before/after
|
||||
" Hello world? Foo bar!", // English
|
||||
"Jedovatou mambu objevila žena v zahrádkářské kolonii.", // Czech
|
||||
"Việt Nam: Nhất thể hóa sẽ khác Trung Quốc?", // Vietnamese
|
||||
"Σοβαρές ενστάσεις Κομισιόν για τον προϋπολογισμό της Ιταλίας", // Greek
|
||||
"Решение Индии о покупке российских С-400 расценили как вызов США", // Russian
|
||||
"הרופא שהציל נשים והנערה ששועבדה ע", // Hebrew,
|
||||
"ترامب للملك سلمان: أنا جاد للغاية.. عليك دفع المزيد", // Arabic
|
||||
"भारत की एस 400 मिसाइल के मुकाबले पाक की थाड, जानें कौन कितना ताकतवर", // Hindi
|
||||
"ரெட் அலர்ட் எச்சரிக்கை; புதுச்சேரியில் நாளை அரசு விடுமுறை!", // Tamil
|
||||
"'ఉత్తర్వులు అందే వరకు ఓటర్ల తుది జాబితాను వెబ్సైట్లో పెట్టవద్దు'", // Telugu
|
||||
"台北》抹黑柯P失敗?朱學恒酸:姚文智氣pupu嗆大老闆", // Chinese
|
||||
"วัดไทรตีระฆังเบาลงช่วงเข้าพรรษา เจ้าอาวาสเผยคนร้องเรียนรับผลกรรมแล้ว", // Thai
|
||||
"九州北部の一部が暴風域に入りました(日直予報士 2018年10月06日) - 日本気象協会 tenki.jp", // Japanese
|
||||
"법원 “다스 지분 처분권·수익권 모두 MB가 보유”", // Korean
|
||||
]) {
|
||||
const iter = seg.segment(text);
|
||||
assertEquals(undefined, iter.breakType);
|
||||
assertEquals(0, iter.index);
|
||||
}
|
|
@ -1,194 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
function checkIsRedeclarationError(code) {
|
||||
try {
|
||||
eval(`
|
||||
checkIsRedeclarationError : {
|
||||
break checkIsRedeclarationError;
|
||||
${code}
|
||||
}
|
||||
`);
|
||||
assertUnreachable();
|
||||
} catch(e) {
|
||||
assertInstanceof(e, SyntaxError );
|
||||
assertTrue( e.toString().indexOf("has already been declared") >= 0 );
|
||||
}
|
||||
}
|
||||
|
||||
function checkIsNotRedeclarationError(code) {
|
||||
assertDoesNotThrow(()=>eval(`
|
||||
checkIsNotRedeclarationError_label : {
|
||||
break checkIsNotRedeclarationError_label;
|
||||
${code}
|
||||
}
|
||||
`));
|
||||
}
|
||||
|
||||
|
||||
let var_e = [
|
||||
'var e',
|
||||
'var {e}',
|
||||
'var {f, e}',
|
||||
'var [e]',
|
||||
'var {f:e}',
|
||||
'var [[[], e]]'
|
||||
];
|
||||
|
||||
let not_var_e = [
|
||||
'var f',
|
||||
'var {}',
|
||||
'var {e:f}',
|
||||
'e',
|
||||
'{e}',
|
||||
'let e',
|
||||
'const e',
|
||||
'let {e}',
|
||||
'const {e}',
|
||||
'let [e]',
|
||||
'const [e]',
|
||||
'let {f:e}',
|
||||
'const {f:e}'
|
||||
];
|
||||
|
||||
// Check that `for (var ... of ...)` cannot redeclare a simple catch variable
|
||||
// but `for (var ... in ...)` can.
|
||||
for (let binding of var_e) {
|
||||
checkIsRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch(e) {
|
||||
for (${binding} of []);
|
||||
}
|
||||
`);
|
||||
|
||||
checkIsNotRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch(e) {
|
||||
for (${binding} in []);
|
||||
}
|
||||
`);
|
||||
}
|
||||
|
||||
// Check that the above error occurs even for nested catches.
|
||||
for (let binding of var_e) {
|
||||
checkIsRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch(e) {
|
||||
try {
|
||||
throw 1;
|
||||
} catch(f) {
|
||||
try {
|
||||
throw 2;
|
||||
} catch({}) {
|
||||
for (${binding} of []);
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
checkIsNotRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch(e) {
|
||||
try {
|
||||
throw 1;
|
||||
} catch(f) {
|
||||
try {
|
||||
throw 2;
|
||||
} catch({}) {
|
||||
for (${binding} in []);
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
}
|
||||
|
||||
// Check that the above error does not occur if a declaration scope is between
|
||||
// the catch and the loop.
|
||||
for (let binding of var_e) {
|
||||
checkIsNotRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch(e) {
|
||||
(()=>{for (${binding} of []);})();
|
||||
}
|
||||
`);
|
||||
|
||||
checkIsNotRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch(e) {
|
||||
(function(){for (${binding} of []);})();
|
||||
}
|
||||
`);
|
||||
}
|
||||
|
||||
// Check that there is no error when not declaring a var named e.
|
||||
for (let binding of not_var_e) {
|
||||
checkIsNotRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch(e) {
|
||||
for (${binding} of []);
|
||||
}
|
||||
`);
|
||||
}
|
||||
|
||||
// Check that there is an error for both for-in and for-of when redeclaring
|
||||
// a non-simple catch parameter
|
||||
for (let binding of var_e) {
|
||||
checkIsRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch({e}) {
|
||||
for (${binding} of []);
|
||||
}
|
||||
`);
|
||||
|
||||
checkIsRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch({e}) {
|
||||
for (${binding} in []);
|
||||
}
|
||||
`);
|
||||
}
|
||||
|
||||
// Check that the above error occurs even for nested catches.
|
||||
for (let binding of var_e) {
|
||||
checkIsRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch({e}) {
|
||||
try {
|
||||
throw 1;
|
||||
} catch(f) {
|
||||
try {
|
||||
throw 2;
|
||||
} catch({}) {
|
||||
for (${binding} of []);
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
checkIsRedeclarationError(`
|
||||
try {
|
||||
throw 0;
|
||||
} catch({e}) {
|
||||
try {
|
||||
throw 1;
|
||||
} catch(f) {
|
||||
try {
|
||||
throw 2;
|
||||
} catch({}) {
|
||||
for (${binding} in []);
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
// Copyright 2015 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
var target = {
|
||||
"target_one": 1
|
||||
};
|
||||
target.__proto__ = {
|
||||
"target_proto_two": 2
|
||||
};
|
||||
var handler = {
|
||||
ownKeys: function(target) {
|
||||
return ["foo", "bar"];
|
||||
}
|
||||
}
|
||||
|
||||
var proxy = new Proxy(target, handler);
|
||||
|
||||
// Simple case.
|
||||
assertEquals(["foo", "bar"], Reflect.ownKeys(proxy));
|
||||
|
||||
// Test interesting steps of the algorithm:
|
||||
|
||||
// Step 6: Fall through to target.[[OwnPropertyKeys]] if the trap is undefined.
|
||||
handler.ownKeys = undefined;
|
||||
assertEquals(["target_one"], Reflect.ownKeys(proxy));
|
||||
|
||||
// Step 7: Throwing traps don't crash.
|
||||
handler.ownKeys = function(target) { throw 1; };
|
||||
assertThrows("Reflect.ownKeys(proxy)");
|
||||
|
||||
// Step 8: CreateListFromArrayLike error cases:
|
||||
// Returning a non-Object throws.
|
||||
var keys = 1;
|
||||
handler.ownKeys = function(target) { return keys; };
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = "string";
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = Symbol("foo");
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = null;
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
|
||||
// "length" property is honored.
|
||||
keys = { 0: "a", 1: "b", 2: "c" };
|
||||
keys.length = 0;
|
||||
assertEquals([], Reflect.ownKeys(proxy));
|
||||
keys.length = 1;
|
||||
assertEquals(["a"], Reflect.ownKeys(proxy));
|
||||
keys.length = 3;
|
||||
assertEquals(["a", "b", "c"], Reflect.ownKeys(proxy));
|
||||
// The spec wants to allow lengths up to 2^53, but we can't allocate arrays
|
||||
// of that size, so we throw even for smaller values.
|
||||
keys.length = Math.pow(2, 33);
|
||||
assertThrows("Reflect.ownKeys(proxy)", RangeError);
|
||||
|
||||
// Check that we allow duplicated keys.
|
||||
keys = ['a', 'a', 'a']
|
||||
assertEquals(keys, Reflect.ownKeys(proxy));
|
||||
|
||||
// Non-Name results throw.
|
||||
keys = [1];
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = [{}];
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = [{toString: function() { return "foo"; }}];
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = [null];
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
|
||||
// Step 17a: The trap result must include all non-configurable keys.
|
||||
Object.defineProperty(target, "nonconf", {value: 1, configurable: false});
|
||||
keys = ["foo"];
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = ["nonconf"];
|
||||
assertEquals(keys, Reflect.ownKeys(proxy));
|
||||
|
||||
// Check that we allow duplicated keys.
|
||||
keys = ['nonconf', 'nonconf', 'nonconf']
|
||||
assertEquals(keys, Reflect.ownKeys(proxy));
|
||||
|
||||
// Step 19a: The trap result must all keys of a non-extensible target.
|
||||
Object.preventExtensions(target);
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
keys = ["nonconf", "target_one"];
|
||||
assertEquals(keys, Reflect.ownKeys(proxy));
|
||||
|
||||
// Step 20: The trap result must not add keys to a non-extensible target.
|
||||
keys = ["nonconf", "target_one", "fantasy"];
|
||||
assertThrows("Reflect.ownKeys(proxy)", TypeError);
|
||||
|
||||
// Check that we allow duplicated keys.
|
||||
keys = ['nonconf', 'target_one', 'nonconf', 'nonconf', 'target_one',]
|
||||
assertEquals(keys, Reflect.ownKeys(proxy));
|
|
@ -1,126 +0,0 @@
|
|||
// Copyright 2015 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax
|
||||
|
||||
var typedArrayConstructors = [
|
||||
Uint8Array,
|
||||
Int8Array,
|
||||
Uint16Array,
|
||||
Int16Array,
|
||||
Uint32Array,
|
||||
Int32Array,
|
||||
Uint8ClampedArray,
|
||||
Float32Array,
|
||||
Float64Array
|
||||
];
|
||||
|
||||
function assertArrayLikeEquals(value, expected, type) {
|
||||
assertEquals(value.__proto__, type.prototype);
|
||||
// Don't test value.length because we mess with that;
|
||||
// instead in certain callsites we check that length
|
||||
// is set appropriately.
|
||||
for (var i = 0; i < expected.length; ++i) {
|
||||
// Use Object.is to differentiate between +-0
|
||||
assertSame(expected[i], value[i]);
|
||||
}
|
||||
}
|
||||
|
||||
for (var constructor of typedArrayConstructors) {
|
||||
// Test default numerical sorting order
|
||||
var a = new constructor([100, 7, 45])
|
||||
assertEquals(a.sort(), a);
|
||||
assertArrayLikeEquals(a, [7, 45, 100], constructor);
|
||||
assertEquals(a.length, 3);
|
||||
|
||||
// For arrays of floats, certain handling of +-0/NaN
|
||||
if (constructor === Float32Array || constructor === Float64Array) {
|
||||
var b = new constructor([+0, -0, NaN, -0, NaN, +0])
|
||||
b.sort();
|
||||
assertArrayLikeEquals(b, [-0, -0, +0, +0, NaN, NaN], constructor);
|
||||
assertEquals(b.length, 6);
|
||||
}
|
||||
|
||||
// Custom sort--backwards
|
||||
a.sort(function(x, y) { return y - x; });
|
||||
assertArrayLikeEquals(a, [100, 45, 7], constructor);
|
||||
|
||||
// Basic TypedArray method properties:
|
||||
// Length field is ignored
|
||||
Object.defineProperty(a, 'length', {value: 1});
|
||||
assertEquals(a.sort(), a);
|
||||
assertArrayLikeEquals(a, [7, 45, 100], constructor);
|
||||
assertEquals(a.length, 1);
|
||||
// Method doesn't work on other objects
|
||||
assertThrows(function() { a.sort.call([]); }, TypeError);
|
||||
|
||||
// Do not touch elements out of byte offset
|
||||
var buf = new ArrayBuffer(constructor.BYTES_PER_ELEMENT * 3);
|
||||
var a = new constructor(buf, constructor.BYTES_PER_ELEMENT);
|
||||
var b = new constructor(buf);
|
||||
b[0] = 3; b[1] = 2; b[2] = 1;
|
||||
a.sort();
|
||||
assertArrayLikeEquals(a, [1, 2], constructor);
|
||||
|
||||
// Detached Operation
|
||||
var array = new constructor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
||||
%ArrayBufferDetach(array.buffer);
|
||||
assertThrows(() => array.sort(), TypeError);
|
||||
}
|
||||
|
||||
// The following creates a test for each typed element kind, where the array
|
||||
// to sort consists of some max/min/zero elements.
|
||||
//
|
||||
// When providing a custom compare function, the torque version of
|
||||
// TypedArray.p.sort needs to convert array elements to "Number"/"BigInt"
|
||||
// and back. The following test checks the edge cases for that conversion.
|
||||
|
||||
let constructorsWithArrays = [
|
||||
{ctor: Uint8Array, array: [255, 254, 4, 3, 2, 1, 0]},
|
||||
{ctor: Int8Array, array: [127, 126, 1, 0, -1, -127, -128]},
|
||||
{ctor: Uint16Array, array: [2 ** 16 - 1, 2 ** 16 - 2, 4, 3, 2, 1, 0]},
|
||||
{
|
||||
ctor: Int16Array,
|
||||
array: [2 ** 15 - 1, 2 ** 15 - 2, 1, 0, -1, -(2 ** 15 - 1), -(2 ** 15)]
|
||||
},
|
||||
{ctor: Uint32Array, array: [2 ** 32 - 1, 2 ** 32 - 2, 4, 3, 2, 1, 0]},
|
||||
{
|
||||
ctor: Int32Array,
|
||||
array: [2 ** 31 - 1, 2 ** 31 - 2, 1, 0, -1, -(2 ** 31 - 1), -(2 ** 31)]
|
||||
},
|
||||
{
|
||||
ctor: Float32Array,
|
||||
array: [2 ** 24, 2 ** 24 - 1, 1, 0,-1, -(2 ** 24 - 1), -(2 ** 24)]
|
||||
},
|
||||
{
|
||||
ctor: Float64Array,
|
||||
array: [2 ** 53, 2 ** 53 - 1, 1, 0, -1, -(2 ** 53 - 1), -(2 ** 53)]
|
||||
},
|
||||
{ctor: Uint8ClampedArray, array: [255, 254, 4, 3, 2, 1, 0]},
|
||||
{
|
||||
ctor: BigUint64Array,
|
||||
array: [2n ** 64n - 1n, 2n ** 64n - 2n, 4n, 3n, 2n, 1n, 0n]
|
||||
},
|
||||
{
|
||||
ctor: BigInt64Array,
|
||||
array: [2n ** 63n - 1n, 2n ** 63n - 2n, 1n, 0n,
|
||||
-1n, -(2n ** 63n - 1n), -(2n ** 63n)]
|
||||
}
|
||||
];
|
||||
|
||||
// Compare function needs to return a Number in all cases, and not a BigInt.
|
||||
// Hence we can not simply return "a - b".
|
||||
function cmpfn(a, b) {
|
||||
if (a < b) return -1;
|
||||
if (b < a) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (let constructor of constructorsWithArrays) {
|
||||
let array = new constructor.ctor(constructor.array);
|
||||
|
||||
assertEquals(array.sort(cmpfn), array);
|
||||
assertArrayLikeEquals(array, constructor.array.reverse(), constructor.ctor);
|
||||
assertEquals(array.length, constructor.array.length);
|
||||
}
|
|
@ -1,234 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax
|
||||
|
||||
function DataDescriptor(value) {
|
||||
return { "enumerable": true, "configurable": true, "writable": true, value };
|
||||
}
|
||||
|
||||
|
||||
function TestMeta() {
|
||||
assertEquals(1, Object.getOwnPropertyDescriptors.length);
|
||||
assertEquals(Function.prototype,
|
||||
Object.getPrototypeOf(Object.getOwnPropertyDescriptors));
|
||||
assertEquals(
|
||||
'getOwnPropertyDescriptors', Object.getOwnPropertyDescriptors.name);
|
||||
var desc = Reflect.getOwnPropertyDescriptor(
|
||||
Object, 'getOwnPropertyDescriptors');
|
||||
assertFalse(desc.enumerable);
|
||||
assertTrue(desc.writable);
|
||||
assertTrue(desc.configurable);
|
||||
}
|
||||
TestMeta();
|
||||
|
||||
|
||||
function TestToObject() {
|
||||
assertThrows(function() {
|
||||
Object.getOwnPropertyDescriptors(null);
|
||||
}, TypeError);
|
||||
|
||||
assertThrows(function() {
|
||||
Object.getOwnPropertyDescriptors(undefined);
|
||||
}, TypeError);
|
||||
|
||||
assertThrows(function() {
|
||||
Object.getOwnPropertyDescriptors();
|
||||
}, TypeError);
|
||||
}
|
||||
TestToObject();
|
||||
|
||||
|
||||
function TestPrototypeProperties() {
|
||||
function F() {};
|
||||
F.prototype.a = "A";
|
||||
F.prototype.b = "B";
|
||||
|
||||
var F2 = new F();
|
||||
Object.defineProperties(F2, {
|
||||
"b": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "Shadowed 'B'"
|
||||
},
|
||||
"c": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "C"
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals({
|
||||
"b": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "Shadowed 'B'"
|
||||
},
|
||||
"c": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "C"
|
||||
}
|
||||
}, Object.getOwnPropertyDescriptors(F2));
|
||||
}
|
||||
TestPrototypeProperties();
|
||||
|
||||
|
||||
function TestPrototypeProperties() {
|
||||
function F() {};
|
||||
F.prototype.a = "A";
|
||||
F.prototype.b = "B";
|
||||
|
||||
var F2 = new F();
|
||||
Object.defineProperties(F2, {
|
||||
"b": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "Shadowed 'B'"
|
||||
},
|
||||
"c": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "C"
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals({
|
||||
"b": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "Shadowed 'B'"
|
||||
},
|
||||
"c": {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "C"
|
||||
}
|
||||
}, Object.getOwnPropertyDescriptors(F2));
|
||||
}
|
||||
TestPrototypeProperties();
|
||||
|
||||
|
||||
function TestTypeFilteringAndOrder() {
|
||||
var log = [];
|
||||
var sym = Symbol("foo");
|
||||
var psym = %CreatePrivateSymbol("private");
|
||||
var O = {
|
||||
0: 0,
|
||||
[sym]: 3,
|
||||
"a": 2,
|
||||
[psym]: 4,
|
||||
1: 1,
|
||||
};
|
||||
var P = new Proxy(O, {
|
||||
ownKeys(target) {
|
||||
log.push("ownKeys()");
|
||||
return Reflect.ownKeys(target);
|
||||
},
|
||||
getOwnPropertyDescriptor(target, name) {
|
||||
log.push(`getOwnPropertyDescriptor(${String(name)})`);
|
||||
return Reflect.getOwnPropertyDescriptor(target, name);
|
||||
},
|
||||
get(target, name) { assertUnreachable(); },
|
||||
set(target, name, value) { assertUnreachable(); },
|
||||
deleteProperty(target, name) { assertUnreachable(); },
|
||||
defineProperty(target, name, desc) { assertUnreachable(); }
|
||||
});
|
||||
|
||||
var result1 = Object.getOwnPropertyDescriptors(O);
|
||||
assertEquals({
|
||||
0: DataDescriptor(0),
|
||||
1: DataDescriptor(1),
|
||||
"a": DataDescriptor(2),
|
||||
[sym]: DataDescriptor(3)
|
||||
}, result1);
|
||||
|
||||
var result2 = Object.getOwnPropertyDescriptors(P);
|
||||
assertEquals([
|
||||
"ownKeys()",
|
||||
"getOwnPropertyDescriptor(0)",
|
||||
"getOwnPropertyDescriptor(1)",
|
||||
"getOwnPropertyDescriptor(a)",
|
||||
"getOwnPropertyDescriptor(Symbol(foo))"
|
||||
], log);
|
||||
assertEquals({
|
||||
0: DataDescriptor(0),
|
||||
1: DataDescriptor(1),
|
||||
"a": DataDescriptor(2),
|
||||
[sym]: DataDescriptor(3)
|
||||
}, result2);
|
||||
}
|
||||
TestTypeFilteringAndOrder();
|
||||
|
||||
|
||||
function TestDuplicateKeys() {
|
||||
var i = 0;
|
||||
var log = [];
|
||||
var P = new Proxy({}, {
|
||||
ownKeys() {
|
||||
log.push(`ownKeys()`);
|
||||
return ["A", "A"];
|
||||
},
|
||||
getOwnPropertyDescriptor(t, name) {
|
||||
log.push(`getOwnPropertyDescriptor(${name})`);
|
||||
if (i++) return;
|
||||
return {
|
||||
configurable: true,
|
||||
writable: false,
|
||||
value: "VALUE"
|
||||
};
|
||||
},
|
||||
get(target, name) { assertUnreachable(); },
|
||||
set(target, name, value) { assertUnreachable(); },
|
||||
deleteProperty(target, name) { assertUnreachable(); },
|
||||
defineProperty(target, name, desc) { assertUnreachable(); }
|
||||
});
|
||||
|
||||
var result = Object.getOwnPropertyDescriptors(P);
|
||||
assertEquals({
|
||||
"A": {
|
||||
"value": "VALUE",
|
||||
"writable": false,
|
||||
"enumerable": false,
|
||||
"configurable": true
|
||||
}
|
||||
}, result);
|
||||
assertTrue(result.hasOwnProperty("A"));
|
||||
assertEquals([
|
||||
"ownKeys()",
|
||||
"getOwnPropertyDescriptor(A)",
|
||||
"getOwnPropertyDescriptor(A)"
|
||||
], log);
|
||||
}
|
||||
TestDuplicateKeys();
|
||||
|
||||
function TestFakeProperty() {
|
||||
var log = [];
|
||||
var P = new Proxy({}, {
|
||||
ownKeys() {
|
||||
log.push(`ownKeys()`);
|
||||
return ["fakeProperty"];
|
||||
},
|
||||
getOwnPropertyDescriptor(target, name) {
|
||||
log.push(`getOwnPropertyDescriptor(${name})`);
|
||||
return;
|
||||
}
|
||||
});
|
||||
var result = Object.getOwnPropertyDescriptors(P);
|
||||
assertEquals({}, result);
|
||||
assertFalse(result.hasOwnProperty("fakeProperty"));
|
||||
assertEquals([
|
||||
"ownKeys()",
|
||||
"getOwnPropertyDescriptor(fakeProperty)"
|
||||
], log);
|
||||
}
|
||||
TestFakeProperty();
|
|
@ -1,291 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax
|
||||
|
||||
function TestMeta() {
|
||||
assertEquals(1, Object.values.length);
|
||||
assertEquals(Function.prototype, Object.getPrototypeOf(Object.values));
|
||||
assertEquals("values", Object.values.name);
|
||||
|
||||
var descriptor = Object.getOwnPropertyDescriptor(Object, "values");
|
||||
assertTrue(descriptor.writable);
|
||||
assertFalse(descriptor.enumerable);
|
||||
assertTrue(descriptor.configurable);
|
||||
|
||||
assertThrows(() => new Object.values({}), TypeError);
|
||||
}
|
||||
TestMeta();
|
||||
|
||||
|
||||
function TestBasic() {
|
||||
var x = 16;
|
||||
var O = {
|
||||
d: 1,
|
||||
c: 3,
|
||||
[Symbol.iterator]: void 0,
|
||||
0: 123,
|
||||
1000: 456,
|
||||
[x * x]: "ducks",
|
||||
[`0x${(x * x).toString(16)}`]: "quack"
|
||||
};
|
||||
O.a = 2;
|
||||
O.b = 4;
|
||||
Object.defineProperty(O, "HIDDEN", { enumerable: false, value: NaN });
|
||||
assertEquals([123, "ducks", 456, 1, 3, "quack", 2, 4], Object.values(O));
|
||||
assertEquals(Object.values(O), Object.keys(O).map(key => O[key]));
|
||||
|
||||
assertTrue(Array.isArray(Object.values({})));
|
||||
assertEquals(0, Object.values({}).length);
|
||||
}
|
||||
TestBasic();
|
||||
|
||||
|
||||
function TestToObject() {
|
||||
assertThrows(function() { Object.values(); }, TypeError);
|
||||
assertThrows(function() { Object.values(null); }, TypeError);
|
||||
assertThrows(function() { Object.values(void 0); }, TypeError);
|
||||
}
|
||||
TestToObject();
|
||||
|
||||
|
||||
function TestOrder() {
|
||||
var O = {
|
||||
a: 1,
|
||||
[Symbol.iterator]: null
|
||||
};
|
||||
O[456] = 123;
|
||||
Object.defineProperty(O, "HIDDEN", { enumerable: false, value: NaN });
|
||||
var priv = %CreatePrivateSymbol("Secret");
|
||||
O[priv] = 56;
|
||||
|
||||
var log = [];
|
||||
var P = new Proxy(O, {
|
||||
ownKeys(target) {
|
||||
log.push("[[OwnPropertyKeys]]");
|
||||
return Reflect.ownKeys(target);
|
||||
},
|
||||
get(target, name) {
|
||||
log.push(`[[Get]](${JSON.stringify(name)})`);
|
||||
return Reflect.get(target, name);
|
||||
},
|
||||
getOwnPropertyDescriptor(target, name) {
|
||||
log.push(`[[GetOwnProperty]](${JSON.stringify(name)})`);
|
||||
return Reflect.getOwnPropertyDescriptor(target, name);
|
||||
},
|
||||
set(target, name, value) {
|
||||
assertUnreachable();
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals([123, 1], Object.values(P));
|
||||
assertEquals([
|
||||
"[[OwnPropertyKeys]]",
|
||||
"[[GetOwnProperty]](\"456\")",
|
||||
"[[Get]](\"456\")",
|
||||
"[[GetOwnProperty]](\"a\")",
|
||||
"[[Get]](\"a\")",
|
||||
"[[GetOwnProperty]](\"HIDDEN\")"
|
||||
], log);
|
||||
}
|
||||
TestOrder();
|
||||
|
||||
|
||||
function TestOrderWithDuplicates() {
|
||||
var O = {
|
||||
a: 1,
|
||||
[Symbol.iterator]: null
|
||||
};
|
||||
O[456] = 123;
|
||||
Object.defineProperty(O, "HIDDEN", { enumerable: false, value: NaN });
|
||||
O[priv] = 56;
|
||||
var priv = %CreatePrivateSymbol("private");
|
||||
|
||||
var log = [];
|
||||
var P = new Proxy(O, {
|
||||
ownKeys(target) {
|
||||
log.push("[[OwnPropertyKeys]]");
|
||||
return [ "a", Symbol.iterator, "a", "456", "HIDDEN", "HIDDEN", "456" ];
|
||||
},
|
||||
get(target, name) {
|
||||
log.push(`[[Get]](${JSON.stringify(name)})`);
|
||||
return Reflect.get(target, name);
|
||||
},
|
||||
getOwnPropertyDescriptor(target, name) {
|
||||
log.push(`[[GetOwnProperty]](${JSON.stringify(name)})`);
|
||||
return Reflect.getOwnPropertyDescriptor(target, name);
|
||||
},
|
||||
set(target, name, value) {
|
||||
assertUnreachable();
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals([1, 1, 123, 123], Object.values(P));
|
||||
assertEquals([
|
||||
"[[OwnPropertyKeys]]",
|
||||
"[[GetOwnProperty]](\"a\")",
|
||||
"[[Get]](\"a\")",
|
||||
"[[GetOwnProperty]](\"a\")",
|
||||
"[[Get]](\"a\")",
|
||||
"[[GetOwnProperty]](\"456\")",
|
||||
"[[Get]](\"456\")",
|
||||
"[[GetOwnProperty]](\"HIDDEN\")",
|
||||
"[[GetOwnProperty]](\"HIDDEN\")",
|
||||
"[[GetOwnProperty]](\"456\")",
|
||||
"[[Get]](\"456\")",
|
||||
], log);
|
||||
}
|
||||
TestOrderWithDuplicates();
|
||||
|
||||
|
||||
function TestPropertyFilter() {
|
||||
var object = { prop3: 30 };
|
||||
object[2] = 40;
|
||||
object["prop4"] = 50;
|
||||
Object.defineProperty(object, "prop5", { value: 60, enumerable: true });
|
||||
Object.defineProperty(object, "prop6", { value: 70, enumerable: false });
|
||||
Object.defineProperty(object, "prop7", {
|
||||
enumerable: true, get() { return 80; }});
|
||||
var sym = Symbol("prop8");
|
||||
object[sym] = 90;
|
||||
|
||||
values = Object.values(object);
|
||||
assertEquals(5, values.length);
|
||||
assertEquals([40,30,50,60,80], values);
|
||||
}
|
||||
TestPropertyFilter();
|
||||
|
||||
|
||||
function TestWithProxy() {
|
||||
var obj1 = {prop1:10};
|
||||
var proxy1 = new Proxy(obj1, { });
|
||||
assertEquals([10], Object.values(proxy1));
|
||||
|
||||
var obj2 = {};
|
||||
Object.defineProperty(obj2, "prop2", { value: 20, enumerable: true });
|
||||
Object.defineProperty(obj2, "prop3", {
|
||||
get() { return 30; }, enumerable: true });
|
||||
var proxy2 = new Proxy(obj2, {
|
||||
getOwnPropertyDescriptor(target, name) {
|
||||
return Reflect.getOwnPropertyDescriptor(target, name);
|
||||
}
|
||||
});
|
||||
assertEquals([20, 30], Object.values(proxy2));
|
||||
|
||||
var obj3 = {};
|
||||
var count = 0;
|
||||
var proxy3 = new Proxy(obj3, {
|
||||
get(target, property, receiver) {
|
||||
return count++ * 5;
|
||||
},
|
||||
getOwnPropertyDescriptor(target, property) {
|
||||
return { configurable: true, enumerable: true };
|
||||
},
|
||||
ownKeys(target) {
|
||||
return [ "prop0", "prop1", Symbol("prop2"), Symbol("prop5") ];
|
||||
}
|
||||
});
|
||||
assertEquals([0, 5], Object.values(proxy3));
|
||||
}
|
||||
TestWithProxy();
|
||||
|
||||
|
||||
function TestMutateDuringEnumeration() {
|
||||
var aDeletesB = {
|
||||
get a() {
|
||||
delete this.b;
|
||||
return 1;
|
||||
},
|
||||
b: 2
|
||||
};
|
||||
assertEquals([1], Object.values(aDeletesB));
|
||||
|
||||
var aRemovesB = {
|
||||
get a() {
|
||||
Object.defineProperty(this, "b", { enumerable: false });
|
||||
return 1;
|
||||
},
|
||||
b: 2
|
||||
};
|
||||
assertEquals([1], Object.values(aRemovesB));
|
||||
|
||||
var aAddsB = { get a() { this.b = 2; return 1; } };
|
||||
assertEquals([1], Object.values(aAddsB));
|
||||
|
||||
var aMakesBEnumerable = {};
|
||||
Object.defineProperty(aMakesBEnumerable, "a", {
|
||||
get() {
|
||||
Object.defineProperty(this, "b", { enumerable: true });
|
||||
return 1;
|
||||
},
|
||||
enumerable: true
|
||||
});
|
||||
Object.defineProperty(aMakesBEnumerable, "b", {
|
||||
value: 2, configurable:true, enumerable: false });
|
||||
assertEquals([1, 2], Object.values(aMakesBEnumerable));
|
||||
}
|
||||
TestMutateDuringEnumeration();
|
||||
|
||||
|
||||
(function TestElementKinds() {
|
||||
var O1 = { name: "1" }, O2 = { name: "2" }, O3 = { name: "3" };
|
||||
var PI = 3.141592653589793;
|
||||
var E = 2.718281828459045;
|
||||
function fastSloppyArguments(a, b, c) {
|
||||
delete arguments[0];
|
||||
arguments[0] = a;
|
||||
return arguments;
|
||||
}
|
||||
|
||||
function slowSloppyArguments(a, b, c) {
|
||||
delete arguments[0];
|
||||
arguments[0] = a;
|
||||
Object.defineProperties(arguments, {
|
||||
0: {
|
||||
enumerable: true,
|
||||
value: a
|
||||
},
|
||||
9999: {
|
||||
enumerable: false,
|
||||
value: "Y"
|
||||
}
|
||||
});
|
||||
arguments[10000] = "X";
|
||||
return arguments;
|
||||
}
|
||||
|
||||
var element_kinds = {
|
||||
PACKED_SMI_ELEMENTS: [ [1, 2, 3], [1, 2, 3] ],
|
||||
HOLEY_SMI_ELEMENTS: [ [, , 3], [ 3 ] ],
|
||||
PACKED_ELEMENTS: [ [O1, O2, O3], [O1, O2, O3] ],
|
||||
HOLEY_ELEMENTS: [ [, , O3], [O3] ],
|
||||
PACKED_DOUBLE_ELEMENTS: [ [E, NaN, PI], [E, NaN, PI] ],
|
||||
HOLEY_DOUBLE_ELEMENTS: [ [, , NaN], [NaN] ],
|
||||
|
||||
DICTIONARY_ELEMENTS: [ Object.defineProperties({ 10000: "world" }, {
|
||||
100: { enumerable: true, value: "hello" },
|
||||
99: { enumerable: false, value: "nope" }
|
||||
}), [ "hello", "world" ] ],
|
||||
FAST_SLOPPY_ARGUMENTS_ELEMENTS: [
|
||||
fastSloppyArguments("a", "b", "c"), ["a", "b", "c"] ],
|
||||
SLOW_SLOPPY_ARGUMENTS_ELEMENTS: [
|
||||
slowSloppyArguments("a", "b", "c"), [ "a", "b", "c", "X"]],
|
||||
|
||||
FAST_STRING_WRAPPER_ELEMENTS: [ new String("str"), ["s", "t", "r"] ],
|
||||
SLOW_STRING_WRAPPER_ELEMENTS: [
|
||||
Object.defineProperties(new String("str"), {
|
||||
10000: { enumerable: false, value: "X" },
|
||||
9999: { enumerable: true, value: "Y" }
|
||||
}), ["s", "t", "r", "Y"] ],
|
||||
};
|
||||
|
||||
for (let [kind, [object, expected]] of Object.entries(element_kinds)) {
|
||||
let result1 = Object.values(object);
|
||||
assertEquals(expected, result1, `fast Object.values() with ${kind}`);
|
||||
|
||||
let proxy = new Proxy(object, {});
|
||||
let result2 = Object.values(proxy);
|
||||
assertEquals(result1, result2, `slow Object.values() with ${kind}`);
|
||||
}
|
||||
})();
|
|
@ -1,31 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-array-flat
|
||||
|
||||
{
|
||||
class MyArray extends Array {
|
||||
static get [Symbol.species]() {
|
||||
return Array;
|
||||
}
|
||||
}
|
||||
|
||||
const wannabe = new MyArray();
|
||||
const flattened = wannabe.flat(Infinity);
|
||||
assertEquals(false, flattened instanceof MyArray);
|
||||
assertEquals(true, flattened instanceof Array);
|
||||
}
|
||||
|
||||
{
|
||||
class MyArray extends Array {
|
||||
static get [Symbol.species]() {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
const wannabe = new MyArray();
|
||||
const flattened = wannabe.flat(Infinity);
|
||||
assertEquals(true, flattened instanceof MyArray);
|
||||
assertEquals(true, flattened instanceof Array);
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-array-flat
|
||||
|
||||
assertEquals(Array.prototype.flat.length, 0);
|
||||
assertEquals(Array.prototype.flat.name, 'flat');
|
||||
|
||||
{
|
||||
const input = [1, [2], [[3]]];
|
||||
|
||||
assertEquals(input.flat(), [1, 2, [3]]);
|
||||
assertEquals(input.flat(1), [1, 2, [3]]);
|
||||
assertEquals(input.flat(true), [1, 2, [3]]);
|
||||
assertEquals(input.flat(undefined), [1, 2, [3]]);
|
||||
|
||||
assertEquals(input.flat(-Infinity), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat(-1), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat(-0), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat(0), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat(false), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat(null), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat(''), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat('foo'), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat(/./), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat([]), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat({}), [1, [2], [[3]]]);
|
||||
assertEquals(
|
||||
input.flat(new Proxy({}, {})), [1, [2], [[3]]]);
|
||||
assertEquals(input.flat((x) => x), [1, [2], [[3]]]);
|
||||
assertEquals(
|
||||
input.flat(String), [1, [2], [[3]]]);
|
||||
|
||||
assertEquals(input.flat(2), [1, 2, 3]);
|
||||
assertEquals(input.flat(Infinity), [1, 2, 3]);
|
||||
|
||||
assertThrows(() => { input.flat(Symbol()); }, TypeError);
|
||||
assertThrows(() => { input.flat(Object.create(null)); }, TypeError);
|
||||
}
|
||||
|
||||
{
|
||||
const input = { 0: 'a', 1: 'b', 2: 'c', length: 'wat' };
|
||||
assertEquals(Array.prototype.flat.call(input, Infinity), []);
|
||||
}
|
||||
|
||||
{
|
||||
let count = 0;
|
||||
const input = {
|
||||
get length() { ++count; return 0; }
|
||||
};
|
||||
const result = Array.prototype.flat.call(input, Infinity);
|
||||
assertEquals(count, 1);
|
||||
}
|
||||
|
||||
{
|
||||
const descriptor = Object.getOwnPropertyDescriptor(
|
||||
Array.prototype,
|
||||
'flat'
|
||||
);
|
||||
assertEquals(descriptor.value, Array.prototype.flat);
|
||||
assertEquals(descriptor.writable, true);
|
||||
assertEquals(descriptor.enumerable, false);
|
||||
assertEquals(descriptor.configurable, true);
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-array-flat
|
||||
|
||||
{
|
||||
class MyArray extends Array {
|
||||
static get [Symbol.species]() {
|
||||
return Array;
|
||||
}
|
||||
}
|
||||
|
||||
const wannabe = new MyArray();
|
||||
const result = wannabe.flatMap(x => [x, x]);
|
||||
assertEquals(false, result instanceof MyArray);
|
||||
assertEquals(true, result instanceof Array);
|
||||
}
|
||||
|
||||
{
|
||||
class MyArray extends Array {
|
||||
static get [Symbol.species]() {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
const wannabe = new MyArray();
|
||||
const result = wannabe.flatMap(x => [x, x]);
|
||||
assertEquals(true, result instanceof MyArray);
|
||||
assertEquals(true, result instanceof Array);
|
||||
}
|
|
@ -1,162 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-array-flat --allow-natives-syntax
|
||||
|
||||
assertEquals(Array.prototype.flatMap.length, 1);
|
||||
assertEquals(Array.prototype.flatMap.name, 'flatMap');
|
||||
|
||||
assertEquals(
|
||||
[1, 2, 3, 4].flatMap((element) => [element, element ** 2]),
|
||||
[1, 1, 2, 4, 3, 9, 4, 16]
|
||||
);
|
||||
assertEquals(
|
||||
[1, 2, 3, 4].flatMap((element) => [[element, element ** 2]]),
|
||||
[[1, 1], [2, 4], [3, 9], [4, 16]]
|
||||
);
|
||||
|
||||
{
|
||||
const elements = new Set([
|
||||
-Infinity,
|
||||
-1,
|
||||
-0,
|
||||
+0,
|
||||
+1,
|
||||
Infinity,
|
||||
null,
|
||||
undefined,
|
||||
true,
|
||||
false,
|
||||
'',
|
||||
'foo',
|
||||
/./,
|
||||
[],
|
||||
{},
|
||||
Object.create(null),
|
||||
new Proxy({}, {}),
|
||||
Symbol(),
|
||||
x => x ** 2,
|
||||
String
|
||||
]);
|
||||
|
||||
for (const value of elements) {
|
||||
assertEquals(
|
||||
[value].flatMap((element) => [element, element]),
|
||||
[value, value]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const array = [42];
|
||||
assertEquals(
|
||||
[array].flatMap((element) => [element, element]),
|
||||
[array, array]
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
const nonCallables = new Set([
|
||||
-Infinity,
|
||||
-1,
|
||||
-0,
|
||||
+0,
|
||||
+1,
|
||||
Infinity,
|
||||
null,
|
||||
undefined,
|
||||
true,
|
||||
false,
|
||||
'',
|
||||
'foo',
|
||||
/./,
|
||||
[],
|
||||
{},
|
||||
Object.create(null),
|
||||
new Proxy({}, {}),
|
||||
Symbol(),
|
||||
]);
|
||||
for (const nonCallable of nonCallables) {
|
||||
assertThrows(() => {
|
||||
[].flatMap(nonCallable);
|
||||
}, TypeError);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const object = {
|
||||
foo: 42,
|
||||
get length() {
|
||||
object.foo = 0;
|
||||
}
|
||||
};
|
||||
const result = [object].flatMap((element) => [element, element]);
|
||||
%HeapObjectVerify(result);
|
||||
assertEquals(result, [object, object]);
|
||||
assertEquals(result[0].foo, 42);
|
||||
}
|
||||
|
||||
assertThrows(() => {
|
||||
Array.prototype.flatMap.call(null, (element) => element);
|
||||
}, TypeError);
|
||||
assertThrows(() => {
|
||||
Array.prototype.flatMap.call(undefined, (element) => element);
|
||||
}, TypeError);
|
||||
|
||||
assertEquals(
|
||||
Array.prototype.flatMap.call(
|
||||
{
|
||||
length: 1,
|
||||
0: 'a',
|
||||
1: 'b',
|
||||
},
|
||||
(element) => element
|
||||
),
|
||||
['a']
|
||||
);
|
||||
assertEquals(
|
||||
Array.prototype.flatMap.call(
|
||||
{
|
||||
length: 2,
|
||||
0: 'a',
|
||||
1: 'b',
|
||||
},
|
||||
(element) => element
|
||||
),
|
||||
['a', 'b']
|
||||
);
|
||||
|
||||
{
|
||||
const result = [1, 2, 3].flatMap(function() {
|
||||
return [this];
|
||||
}, 'abc');
|
||||
assertEquals(true, result[0] == 'abc');
|
||||
assertEquals(true, result[1] == 'abc');
|
||||
assertEquals(true, result[2] == 'abc');
|
||||
}
|
||||
|
||||
{
|
||||
const input = { 0: 'a', 1: 'b', 2: 'c', length: 'wat' };
|
||||
assertEquals(Array.prototype.flatMap.call(input, x => [x]), []);
|
||||
}
|
||||
|
||||
{
|
||||
let count = 0;
|
||||
const input = {
|
||||
get length() { ++count; return 0; }
|
||||
};
|
||||
const result = Array.prototype.flatMap.call(input, x => [x]);
|
||||
assertEquals(count, 1);
|
||||
}
|
||||
|
||||
{
|
||||
const descriptor = Object.getOwnPropertyDescriptor(
|
||||
Array.prototype,
|
||||
'flatMap'
|
||||
);
|
||||
assertEquals(descriptor.value, Array.prototype.flatMap);
|
||||
assertEquals(descriptor.writable, true);
|
||||
assertEquals(descriptor.enumerable, false);
|
||||
assertEquals(descriptor.configurable, true);
|
||||
}
|
|
@ -1,214 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs
|
||||
|
||||
(function TestConstructWeakFactory() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
assertEquals(wf.toString(), "[object WeakFactory]");
|
||||
assertNotSame(wf.__proto__, Object.prototype);
|
||||
assertSame(wf.__proto__.__proto__, Object.prototype);
|
||||
})();
|
||||
|
||||
(function TestWeakFactoryConstructorCallAsFunction() {
|
||||
let caught = false;
|
||||
let message = "";
|
||||
try {
|
||||
let f = WeakFactory(() => {});
|
||||
} catch (e) {
|
||||
message = e.message;
|
||||
caught = true;
|
||||
} finally {
|
||||
assertTrue(caught);
|
||||
assertEquals(message, "Constructor WeakFactory requires 'new'");
|
||||
}
|
||||
})();
|
||||
|
||||
(function TestConstructWeakFactoryCleanupNotCallable() {
|
||||
let message = "WeakFactory: cleanup must be callable";
|
||||
assertThrows(() => { let wf = new WeakFactory(); }, TypeError, message);
|
||||
assertThrows(() => { let wf = new WeakFactory(1); }, TypeError, message);
|
||||
assertThrows(() => { let wf = new WeakFactory(null); }, TypeError, message);
|
||||
})();
|
||||
|
||||
(function TestConstructWeakFactoryWithCallableProxyAsCleanup() {
|
||||
let handler = {};
|
||||
let obj = () => {};
|
||||
let proxy = new Proxy(obj, handler);
|
||||
let wf = new WeakFactory(proxy);
|
||||
})();
|
||||
|
||||
(function TestConstructWeakFactoryWithNonCallableProxyAsCleanup() {
|
||||
let message = "WeakFactory: cleanup must be callable";
|
||||
let handler = {};
|
||||
let obj = {};
|
||||
let proxy = new Proxy(obj, handler);
|
||||
assertThrows(() => { let wf = new WeakFactory(proxy); }, TypeError, message);
|
||||
})();
|
||||
|
||||
(function TestMakeCell() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let wc = wf.makeCell({});
|
||||
assertEquals(wc.toString(), "[object WeakCell]");
|
||||
assertNotSame(wc.__proto__, Object.prototype);
|
||||
assertSame(wc.__proto__.__proto__, Object.prototype);
|
||||
assertEquals(wc.holdings, undefined);
|
||||
|
||||
let holdings_desc = Object.getOwnPropertyDescriptor(wc.__proto__, "holdings");
|
||||
assertEquals(true, holdings_desc.configurable);
|
||||
assertEquals(false, holdings_desc.enumerable);
|
||||
assertEquals("function", typeof holdings_desc.get);
|
||||
assertEquals(undefined, holdings_desc.set);
|
||||
|
||||
let clear_desc = Object.getOwnPropertyDescriptor(wc.__proto__, "clear");
|
||||
assertEquals(true, clear_desc.configurable);
|
||||
assertEquals(false, clear_desc.enumerable);
|
||||
assertEquals("function", typeof clear_desc.value);
|
||||
})();
|
||||
|
||||
(function TestMakeCellWithHoldings() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let obj = {a: 1};
|
||||
let holdings = {b: 2};
|
||||
let wc = wf.makeCell(obj, holdings);
|
||||
assertSame(wc.holdings, holdings);
|
||||
})();
|
||||
|
||||
(function TestMakeCellWithHoldingsSetHoldings() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let obj = {a: 1};
|
||||
let holdings = {b: 2};
|
||||
let wc = wf.makeCell(obj, holdings);
|
||||
assertSame(wc.holdings, holdings);
|
||||
wc.holdings = 5;
|
||||
assertSame(wc.holdings, holdings);
|
||||
})();
|
||||
|
||||
(function TestMakeCellWithHoldingsSetHoldingsStrict() {
|
||||
"use strict";
|
||||
let wf = new WeakFactory(() => {});
|
||||
let obj = {a: 1};
|
||||
let holdings = {b: 2};
|
||||
let wc = wf.makeCell(obj, holdings);
|
||||
assertSame(wc.holdings, holdings);
|
||||
assertThrows(() => { wc.holdings = 5; }, TypeError);
|
||||
assertSame(wc.holdings, holdings);
|
||||
})();
|
||||
|
||||
(function TestMakeCellWithNonObject() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let message = "WeakFactory.prototype.makeCell: target must be an object";
|
||||
assertThrows(() => wf.makeCell(), TypeError, message);
|
||||
assertThrows(() => wf.makeCell(1), TypeError, message);
|
||||
assertThrows(() => wf.makeCell(false), TypeError, message);
|
||||
assertThrows(() => wf.makeCell("foo"), TypeError, message);
|
||||
assertThrows(() => wf.makeCell(Symbol()), TypeError, message);
|
||||
assertThrows(() => wf.makeCell(null), TypeError, message);
|
||||
assertThrows(() => wf.makeCell(undefined), TypeError, message);
|
||||
})();
|
||||
|
||||
(function TestMakeCellWithProxy() {
|
||||
let handler = {};
|
||||
let obj = {};
|
||||
let proxy = new Proxy(obj, handler);
|
||||
let wf = new WeakFactory(() => {});
|
||||
let wc = wf.makeCell(proxy);
|
||||
})();
|
||||
|
||||
(function TestMakeCellTargetAndHoldingsSameValue() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let obj = {a: 1};
|
||||
// SameValue(target, holdings) not ok
|
||||
assertThrows(() => wf.makeCell(obj, obj), TypeError,
|
||||
"WeakFactory.prototype.makeCell: target and holdings must not be same");
|
||||
let holdings = {a: 1};
|
||||
let wc = wf.makeCell(obj, holdings);
|
||||
})();
|
||||
|
||||
(function TestMakeCellWithoutWeakFactory() {
|
||||
assertThrows(() => WeakFactory.prototype.makeCell.call({}, {}), TypeError);
|
||||
// Does not throw:
|
||||
let wf = new WeakFactory(() => {});
|
||||
WeakFactory.prototype.makeCell.call(wf, {});
|
||||
})();
|
||||
|
||||
(function TestHoldingsWithoutWeakCell() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let wc = wf.makeCell({});
|
||||
let holdings_getter = Object.getOwnPropertyDescriptor(wc.__proto__, "holdings").get;
|
||||
assertThrows(() => holdings_getter.call({}), TypeError);
|
||||
// Does not throw:
|
||||
holdings_getter.call(wc);
|
||||
})();
|
||||
|
||||
(function TestClearWithoutWeakCell() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let wc = wf.makeCell({});
|
||||
let clear = Object.getOwnPropertyDescriptor(wc.__proto__, "clear").value;
|
||||
assertThrows(() => clear.call({}), TypeError);
|
||||
// Does not throw:
|
||||
clear.call(wc);
|
||||
})();
|
||||
|
||||
(function TestWeakRefConstructor() {
|
||||
let wr = new WeakRef({});
|
||||
assertEquals(wr.toString(), "[object WeakRef]");
|
||||
assertNotSame(wr.__proto__, Object.prototype);
|
||||
|
||||
let deref_desc = Object.getOwnPropertyDescriptor(wr.__proto__, "deref");
|
||||
assertEquals(true, deref_desc.configurable);
|
||||
assertEquals(false, deref_desc.enumerable);
|
||||
assertEquals("function", typeof deref_desc.value);
|
||||
})();
|
||||
|
||||
(function TestWeakRefConstructorWithNonObject() {
|
||||
let message = "WeakRef: target must be an object";
|
||||
assertThrows(() => new WeakRef(), TypeError, message);
|
||||
assertThrows(() => new WeakRef(1), TypeError, message);
|
||||
assertThrows(() => new WeakRef(false), TypeError, message);
|
||||
assertThrows(() => new WeakRef("foo"), TypeError, message);
|
||||
assertThrows(() => new WeakRef(Symbol()), TypeError, message);
|
||||
assertThrows(() => new WeakRef(null), TypeError, message);
|
||||
assertThrows(() => new WeakRef(undefined), TypeError, message);
|
||||
})();
|
||||
|
||||
(function TestWeakRefConstructorCallAsFunction() {
|
||||
let caught = false;
|
||||
let message = "";
|
||||
try {
|
||||
let f = WeakRef({});
|
||||
} catch (e) {
|
||||
message = e.message;
|
||||
caught = true;
|
||||
} finally {
|
||||
assertTrue(caught);
|
||||
assertEquals(message, "Constructor WeakRef requires 'new'");
|
||||
}
|
||||
})();
|
||||
|
||||
(function TestWeakRefWithProxy() {
|
||||
let handler = {};
|
||||
let obj = {};
|
||||
let proxy = new Proxy(obj, handler);
|
||||
let wr = new WeakRef(proxy);
|
||||
})();
|
||||
|
||||
(function TestCleanupSomeWithoutWeakFactory() {
|
||||
assertThrows(() => WeakFactory.prototype.cleanupSome.call({}), TypeError);
|
||||
// Does not throw:
|
||||
let wf = new WeakFactory(() => {});
|
||||
let rv = WeakFactory.prototype.cleanupSome.call(wf);
|
||||
assertEquals(undefined, rv);
|
||||
})();
|
||||
|
||||
(function TestDerefWithoutWeakRef() {
|
||||
let wf = new WeakFactory(() => {});
|
||||
let wc = wf.makeCell({});
|
||||
let wr = new WeakRef({});
|
||||
let deref = Object.getOwnPropertyDescriptor(wr.__proto__, "deref").value;
|
||||
assertThrows(() => deref.call({}), TypeError);
|
||||
assertThrows(() => deref.call(wc), TypeError);
|
||||
// Does not throw:
|
||||
deref.call(wr);
|
||||
})();
|
|
@ -1,34 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs --expose-gc --noincremental-marking
|
||||
|
||||
let r = Realm.create();
|
||||
|
||||
let cleanup = Realm.eval(r, "var stored_global; function cleanup() { stored_global = globalThis; } cleanup");
|
||||
let realm_global_this = Realm.eval(r, "globalThis");
|
||||
|
||||
let wf = new WeakFactory(cleanup);
|
||||
|
||||
// Create an object and a WeakCell pointing to it. The object needs to be inside
|
||||
// a closure so that we can reliably kill them!
|
||||
let weak_cell;
|
||||
|
||||
(function() {
|
||||
let object = {};
|
||||
weak_cell = wf.makeCell(object);
|
||||
|
||||
// object goes out of scope.
|
||||
})();
|
||||
|
||||
gc();
|
||||
|
||||
// Assert that the cleanup function was called in its Realm.
|
||||
let timeout_func = function() {
|
||||
let stored_global = Realm.eval(r, "stored_global;");
|
||||
assertNotEquals(stored_global, globalThis);
|
||||
assertEquals(stored_global, realm_global_this);
|
||||
}
|
||||
|
||||
setTimeout(timeout_func, 0);
|
|
@ -1,56 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs --expose-gc --noincremental-marking
|
||||
|
||||
// This test asserts that the cleanup function call, scheduled by GC, is a
|
||||
// microtask and not a normal task.
|
||||
|
||||
// Inside a microtask, cause GC (which should schedule the cleanup as
|
||||
// microtask). lso schedule another microtask. Assert that the cleanup
|
||||
// function ran before the other microtask.
|
||||
|
||||
function scheduleMicrotask(func) {
|
||||
Promise.resolve().then(func);
|
||||
}
|
||||
|
||||
let log = [];
|
||||
|
||||
let cleanup = (iter) => {
|
||||
log.push("cleanup");
|
||||
for (wc of iter) { }
|
||||
}
|
||||
|
||||
let wf = new WeakFactory(cleanup);
|
||||
let o = null;
|
||||
|
||||
(function() {
|
||||
// Use a closure here to avoid other references to o which might keep it alive
|
||||
// (e.g., stack frames pointing to it).
|
||||
o = {};
|
||||
wf.makeCell(o);
|
||||
})();
|
||||
|
||||
let microtask_after_cleanup = () => {
|
||||
log.push("microtask_after_cleanup");
|
||||
}
|
||||
|
||||
let first_microtask = function() {
|
||||
log.push("first_microtask");
|
||||
|
||||
// This schedules the cleanup function as microtask.
|
||||
o = null;
|
||||
gc();
|
||||
|
||||
// Schedule a microtask which should run after the cleanup microtask.
|
||||
scheduleMicrotask(microtask_after_cleanup);
|
||||
}
|
||||
|
||||
scheduleMicrotask(first_microtask);
|
||||
|
||||
setTimeout(() => {
|
||||
// Assert that the functions got called in the right order.
|
||||
let wanted_log = ["first_microtask", "cleanup", "microtask_after_cleanup"];
|
||||
assertEquals(wanted_log, log);
|
||||
}, 0);
|
|
@ -1,34 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs --expose-gc --noincremental-marking
|
||||
|
||||
let r = Realm.create();
|
||||
|
||||
let cleanup = Realm.eval(r, "var stored_global; let cleanup = new Proxy(function() { stored_global = globalThis;}, {}); cleanup");
|
||||
let realm_global_this = Realm.eval(r, "globalThis");
|
||||
|
||||
let wf = new WeakFactory(cleanup);
|
||||
|
||||
// Create an object and a WeakCell pointing to it. The object needs to be inside
|
||||
// a closure so that we can reliably kill them!
|
||||
let weak_cell;
|
||||
|
||||
(function() {
|
||||
let object = {};
|
||||
weak_cell = wf.makeCell(object);
|
||||
|
||||
// object goes out of scope.
|
||||
})();
|
||||
|
||||
gc();
|
||||
|
||||
// Assert that the cleanup function was called in its Realm.
|
||||
let timeout_func = function() {
|
||||
let stored_global = Realm.eval(r, "stored_global;");
|
||||
assertNotEquals(stored_global, globalThis);
|
||||
assertEquals(stored_global, realm_global_this);
|
||||
}
|
||||
|
||||
setTimeout(timeout_func, 0);
|
|
@ -1,39 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs --expose-gc --noincremental-marking
|
||||
|
||||
let cleanup_call_count = 0;
|
||||
let cleanup = function(iter) {
|
||||
++cleanup_call_count;
|
||||
}
|
||||
|
||||
let wf = new WeakFactory(cleanup);
|
||||
// Create an object and a WeakCell pointing to it. The object needs to be inside
|
||||
// a closure so that we can reliably kill them!
|
||||
let weak_cell;
|
||||
|
||||
(function() {
|
||||
let object = {};
|
||||
weak_cell = wf.makeCell(object);
|
||||
|
||||
// Clear the WeakCell before the GC has a chance to discover it.
|
||||
weak_cell.clear();
|
||||
|
||||
// Call clear again (just to assert we handle this gracefully).
|
||||
weak_cell.clear();
|
||||
|
||||
// object goes out of scope.
|
||||
})();
|
||||
|
||||
// This GC will discover dirty WeakCells.
|
||||
gc();
|
||||
assertEquals(0, cleanup_call_count);
|
||||
|
||||
// Assert that the cleanup function won't be called, since the WeakCell was cleared.
|
||||
let timeout_func = function() {
|
||||
assertEquals(0, cleanup_call_count);
|
||||
}
|
||||
|
||||
setTimeout(timeout_func, 0);
|
|
@ -1,49 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs --expose-gc --noincremental-marking
|
||||
|
||||
// Test that WeakCell.prototype.clear() also clears the WeakFactory pointer of
|
||||
// WeakCell. The only way to observe this is to assert that the WeakCell no
|
||||
// longer keeps its WeakFactory alive after clear() has been called.
|
||||
|
||||
let weak_cell;
|
||||
let weak_cell_pointing_to_factory;
|
||||
|
||||
let cleanup1_call_count = 0;
|
||||
let cleanup2_call_count = 0;
|
||||
|
||||
let cleanup1 = function() {
|
||||
++cleanup1_call_count;
|
||||
}
|
||||
|
||||
let cleanup2 = function() {
|
||||
++cleanup2_call_count;
|
||||
}
|
||||
|
||||
let wf1 = new WeakFactory(cleanup1);
|
||||
|
||||
(function(){
|
||||
let wf2 = new WeakFactory(cleanup2);
|
||||
|
||||
(function() {
|
||||
let object = {};
|
||||
weak_cell = wf2.makeCell(object);
|
||||
// object goes out of scope.
|
||||
})();
|
||||
|
||||
weak_cell_pointing_to_factory = wf1.makeCell(wf2);
|
||||
// wf goes out of scope
|
||||
})();
|
||||
|
||||
weak_cell.clear();
|
||||
gc();
|
||||
|
||||
// Assert that weak_cell_pointing_to_factory now got cleared.
|
||||
let timeout_func = function() {
|
||||
assertEquals(1, cleanup1_call_count);
|
||||
assertEquals(0, cleanup2_call_count);
|
||||
}
|
||||
|
||||
setTimeout(timeout_func, 0);
|
|
@ -1,48 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs --expose-gc --noincremental-marking
|
||||
|
||||
let cleanup_call_count = 0;
|
||||
let cleanup_weak_cell_count = 0;
|
||||
let cleanup = function(iter) {
|
||||
for (wc of iter) {
|
||||
// See which WeakCell we're iterating over and clear the other one.
|
||||
if (wc == weak_cell1) {
|
||||
weak_cell2.clear();
|
||||
} else {
|
||||
assertSame(wc, weak_cell2);
|
||||
weak_cell1.clear();
|
||||
}
|
||||
++cleanup_weak_cell_count;
|
||||
}
|
||||
++cleanup_call_count;
|
||||
}
|
||||
|
||||
let wf = new WeakFactory(cleanup);
|
||||
// Create an object and a WeakCell pointing to it. The object needs to be inside
|
||||
// a closure so that we can reliably kill them!
|
||||
let weak_cell1;
|
||||
let weak_cell2;
|
||||
|
||||
(function() {
|
||||
let object1 = {};
|
||||
weak_cell1 = wf.makeCell(object1);
|
||||
let object2 = {};
|
||||
weak_cell2 = wf.makeCell(object2);
|
||||
|
||||
// object1 and object2 go out of scope.
|
||||
})();
|
||||
|
||||
// This GC will discover dirty WeakCells and schedule cleanup.
|
||||
gc();
|
||||
assertEquals(0, cleanup_call_count);
|
||||
|
||||
// Assert that the cleanup function was called and iterated one WeakCell (but not the other one).
|
||||
let timeout_func = function() {
|
||||
assertEquals(1, cleanup_call_count);
|
||||
assertEquals(1, cleanup_weak_cell_count);
|
||||
}
|
||||
|
||||
setTimeout(timeout_func, 0);
|
|
@ -1,36 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony-weak-refs --expose-gc --noincremental-marking
|
||||
|
||||
let cleanup_called = false;
|
||||
let cleanup = function(iter) {
|
||||
assertFalse(cleanup_called);
|
||||
let result = iter.next();
|
||||
assertEquals(result.value, wc);
|
||||
assertFalse(result.done);
|
||||
result = iter.next();
|
||||
assertTrue(result.done);
|
||||
cleanup_called = true;
|
||||
}
|
||||
|
||||
let wf = new WeakFactory(cleanup);
|
||||
let o = {};
|
||||
let wc = wf.makeCell(o);
|
||||
|
||||
gc();
|
||||
assertFalse(cleanup_called);
|
||||
|
||||
// Drop the last reference to o.
|
||||
o = null;
|
||||
// GC will clear the WeakCell; the cleanup function will be called the next time
|
||||
// we enter the event loop.
|
||||
gc();
|
||||
assertFalse(cleanup_called);
|
||||
|
||||
let timeout_func = function() {
|
||||
assertTrue(cleanup_called);
|
||||
}
|
||||
|
||||
setTimeout(timeout_func, 0);
|
|
@ -1,39 +0,0 @@
|
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following
|
||||
// disclaimer in the documentation and/or other materials provided
|
||||
// with the distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This tests that a global key values are preserved when used in
|
||||
// an expression which will bail out.
|
||||
|
||||
var m = Math;
|
||||
var p = "floor";
|
||||
|
||||
function test() {
|
||||
var bignumber = 31363200000;
|
||||
assertDoesNotThrow(assertEquals(m[p](Math.round(bignumber/864E5)/7)+1, 52));
|
||||
}
|
||||
|
||||
test();
|
|
@ -1,19 +0,0 @@
|
|||
// Copyright 2014 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax --enable-slow-asserts
|
||||
|
||||
var arr = [];
|
||||
var str = new String('x');
|
||||
|
||||
function f(a,b) {
|
||||
a[b] = 1;
|
||||
}
|
||||
|
||||
f(arr, 0);
|
||||
f(str, 0);
|
||||
f(str, 0);
|
||||
|
||||
// This is just to trigger elements validation, object already broken.
|
||||
%SetKeyedProperty(str, 1, 'y', 0);
|
|
@ -1,38 +0,0 @@
|
|||
// Copyright 2014 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following
|
||||
// disclaimer in the documentation and/or other materials provided
|
||||
// with the distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Flags: --max-old-space-size=1600
|
||||
|
||||
assertThrows((function() {
|
||||
s = "Hello World!\n";
|
||||
while (true) {
|
||||
x = new Array();
|
||||
x[0] = s;
|
||||
x[1000] = s;
|
||||
x[10000] = s;
|
||||
s = x.join("::");
|
||||
}}), RangeError);
|
|
@ -1,76 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(32, 32, false);
|
||||
builder.addFunction("test", kSig_i_iii)
|
||||
.addBodyWithEnd([
|
||||
// body:
|
||||
kExprI64Const, 0xb4, 0x42,
|
||||
kExprI64Const, 0x7a,
|
||||
kExprI64Const, 0x42,
|
||||
kExprI64Const, 0x7a,
|
||||
kExprI64Ior,
|
||||
kExprI64Ctz,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprI64Mul,
|
||||
kExprI64Const, 0x41,
|
||||
kExprI64Ctz,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprF32SConvertI64,
|
||||
kExprI64Const, 0x42,
|
||||
kExprI64Const, 0x02,
|
||||
kExprI64Const, 0x7a,
|
||||
kExprI64Mul,
|
||||
kExprI64Const, 0x42,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprI64Const, 0x7a,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprI64Mul,
|
||||
kExprI64Const, 0x41,
|
||||
kExprI64Ctz,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprF32SConvertI64,
|
||||
kExprUnreachable,
|
||||
kExprEnd, // @65
|
||||
])
|
||||
.exportFunc();
|
||||
var module = new WebAssembly.Module(builder.toBuffer());
|
||||
})();
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(16, 32, false);
|
||||
builder.addFunction("test", kSig_i_iii)
|
||||
.addBodyWithEnd([
|
||||
// body:
|
||||
kExprI64Const, 0x42,
|
||||
kExprI64Const, 0x7a,
|
||||
kExprI64Ctz,
|
||||
kExprI64Mul,
|
||||
kExprI64Ctz,
|
||||
kExprI64Const, 0x41,
|
||||
kExprI64Ctz,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprI64Const, 0x41,
|
||||
kExprI64Ctz,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprF32SConvertI64,
|
||||
kExprUnreachable,
|
||||
kExprEnd, // @20
|
||||
])
|
||||
.exportFunc();
|
||||
var module = new WebAssembly.Module(builder.toBuffer());
|
||||
})();
|
|
@ -1,32 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(32, 32, false);
|
||||
builder.addFunction("test", kSig_i_iii)
|
||||
.addBodyWithEnd([
|
||||
// body:
|
||||
kExprI64Const, 0x42,
|
||||
kExprI64Const, 0x7a,
|
||||
kExprI64RemU,
|
||||
kExprI64Const, 0x42,
|
||||
kExprI64Const, 0x37,
|
||||
kExprI64Mul,
|
||||
kExprI64Const, 0x36,
|
||||
kExprI64Mul,
|
||||
kExprI64Const, 0x42,
|
||||
kExprI64Ctz,
|
||||
kExprI64Ctz,
|
||||
kExprI64Shl,
|
||||
kExprF32SConvertI64,
|
||||
kExprUnreachable,
|
||||
kExprEnd, // @21
|
||||
])
|
||||
.exportFunc();
|
||||
var module = new WebAssembly.Module(builder.toBuffer());
|
||||
})();
|
|
@ -1,75 +0,0 @@
|
|||
// Copyright 2009 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following
|
||||
// disclaimer in the documentation and/or other materials provided
|
||||
// with the distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This regression includes a number of cases where we did not correctly
|
||||
// update a accessor property to a data property using Object.defineProperty.
|
||||
|
||||
var obj = { get value() {}, set value (v) { throw "Error";} };
|
||||
assertDoesNotThrow(
|
||||
Object.defineProperty(obj, "value",
|
||||
{ value: 5, writable:true, configurable: true }));
|
||||
var desc = Object.getOwnPropertyDescriptor(obj, "value");
|
||||
assertEquals(obj.value, 5);
|
||||
assertTrue(desc.configurable);
|
||||
assertTrue(desc.enumerable);
|
||||
assertTrue(desc.writable);
|
||||
assertEquals(desc.get, undefined);
|
||||
assertEquals(desc.set, undefined);
|
||||
|
||||
|
||||
var proto = {
|
||||
get value() {},
|
||||
set value(v) { Object.defineProperty(this, "value", {value: v}); }
|
||||
};
|
||||
|
||||
var create = Object.create(proto);
|
||||
|
||||
assertEquals(create.value, undefined);
|
||||
assertDoesNotThrow(create.value = 4);
|
||||
assertEquals(create.value, 4);
|
||||
|
||||
// These tests where provided in bug 959, but are all related to the this issue.
|
||||
var obj1 = {};
|
||||
Object.defineProperty(obj1, 'p', {get: undefined, set: undefined});
|
||||
assertTrue("p" in obj1);
|
||||
desc = Object.getOwnPropertyDescriptor(obj1, "p");
|
||||
assertFalse(desc.configurable);
|
||||
assertFalse(desc.enumerable);
|
||||
assertEquals(desc.value, undefined);
|
||||
assertEquals(desc.get, undefined);
|
||||
assertEquals(desc.set, undefined);
|
||||
|
||||
|
||||
var obj2 = { get p() {}};
|
||||
Object.defineProperty(obj2, 'p', {get: undefined})
|
||||
assertTrue("p" in obj2);
|
||||
desc = Object.getOwnPropertyDescriptor(obj2, "p");
|
||||
assertTrue(desc.configurable);
|
||||
assertTrue(desc.enumerable);
|
||||
assertEquals(desc.value, undefined);
|
||||
assertEquals(desc.get, undefined);
|
||||
assertEquals(desc.set, undefined);
|
|
@ -1,17 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --invoke-weak-callbacks --omit-quit --expose-wasm --allow-natives-syntax
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
const builder = new WasmModuleBuilder();
|
||||
builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 42]);
|
||||
const buffer = builder.toBuffer();
|
||||
// Start async compilation, but don't wait for it to finish.
|
||||
const module = WebAssembly.compile(buffer);
|
||||
|
||||
// This create the collator.
|
||||
'퓛'.localeCompare();
|
|
@ -1,19 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --no-liftoff --no-wasm-tier-up --no-future --debug-code
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
const builder = new WasmModuleBuilder();
|
||||
builder.addFunction('main', kSig_i_v)
|
||||
.addBody([
|
||||
kExprI64Const, 0xa3, 0x82, 0x83, 0x86, 0x8c, 0xd8, 0xae, 0xb5, 0x40,
|
||||
kExprI32ConvertI64,
|
||||
kExprI32Const, 0x00,
|
||||
kExprI32Sub,
|
||||
]).exportFunc();
|
||||
const instance = builder.instantiate();
|
||||
print(instance.exports.main(1, 2, 3));
|
|
@ -1,25 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax
|
||||
|
||||
function MODULE() {
|
||||
"use asm";
|
||||
function f() {
|
||||
bogus_function_table[0 & LIMIT]();
|
||||
}
|
||||
return { f:f };
|
||||
}
|
||||
|
||||
var bogus_function_table = [ Object ];
|
||||
var test_set = [ 0x3fffffff, 0x7fffffff, 0xffffffff ];
|
||||
for (var i = 0; i < test_set.length; ++i) {
|
||||
bogus_function_table[i] = Object;
|
||||
var src = MODULE.toString();
|
||||
src = src.replace(/MODULE/g, "Module" + i);
|
||||
src = src.replace(/LIMIT/g, test_set[i]);
|
||||
var module = eval("(" + src + ")");
|
||||
assertDoesNotThrow(module(this).f());
|
||||
assertFalse(%IsAsmWasmCode(module));
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addImportedTable("x", "table", 1, 10000000);
|
||||
let module = new WebAssembly.Module(builder.toBuffer());
|
||||
let table = new WebAssembly.Table({element: "anyfunc",
|
||||
initial: 1, maximum:1000000});
|
||||
let instance = new WebAssembly.Instance(module, {x: {table:table}});
|
||||
|
||||
assertThrows(() => table.grow(Infinity), RangeError);
|
|
@ -1,19 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction("foo", kSig_i_ii)
|
||||
.addBody([
|
||||
kExprLoop, 00,
|
||||
kExprBrTable, 0xfb, 0xff, 0xff, 0xff,
|
||||
])
|
||||
.exportFunc();
|
||||
assertThrows(function() { builder.instantiate(); });
|
||||
})();
|
|
@ -1,22 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(1, 1, false);
|
||||
builder.addFunction("foo", kSig_i_v)
|
||||
.addBody([
|
||||
kExprI32Const, 0x00,
|
||||
kExprI32Const, 0x0b,
|
||||
kExprI32Const, 0x0f,
|
||||
kExprBrTable, 0xcb, 0xcb, 0xcb, 0x00, 0x00, 0xcb, 0x00 // entries=1238475
|
||||
])
|
||||
.exportFunc();
|
||||
assertThrows(function() { builder.instantiate(); });
|
||||
})();
|
|
@ -1,56 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function AddTest() {
|
||||
let builder = new WasmModuleBuilder();
|
||||
|
||||
builder.addFunction("main", kSig_i_v)
|
||||
.addBody([
|
||||
kExprBlock, kWasmStmt,
|
||||
kExprI64Const, 0,
|
||||
// 0x80 ... 0x10 is the LEB encoding of 0x100000000. This is chosen so
|
||||
// that the 64-bit constant has a non-zero top half. In this bug, the
|
||||
// top half was clobbering eax, leading to the function return 1 rather
|
||||
// than 0.
|
||||
kExprI64Const, 0x80, 0x80, 0x80, 0x80, 0x10,
|
||||
kExprI64Add,
|
||||
kExprI64Eqz,
|
||||
kExprBrIf, 0,
|
||||
kExprI32Const, 0,
|
||||
kExprReturn,
|
||||
kExprEnd,
|
||||
kExprI32Const, 0
|
||||
])
|
||||
.exportFunc();
|
||||
let module = builder.instantiate();
|
||||
assertEquals(0, module.exports.main());
|
||||
})();
|
||||
|
||||
(function SubTest() {
|
||||
let builder = new WasmModuleBuilder();
|
||||
|
||||
builder.addFunction("main", kSig_i_v)
|
||||
.addBody([
|
||||
kExprBlock, kWasmStmt,
|
||||
kExprI64Const, 0,
|
||||
// 0x80 ... 0x10 is the LEB encoding of 0x100000000. This is chosen so
|
||||
// that the 64-bit constant has a non-zero top half. In this bug, the
|
||||
// top half was clobbering eax, leading to the function return 1 rather
|
||||
// than 0.
|
||||
kExprI64Const, 0x80, 0x80, 0x80, 0x80, 0x10,
|
||||
kExprI64Sub,
|
||||
kExprI64Eqz,
|
||||
kExprBrIf, 0,
|
||||
kExprI32Const, 0,
|
||||
kExprReturn,
|
||||
kExprEnd,
|
||||
kExprI32Const, 0
|
||||
])
|
||||
.exportFunc();
|
||||
let module = builder.instantiate();
|
||||
assertEquals(0, module.exports.main());
|
||||
})();
|
|
@ -1,30 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
let module1 = (() => {
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addMemory(1, 1);
|
||||
builder.addFunction('load', kSig_i_i)
|
||||
.addBody([kExprI32Const, 0, kExprI32LoadMem, 0, 0])
|
||||
.exportAs('load');
|
||||
return new WebAssembly.Module(builder.toBuffer());
|
||||
})();
|
||||
|
||||
let module2 = (() => {
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addMemory(1, 1);
|
||||
builder.addImport('A', 'load', kSig_i_i);
|
||||
builder.addExportOfKind('load', kExternalFunction, 0);
|
||||
return new WebAssembly.Module(builder.toBuffer());
|
||||
})();
|
||||
|
||||
let instance1 = new WebAssembly.Instance(module1);
|
||||
let instance2 = new WebAssembly.Instance(module2, {A: instance1.exports});
|
||||
|
||||
assertEquals(0, instance2.exports.load());
|
|
@ -1,20 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(31, 31, false);
|
||||
builder.addFunction('test', kSig_i_iii)
|
||||
.addBodyWithEnd([
|
||||
// body:
|
||||
kExprI64Const, 0x41, kExprI64Const, 0x41, kExprI64LtS, kExprI32Const,
|
||||
0x01, kExprI32StoreMem, 0x00, 0x41, kExprUnreachable,
|
||||
kExprEnd, // @60
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
})();
|
|
@ -1,19 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(31, 31, false);
|
||||
builder.addFunction('test', kSig_l_v)
|
||||
.addBodyWithEnd([
|
||||
// body:
|
||||
kExprUnreachable,
|
||||
kExprEnd, // @374
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
})();
|
|
@ -1,26 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction("regression_644682", kSig_i_v)
|
||||
.addBody([
|
||||
kExprBlock, // @1
|
||||
kExprI32Const, 0x3b,
|
||||
kExprI32LoadMem, 0x00, 0x00,
|
||||
kExprI32Const, 0x10,
|
||||
kExprBrIf, 0x01, 0x00, // arity=1 depth0
|
||||
kExprI32Const, 0x45,
|
||||
kExprI32Const, 0x3b,
|
||||
kExprI64LoadMem16S, 0x00, 0x3b,
|
||||
kExprBrIf, 0x01, 0x00 // arity=1 depth0
|
||||
])
|
||||
.exportFunc();
|
||||
assertThrows(function() { builder.instantiate(); });
|
||||
})();
|
|
@ -1,24 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(1, 32, false);
|
||||
builder.addFunction("foo", kSig_i_v)
|
||||
.addBody([
|
||||
kExprMemorySize, kMemoryZero,
|
||||
kExprI32Const, 0x10,
|
||||
kExprMemoryGrow, kMemoryZero,
|
||||
kExprI32Mul,
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
var result = module.exports.foo();
|
||||
assertEquals(1, result);
|
||||
})();
|
|
@ -1,23 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(1, 1, false);
|
||||
builder.addFunction("foo", kSig_i_v)
|
||||
.addBody([
|
||||
kExprI32Const, 00,
|
||||
kExprMemorySize,
|
||||
kExprBrIf, 00,
|
||||
kExprMemorySize,
|
||||
kExprBr, 0xe7, 0xd2, 0xf2, 0xff, 0x1d
|
||||
])
|
||||
.exportFunc();
|
||||
assertThrows(function() { builder.instantiate(); });
|
||||
})();
|
|
@ -1,14 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
var module = builder.instantiate();
|
||||
assertTrue(typeof(module.exports) != "undefined");
|
||||
})();
|
|
@ -1,389 +0,0 @@
|
|||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(0, 0, false);
|
||||
builder.addFunction("test", kSig_i_iii)
|
||||
.addBody([
|
||||
kExprI32Const, 0x0b,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x67,
|
||||
kExprI32Const, 0x07,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Eq,
|
||||
kExprI32RemU,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x25,
|
||||
kExprI32Const, 0x82, 0x6c,
|
||||
kExprI32Add,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x70,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x70,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x67,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32GeS,
|
||||
kExprI32Const, 0x67,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprDrop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x01,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprSelect,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x0e,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x01,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprSelect,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x0e,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x01,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprSelect,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x0e,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x01,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprSelect,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x0e,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x4a,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32LtU,
|
||||
kExprI32Const, 0x67,
|
||||
kExprI32Clz,
|
||||
kExprI32GtS,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Ne,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x1a,
|
||||
kExprI32Const, 0x71,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32ShrS,
|
||||
kExprI32Clz,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprI32Clz,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Const, 0x4a,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32LtU,
|
||||
kExprI32Const, 0x67,
|
||||
kExprI32Clz,
|
||||
kExprI32GtS,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Ne,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x1a,
|
||||
kExprI32Const, 0x71,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32And,
|
||||
kExprI32ShrS,
|
||||
kExprI32Clz,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprI32Clz,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprI32Clz,
|
||||
kExprUnreachable,
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprCallFunction, 0x00, // function #0
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprNop,
|
||||
kExprReturn
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
assertTrue(module != undefined);
|
||||
})();
|
|
@ -1,34 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
var name = 'regression_684858';
|
||||
|
||||
function patchNameLength(buffer) {
|
||||
var count = 0;
|
||||
var view = new Uint8Array(buffer);
|
||||
for (var i = 0, e = view.length - name.length; i <= e; ++i) {
|
||||
var subs = String.fromCharCode.apply(null, view.slice(i, i + name.length));
|
||||
if (subs != name) continue;
|
||||
++count;
|
||||
// One byte before this name, its length is encoded.
|
||||
// Patch this to 127, making it out of bounds.
|
||||
if (view.length >= 127) throw Error('cannot patch reliably');
|
||||
if (view[i - 1] != name.length) throw Error('unexpected length');
|
||||
view[i - 1] = 0x7f;
|
||||
}
|
||||
if (count != 1) throw Error('did not find name');
|
||||
}
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction(name, kSig_i_v)
|
||||
.addBody([kExprI32Const, 2, kExprI32Const, 0, kExprI32DivU])
|
||||
.exportAs('main');
|
||||
var buffer = builder.toBuffer();
|
||||
patchNameLength(buffer);
|
||||
var module = new WebAssembly.Module(buffer);
|
||||
var instance = new WebAssembly.Instance(module);
|
||||
assertThrows(() => instance.exports.main(), WebAssembly.RuntimeError);
|
|
@ -1,42 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(16, 32, false);
|
||||
builder.addFunction('test', kSig_i_i)
|
||||
.addBodyWithEnd([
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x45,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32DivU,
|
||||
kExprI32LoadMem8S, 0x00, 0x3a,
|
||||
kExprI32Const, 0x75,
|
||||
kExprI32Const, 0x75,
|
||||
kExprI32Const, 0x6e,
|
||||
kExprI32Eqz,
|
||||
kExprI32LoadMem8S, 0x00, 0x3a,
|
||||
kExprI32Add,
|
||||
kExprI32DivU,
|
||||
kExprI32LoadMem8S, 0x00, 0x74,
|
||||
kExprI32And,
|
||||
kExprI32Eqz,
|
||||
kExprI32And,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprI32Const, 0x55,
|
||||
kExprI32LoadMem8S, 0x00, 0x3a,
|
||||
kExprI32LoadMem16U, 0x00, 0x71,
|
||||
kExprI32Const, 0x00,
|
||||
kExprI32RemU,
|
||||
kExprI32And,
|
||||
kExprI32Eqz,
|
||||
kExprEnd, // @44
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
assertThrows(() => {module.exports.test(1);});
|
||||
})();
|
|
@ -1,25 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(16, 32, false);
|
||||
builder.addFunction('test', kSig_i_i)
|
||||
.addBodyWithEnd([
|
||||
kExprGetLocal, 0x00,
|
||||
kExprI32Const, 0x29,
|
||||
kExprI32Shl,
|
||||
kExprI32Const, 0x18,
|
||||
kExprI32ShrS,
|
||||
kExprI32Const, 0x18,
|
||||
kExprI32Shl,
|
||||
kExprEnd,
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
assertEquals(0, module.exports.test(16));
|
||||
})();
|
|
@ -1,30 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
|
||||
// This test checks for accidental sign extension. The Wasm spec says we do
|
||||
// arbitrary precision unsigned arithmetic to compute the memory address,
|
||||
// meaning this test should do 0xfffffffc + 8, which is 0x100000004 and out of
|
||||
// bounds. However, if we interpret 0xfffffffc as -4, then the result is 4 and
|
||||
// succeeds erroneously.
|
||||
|
||||
|
||||
(function() {
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addMemory(1, 1, false);
|
||||
builder.addFunction('test', kSig_v_v)
|
||||
.addBody([
|
||||
kExprI32Const, 0x7c, // address = -4
|
||||
kExprI32Const, 0,
|
||||
kExprI32StoreMem, 0, 8, // align = 0, offset = 8
|
||||
])
|
||||
.exportFunc();
|
||||
let module = builder.instantiate();
|
||||
|
||||
assertTraps(kTrapMemOutOfBounds, module.exports.test);
|
||||
})();
|
|
@ -1,22 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
"use asm";
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(0, 5, false);
|
||||
builder.addFunction("regression_699485", kSig_i_v)
|
||||
.addBody([
|
||||
kExprI32Const, 0x04,
|
||||
kExprNop,
|
||||
kExprMemoryGrow, 0x00,
|
||||
]).exportFunc();
|
||||
let module = builder.instantiate();
|
||||
assertEquals(0, module.exports.regression_699485());
|
||||
})();
|
|
@ -1,51 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
// Non-standard opcodes.
|
||||
let kSig_s_v = makeSig([], [kWasmS128]);
|
||||
let kExprS128LoadMem = 0xc0;
|
||||
|
||||
(function() {
|
||||
"use asm";
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction("regression_702460", kSig_i_v)
|
||||
.addBody([
|
||||
kExprI32Const, 0x52,
|
||||
kExprI32Const, 0x41,
|
||||
kExprI32Const, 0x3c,
|
||||
kExprI32Const, 0xdc, 0x01,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprSetLocal, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprS128LoadMem, 0x00, 0x40,
|
||||
kExprUnreachable,
|
||||
kExprMemoryGrow, 0x00
|
||||
]).exportFunc();
|
||||
assertThrows(() => builder.instantiate());
|
||||
})();
|
|
@ -1,20 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction('test', kSig_i_iii)
|
||||
.addBodyWithEnd([
|
||||
kExprI32Const, 0x07, // i32.const 7
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprI32And, // i32.and
|
||||
kExprI32And, // i32.and
|
||||
kExprEnd, // -
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
assertEquals(0, module.exports.test());
|
|
@ -1,31 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction('test', kSig_i_iii)
|
||||
.addBodyWithEnd([
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprI32Add, // i32.add -> 0
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprI32Add, // i32.add -> 0
|
||||
kExprI32Add, // i32.add -> 0
|
||||
kExprI32Const, 0x01, // i32.const 1
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprI32Add, // i32.add -> 1
|
||||
kExprBlock, 0x7f, // @39 i32
|
||||
kExprI32Const, 0x00, // i32.const 0
|
||||
kExprBr, 0x00, // depth=0
|
||||
kExprEnd, // @90
|
||||
kExprI32Add, // i32.add -> 1
|
||||
kExprI32Add, // i32.add -> 1
|
||||
kExprEnd
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
assertEquals(1, module.exports.test());
|
|
@ -1,54 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax --expose-gc
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
// Build two instances, instance 2 is interpreted, and calls instance 1 (via
|
||||
// C_WASM_ENTRY), instance 1 then calls JS, which triggers GC.
|
||||
|
||||
let builder1 = new WasmModuleBuilder();
|
||||
|
||||
function call_gc() {
|
||||
print('Triggering GC.');
|
||||
gc();
|
||||
print('Survived GC.');
|
||||
}
|
||||
let func1_sig = makeSig(new Array(8).fill(kWasmI32), [kWasmI32]);
|
||||
let imp = builder1.addImport('q', 'gc', kSig_v_v);
|
||||
let func1 = builder1.addFunction('func1', func1_sig)
|
||||
.addBody([
|
||||
kExprGetLocal, 0, // -
|
||||
kExprCallFunction, imp
|
||||
])
|
||||
.exportFunc();
|
||||
let instance1 = builder1.instantiate({q: {gc: call_gc}});
|
||||
|
||||
let builder2 = new WasmModuleBuilder();
|
||||
|
||||
let func1_imp = builder2.addImport('q', 'func1', func1_sig);
|
||||
let func2 = builder2.addFunction('func2', kSig_i_i)
|
||||
.addBody([
|
||||
kExprGetLocal, 0, // 1
|
||||
kExprGetLocal, 0, // 2
|
||||
kExprGetLocal, 0, // 3
|
||||
kExprGetLocal, 0, // 4
|
||||
kExprGetLocal, 0, // 5
|
||||
kExprGetLocal, 0, // 6
|
||||
kExprGetLocal, 0, // 7
|
||||
kExprGetLocal, 0, // 8
|
||||
kExprCallFunction, func1_imp
|
||||
])
|
||||
.exportFunc();
|
||||
|
||||
let instance2 = builder2.instantiate({q: {func1: instance1.exports.func1}});
|
||||
|
||||
%RedirectToWasmInterpreter(
|
||||
instance2, parseInt(instance2.exports.func2.name));
|
||||
|
||||
// Call with 1. This will be passed by the C_WASM_ENTRY via the stack, and the
|
||||
// GC will try to dereference it (before the bug fix).
|
||||
instance2.exports.func2(1);
|
|
@ -1,23 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
|
||||
builder.addExplicitSection([kFunctionSectionCode,
|
||||
// length
|
||||
7,
|
||||
// functions count
|
||||
1,
|
||||
// signature index (invalid LEB)
|
||||
0xff, 0xff, 0xff, 0xff, 0xff]);
|
||||
builder.addExplicitSection([kStartSectionCode,
|
||||
// length
|
||||
1,
|
||||
// index
|
||||
0]);
|
||||
|
||||
assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
|
|
@ -1,78 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-wasm --allow-natives-syntax
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
let importingModuleBinary1 = (() => {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addImport('', 'f', kSig_i_v);
|
||||
return new Int8Array(builder.toBuffer());
|
||||
})();
|
||||
|
||||
let importingModuleBinary2 = (() => {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addImport('', 'f', kSig_i_v);
|
||||
builder.addFunction('g', kSig_v_v)
|
||||
.addBody([kExprNop]);
|
||||
return new Int8Array(builder.toBuffer());
|
||||
})();
|
||||
|
||||
let importingModuleBinary3 = (() => {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addImport('', 'f', kSig_i_v);
|
||||
builder.addImport('', 'f2', kSig_i_v);
|
||||
builder.addFunction('g', kSig_v_v)
|
||||
.addBody([kExprNop]);
|
||||
return new Int8Array(builder.toBuffer());
|
||||
})();
|
||||
|
||||
let importingModuleBinary4 = (() => {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction('g', kSig_v_v)
|
||||
.addBody([kExprNop]);
|
||||
return new Int8Array(builder.toBuffer());
|
||||
})();
|
||||
|
||||
const complexImportingModuleBinary1 = (() => {
|
||||
let builder = new WasmModuleBuilder();
|
||||
|
||||
builder.addImport('a', 'b', kSig_v_v);
|
||||
builder.addImportedMemory('c', 'd', 1);
|
||||
builder.addImportedTable('e', 'f', 1);
|
||||
builder.addImportedGlobal('g', '⚡', kWasmI32);
|
||||
builder.addFunction('g', kSig_v_v)
|
||||
.addBody([kExprNop]);
|
||||
return builder.toBuffer();
|
||||
})();
|
||||
|
||||
const complexImportingModuleBinary2 = (() => {
|
||||
let builder = new WasmModuleBuilder();
|
||||
|
||||
builder.addImport('a', 'b', kSig_v_v);
|
||||
builder.addImportedMemory('c', 'd', 1);
|
||||
builder.addImportedTable('e', 'f', 1);
|
||||
builder.addImportedGlobal('g', '⚡', kWasmI32);
|
||||
builder.addFunction('g', kSig_v_v)
|
||||
.addBody([kExprNop]);
|
||||
return builder.toBuffer();
|
||||
})();
|
||||
|
||||
var tests = [
|
||||
importingModuleBinary1,
|
||||
importingModuleBinary2,
|
||||
importingModuleBinary3,
|
||||
importingModuleBinary4,
|
||||
complexImportingModuleBinary1,
|
||||
complexImportingModuleBinary2
|
||||
];
|
||||
|
||||
for (var index in tests) {
|
||||
assertPromiseResult(
|
||||
WebAssembly.compile(tests[index]),
|
||||
m => assertTrue(m instanceof WebAssembly.Module),
|
||||
assertUnreachable);
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
"use asm";
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(0, 5, true);
|
||||
builder.addFunction("regression_710844", kSig_v_v)
|
||||
.addBody([
|
||||
kExprI32Const, 0x03,
|
||||
kExprNop,
|
||||
kExprMemoryGrow, 0x00,
|
||||
kExprI32Const, 0x13,
|
||||
kExprNop,
|
||||
kExprI32StoreMem8, 0x00, 0x10
|
||||
]).exportFunc();
|
||||
let instance = builder.instantiate();
|
||||
instance.exports.regression_710844();
|
||||
})();
|
|
@ -1,30 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
(function() {
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(16, 32, false);
|
||||
builder.addFunction("test", kSig_i_iii)
|
||||
.addBodyWithEnd([
|
||||
// body:
|
||||
kExprI64Const, 0,
|
||||
kExprI64Const, 0x1,
|
||||
kExprI64Clz,
|
||||
kExprI64Sub,
|
||||
kExprI64Const, 0x10,
|
||||
kExprI64Const, 0x1b,
|
||||
kExprI64Shl,
|
||||
kExprI64Sub,
|
||||
kExprI64Popcnt,
|
||||
kExprI32ConvertI64,
|
||||
kExprEnd, // @207
|
||||
])
|
||||
.exportFunc();
|
||||
var module = builder.instantiate();
|
||||
const result = module.exports.test(1, 2, 3);
|
||||
assertEquals(58, result);
|
||||
})();
|
|
@ -1,13 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --wasm-interpret-all --wasm-lazy-compilation
|
||||
|
||||
load("test/mjsunit/wasm/wasm-constants.js");
|
||||
load("test/mjsunit/wasm/wasm-module-builder.js");
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction('f', kSig_v_v).addBody([]);
|
||||
builder.addFunction('g', kSig_v_v).addBody([]);
|
||||
builder.instantiate();
|
|
@ -1,16 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addFunction('f', kSig_v_v).addBody([
|
||||
kExprI32Const, 0, kExprBrTable,
|
||||
// 0x80000000 in LEB:
|
||||
0x80, 0x80, 0x80, 0x80, 0x08,
|
||||
// First break target. Creation of this node triggered the bug.
|
||||
0
|
||||
]);
|
||||
assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
|
|
@ -1,14 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
// Flags: --wasm-max-mem-pages=49152
|
||||
|
||||
let builder = new WasmModuleBuilder();
|
||||
const num_pages = 49152;
|
||||
builder.addMemory(num_pages, num_pages);
|
||||
// num_pages * 64k (page size) > kMaxInt.
|
||||
assertThrows(() => builder.instantiate(), RangeError);
|
|
@ -1,12 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --wasm-lazy-compilation
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addFunction('f', kSig_i_v).addBody([kExprReturn]);
|
||||
assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
|
|
@ -1,11 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(0, 0, true);
|
||||
var instance = builder.instantiate();
|
||||
instance.exports.memory.buffer;
|
|
@ -1,14 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
var builder = new WasmModuleBuilder();
|
||||
builder.addMemory(0, 0, false);
|
||||
builder.addFunction('f', kSig_i_v)
|
||||
.addBody([kExprMemorySize, kMemoryZero])
|
||||
.exportFunc();
|
||||
var instance = builder.instantiate();
|
||||
instance.exports.f();
|
|
@ -1,18 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
{
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addMemory();
|
||||
builder.exportMemoryAs("exported_mem");
|
||||
i1 = builder.instantiate();
|
||||
}
|
||||
{
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addImportedMemory("fil", "imported_mem");
|
||||
i2 = builder.instantiate({fil: {imported_mem: i1.exports.exported_mem}});
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addCustomSection('BBBB', []);
|
||||
builder.addCustomSection('AAAA', new Array(32).fill(0));
|
||||
let buffer = builder.toBuffer();
|
||||
// Shrink the buffer by 30 bytes (content of the unknown section named 'AAAA').
|
||||
buffer = buffer.slice(0, buffer.byteLength - 30);
|
||||
// Instantiation should fail on the truncated buffer.
|
||||
assertThrows(() => new WebAssembly.Module(buffer), WebAssembly.CompileError);
|
|
@ -1,16 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addExplicitSection([
|
||||
kUnknownSectionCode,
|
||||
// section length
|
||||
0x0f,
|
||||
// name length: 0xffffffff
|
||||
0xf9, 0xff, 0xff, 0xff, 0x0f
|
||||
]);
|
||||
assertThrows(() => builder.instantiate(), WebAssembly.CompileError);
|
|
@ -1,28 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --expose-gc
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
builder1 = new WasmModuleBuilder();
|
||||
builder1.addFunction('exp1', kSig_v_v).addBody([kExprUnreachable]).exportFunc();
|
||||
|
||||
builder2 = new WasmModuleBuilder();
|
||||
builder2.addImport('imp', 'imp', kSig_v_v);
|
||||
builder2.addFunction('call_imp', kSig_v_v)
|
||||
.addBody([kExprCallFunction, 0])
|
||||
.exportFunc();
|
||||
|
||||
export1 = builder1.instantiate().exports.exp1;
|
||||
export2 = builder2.instantiate({imp: {imp: export1}}).exports.call_imp;
|
||||
export1 = undefined;
|
||||
|
||||
let a = [0];
|
||||
for (i = 0; i < 10; ++i) {
|
||||
a = a.concat(new Array(i).fill(i));
|
||||
assertThrows(() => export2(), WebAssembly.RuntimeError);
|
||||
gc();
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --wasm-lazy-compilation
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
const builder = new WasmModuleBuilder();
|
||||
builder.addMemory(16, 32);
|
||||
builder.addFunction('grow', kSig_i_i).addBody([
|
||||
kExprGetLocal, 0,
|
||||
kExprMemoryGrow, 0,
|
||||
]).exportFunc();
|
||||
builder.addFunction('main', kSig_i_i).addBody([
|
||||
...wasmI32Const(0x41),
|
||||
kExprSetLocal, 0,
|
||||
// Enter loop, such that values are spilled to the stack.
|
||||
kExprLoop, kWasmStmt,
|
||||
kExprEnd,
|
||||
// Reload value. This must be loaded as 32 bit value.
|
||||
kExprGetLocal, 0,
|
||||
kExprI32LoadMem, 0, 0,
|
||||
]).exportFunc();
|
||||
const instance = builder.instantiate();
|
||||
// Execute grow, such that the stack contains garbage data afterwards.
|
||||
instance.exports.grow(1);
|
||||
instance.exports.main();
|
|
@ -1,31 +0,0 @@
|
|||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
const exportingModuleBinary = (() => {
|
||||
const builder = new WasmModuleBuilder();
|
||||
builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 42]).exportFunc();
|
||||
return builder.toBuffer();
|
||||
})();
|
||||
|
||||
const exportingModule = new WebAssembly.Module(exportingModuleBinary);
|
||||
const exportingInstance = new WebAssembly.Instance(exportingModule);
|
||||
|
||||
const reExportingModuleBinary = (() => {
|
||||
const builder = new WasmModuleBuilder();
|
||||
const gIndex = builder.addImport('a', 'g', kSig_i_v);
|
||||
builder.addExport('y', gIndex);
|
||||
return builder.toBuffer();
|
||||
})();
|
||||
|
||||
const module = new WebAssembly.Module(reExportingModuleBinary);
|
||||
const imports = {
|
||||
a: {g: exportingInstance.exports.f},
|
||||
};
|
||||
const instance = new WebAssembly.Instance(module, imports);
|
||||
|
||||
// Previously exported Wasm functions are re-exported with the same value
|
||||
assertEquals(instance.exports.y, exportingInstance.exports.f);
|
|
@ -1,17 +0,0 @@
|
|||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --wasm-lazy-compilation
|
||||
|
||||
load('test/mjsunit/wasm/wasm-constants.js');
|
||||
load('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
let mem = new WebAssembly.Memory({initial: 0});
|
||||
let builder = new WasmModuleBuilder();
|
||||
builder.addImportedMemory("mod", "imported_mem");
|
||||
builder.addFunction('mem_size', kSig_i_v)
|
||||
.addBody([kExprMemorySize, kMemoryZero])
|
||||
.exportFunc();
|
||||
let instance = builder.instantiate({mod: {imported_mem: mem}});
|
||||
instance.exports.mem_size();
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue