summaryrefslogtreecommitdiff
path: root/deps/v8/src/harmony-atomics.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/harmony-atomics.js')
-rw-r--r--deps/v8/src/harmony-atomics.js99
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,
]);
})