diff options
Diffstat (limited to 'deps/v8/src/harmony-atomics.js')
-rw-r--r-- | deps/v8/src/harmony-atomics.js | 99 |
1 files changed, 88 insertions, 11 deletions
diff --git a/deps/v8/src/harmony-atomics.js b/deps/v8/src/harmony-atomics.js index aa81822d1e..d4e069641a 100644 --- a/deps/v8/src/harmony-atomics.js +++ b/deps/v8/src/harmony-atomics.js @@ -12,37 +12,53 @@ // Imports var GlobalObject = global.Object; +var MathMax; +var ToNumber; + +utils.Import(function(from) { + MathMax = from.MathMax; + ToNumber = from.ToNumber; +}); // ------------------------------------------------------------------- function CheckSharedTypedArray(sta) { - if (!%_IsSharedTypedArray(sta)) { + if (!%IsSharedTypedArray(sta)) { throw MakeTypeError(kNotSharedTypedArray, sta); } } function CheckSharedIntegerTypedArray(ia) { - if (!%_IsSharedIntegerTypedArray(ia)) { + if (!%IsSharedIntegerTypedArray(ia)) { throw MakeTypeError(kNotIntegerSharedTypedArray, ia); } } +function CheckSharedInteger32TypedArray(ia) { + CheckSharedIntegerTypedArray(ia); + if (%_ClassOf(ia) !== 'Int32Array') { + throw MakeTypeError(kNotInt32SharedTypedArray, ia); + } +} + //------------------------------------------------------------------- function AtomicsCompareExchangeJS(sta, index, oldValue, newValue) { CheckSharedTypedArray(sta); index = $toInteger(index); - if (index < 0 || index >= sta.length) { + if (index < 0 || index >= %_TypedArrayGetLength(sta)) { return UNDEFINED; } + oldValue = ToNumber(oldValue); + newValue = ToNumber(newValue); return %_AtomicsCompareExchange(sta, index, oldValue, newValue); } function AtomicsLoadJS(sta, index) { CheckSharedTypedArray(sta); index = $toInteger(index); - if (index < 0 || index >= sta.length) { + if (index < 0 || index >= %_TypedArrayGetLength(sta)) { return UNDEFINED; } return %_AtomicsLoad(sta, index); @@ -51,63 +67,70 @@ function AtomicsLoadJS(sta, index) { function AtomicsStoreJS(sta, index, value) { CheckSharedTypedArray(sta); index = $toInteger(index); - if (index < 0 || index >= sta.length) { + if (index < 0 || index >= %_TypedArrayGetLength(sta)) { return UNDEFINED; } + value = ToNumber(value); return %_AtomicsStore(sta, index, value); } function AtomicsAddJS(ia, index, value) { CheckSharedIntegerTypedArray(ia); index = $toInteger(index); - if (index < 0 || index >= ia.length) { + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { return UNDEFINED; } + value = ToNumber(value); return %_AtomicsAdd(ia, index, value); } function AtomicsSubJS(ia, index, value) { CheckSharedIntegerTypedArray(ia); index = $toInteger(index); - if (index < 0 || index >= ia.length) { + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { return UNDEFINED; } + value = ToNumber(value); return %_AtomicsSub(ia, index, value); } function AtomicsAndJS(ia, index, value) { CheckSharedIntegerTypedArray(ia); index = $toInteger(index); - if (index < 0 || index >= ia.length) { + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { return UNDEFINED; } + value = ToNumber(value); return %_AtomicsAnd(ia, index, value); } function AtomicsOrJS(ia, index, value) { CheckSharedIntegerTypedArray(ia); index = $toInteger(index); - if (index < 0 || index >= ia.length) { + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { return UNDEFINED; } + value = ToNumber(value); return %_AtomicsOr(ia, index, value); } function AtomicsXorJS(ia, index, value) { CheckSharedIntegerTypedArray(ia); index = $toInteger(index); - if (index < 0 || index >= ia.length) { + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { return UNDEFINED; } + value = ToNumber(value); return %_AtomicsXor(ia, index, value); } function AtomicsExchangeJS(ia, index, value) { CheckSharedIntegerTypedArray(ia); index = $toInteger(index); - if (index < 0 || index >= ia.length) { + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { return UNDEFINED; } + value = ToNumber(value); return %_AtomicsExchange(ia, index, value); } @@ -115,6 +138,50 @@ function AtomicsIsLockFreeJS(size) { return %_AtomicsIsLockFree(size); } +// Futexes + +function AtomicsFutexWaitJS(ia, index, value, timeout) { + CheckSharedInteger32TypedArray(ia); + index = $toInteger(index); + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { + return UNDEFINED; + } + if (IS_UNDEFINED(timeout)) { + timeout = INFINITY; + } else { + timeout = ToNumber(timeout); + if (NUMBER_IS_NAN(timeout)) { + timeout = INFINITY; + } else { + timeout = MathMax(0, timeout); + } + } + return %AtomicsFutexWait(ia, index, value, timeout); +} + +function AtomicsFutexWakeJS(ia, index, count) { + CheckSharedInteger32TypedArray(ia); + index = $toInteger(index); + if (index < 0 || index >= %_TypedArrayGetLength(ia)) { + return UNDEFINED; + } + count = MathMax(0, $toInteger(count)); + return %AtomicsFutexWake(ia, index, count); +} + +function AtomicsFutexWakeOrRequeueJS(ia, index1, count, value, index2) { + CheckSharedInteger32TypedArray(ia); + index1 = $toInteger(index1); + count = MathMax(0, $toInteger(count)); + value = TO_INT32(value); + index2 = $toInteger(index2); + if (index1 < 0 || index1 >= %_TypedArrayGetLength(ia) || + index2 < 0 || index2 >= %_TypedArrayGetLength(ia)) { + return UNDEFINED; + } + return %AtomicsFutexWakeOrRequeue(ia, index1, count, value, index2); +} + // ------------------------------------------------------------------- function AtomicsConstructor() {} @@ -127,6 +194,13 @@ var Atomics = new AtomicsConstructor(); %AddNamedProperty(Atomics, symbolToStringTag, "Atomics", READ_ONLY | DONT_ENUM); +// These must match the values in src/futex-emulation.h +utils.InstallConstants(Atomics, [ + "OK", 0, + "NOTEQUAL", -1, + "TIMEDOUT", -2, +]); + utils.InstallFunctions(Atomics, DONT_ENUM, [ "compareExchange", AtomicsCompareExchangeJS, "load", AtomicsLoadJS, @@ -138,6 +212,9 @@ utils.InstallFunctions(Atomics, DONT_ENUM, [ "xor", AtomicsXorJS, "exchange", AtomicsExchangeJS, "isLockFree", AtomicsIsLockFreeJS, + "futexWait", AtomicsFutexWaitJS, + "futexWake", AtomicsFutexWakeJS, + "futexWakeOrRequeue", AtomicsFutexWakeOrRequeueJS, ]); }) |