2018-04-19 16:11:50 +02:00
// Copyright (C) 2018 Amal Hussein. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/ * - - -
esid : sec - atomics . wait
description : >
Throws a TypeError if index arg can not be converted to an Integer
info : |
Atomics . wait ( typedArray , index , value , timeout )
2. Let i be ? ValidateAtomicAccess ( typedArray , index ) .
ValidateAtomicAccess ( typedArray , requestIndex )
2. Let accessIndex be ? ToIndex ( requestIndex ) .
ToIndex ( value )
2. Else ,
a . Let integerIndex be ? ToInteger ( value ) .
ToInteger ( value )
1. Let number be ? ToNumber ( argument ) .
Symbol -- > Throw a TypeError exception .
2018-05-21 20:23:15 +02:00
includes : [ atomicsHelper . js ]
2018-04-19 16:11:50 +02:00
features : [ Atomics , SharedArrayBuffer , Symbol , Symbol . toPrimitive , TypedArray ]
-- - * /
2018-05-21 20:23:15 +02:00
$262 . agent . start ( `
const poisonedValueOf = {
valueOf : function ( ) {
throw new Test262Error ( 'should not evaluate this code' ) ;
}
} ;
const poisonedToPrimitive = {
[ Symbol . toPrimitive ] : function ( ) {
throw new Test262Error ( "passing a poisoned object using @@ToPrimitive" ) ;
}
} ;
$262 . agent . receiveBroadcast ( function ( sab ) {
const i32a = new Int32Array ( sab ) ;
const start = $262 . agent . monotonicNow ( ) ;
try {
Atomics . wait ( i32a , Symbol ( "1" ) , poisonedValueOf , poisonedValueOf ) ;
} catch ( error ) {
$262 . agent . report ( 'Symbol("1")' ) ;
}
try {
Atomics . wait ( i32a , Symbol ( "2" ) , poisonedToPrimitive , poisonedToPrimitive ) ;
} catch ( error ) {
$262 . agent . report ( 'Symbol("2")' ) ;
}
$262 . agent . report ( $262 . agent . monotonicNow ( ) - start ) ;
$262 . agent . leaving ( ) ;
} ) ;
2018-04-19 16:11:50 +02:00
` );
2018-05-21 20:23:15 +02:00
const i32a = new Int32Array (
2018-06-25 21:17:45 +02:00
new SharedArrayBuffer ( Int32Array . BYTES _PER _ELEMENT * 4 )
2018-05-21 20:23:15 +02:00
) ;
2018-04-19 16:11:50 +02:00
2018-04-25 23:29:53 +02:00
$262 . agent . broadcast ( i32a . buffer ) ;
2018-04-19 16:11:50 +02:00
$262 . agent . sleep ( 150 ) ;
2018-06-27 18:58:02 +02:00
assert . sameValue (
$262 . agent . getReport ( ) ,
'Symbol("1")' ,
'$262.agent.getReport() returns "Symbol("1")"'
) ;
assert . sameValue (
$262 . agent . getReport ( ) ,
'Symbol("2")' ,
'$262.agent.getReport() returns "Symbol("2")"'
) ;
2018-04-19 16:11:50 +02:00
2018-06-27 17:13:23 +02:00
const lapse = $262 . agent . getReport ( ) ;
2018-04-19 16:11:50 +02:00
2018-06-27 18:58:02 +02:00
assert ( lapse >= 0 , 'The result of `(lapse >= 0)` is true (The result of `(lapse >= 0)` is true (timeout should be a min of 0ms))' ) ;
assert ( lapse <= $262 . agent . MAX _TIME _EPSILON , 'The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (The result of `(lapse <= $262.agent.MAX_TIME_EPSILON)` is true (timeout should be a max of $$262.agent.MAX_TIME_EPSILON))' ) ;
2018-04-19 16:11:50 +02:00
2018-06-27 18:58:02 +02:00
assert . sameValue ( Atomics . wake ( i32a , 0 ) , 0 , 'Atomics.wake(i32a, 0) returns 0' ) ;
2018-04-19 16:11:50 +02:00