Index: src/harmony-atomics.js |
diff --git a/src/harmony-atomics.js b/src/harmony-atomics.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aa81822d1e2f877f4de933f02d269b81775eea11 |
--- /dev/null |
+++ b/src/harmony-atomics.js |
@@ -0,0 +1,143 @@ |
+// 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. |
+ |
+(function(global, utils) { |
+ |
+"use strict"; |
+ |
+%CheckIsBootstrapping(); |
+ |
+// ------------------------------------------------------------------- |
+// Imports |
+ |
+var GlobalObject = global.Object; |
+ |
+// ------------------------------------------------------------------- |
+ |
+ |
+function CheckSharedTypedArray(sta) { |
+ if (!%_IsSharedTypedArray(sta)) { |
+ throw MakeTypeError(kNotSharedTypedArray, sta); |
+ } |
+} |
+ |
+function CheckSharedIntegerTypedArray(ia) { |
+ if (!%_IsSharedIntegerTypedArray(ia)) { |
+ throw MakeTypeError(kNotIntegerSharedTypedArray, ia); |
+ } |
+} |
+ |
+//------------------------------------------------------------------- |
+ |
+function AtomicsCompareExchangeJS(sta, index, oldValue, newValue) { |
+ CheckSharedTypedArray(sta); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= sta.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsCompareExchange(sta, index, oldValue, newValue); |
+} |
+ |
+function AtomicsLoadJS(sta, index) { |
+ CheckSharedTypedArray(sta); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= sta.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsLoad(sta, index); |
+} |
+ |
+function AtomicsStoreJS(sta, index, value) { |
+ CheckSharedTypedArray(sta); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= sta.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsStore(sta, index, value); |
+} |
+ |
+function AtomicsAddJS(ia, index, value) { |
+ CheckSharedIntegerTypedArray(ia); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= ia.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsAdd(ia, index, value); |
+} |
+ |
+function AtomicsSubJS(ia, index, value) { |
+ CheckSharedIntegerTypedArray(ia); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= ia.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsSub(ia, index, value); |
+} |
+ |
+function AtomicsAndJS(ia, index, value) { |
+ CheckSharedIntegerTypedArray(ia); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= ia.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsAnd(ia, index, value); |
+} |
+ |
+function AtomicsOrJS(ia, index, value) { |
+ CheckSharedIntegerTypedArray(ia); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= ia.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsOr(ia, index, value); |
+} |
+ |
+function AtomicsXorJS(ia, index, value) { |
+ CheckSharedIntegerTypedArray(ia); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= ia.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsXor(ia, index, value); |
+} |
+ |
+function AtomicsExchangeJS(ia, index, value) { |
+ CheckSharedIntegerTypedArray(ia); |
+ index = $toInteger(index); |
+ if (index < 0 || index >= ia.length) { |
+ return UNDEFINED; |
+ } |
+ return %_AtomicsExchange(ia, index, value); |
+} |
+ |
+function AtomicsIsLockFreeJS(size) { |
+ return %_AtomicsIsLockFree(size); |
+} |
+ |
+// ------------------------------------------------------------------- |
+ |
+function AtomicsConstructor() {} |
+ |
+var Atomics = new AtomicsConstructor(); |
+ |
+%InternalSetPrototype(Atomics, GlobalObject.prototype); |
+%AddNamedProperty(global, "Atomics", Atomics, DONT_ENUM); |
+%FunctionSetInstanceClassName(AtomicsConstructor, 'Atomics'); |
+ |
+%AddNamedProperty(Atomics, symbolToStringTag, "Atomics", READ_ONLY | DONT_ENUM); |
+ |
+utils.InstallFunctions(Atomics, DONT_ENUM, [ |
+ "compareExchange", AtomicsCompareExchangeJS, |
+ "load", AtomicsLoadJS, |
+ "store", AtomicsStoreJS, |
+ "add", AtomicsAddJS, |
+ "sub", AtomicsSubJS, |
+ "and", AtomicsAndJS, |
+ "or", AtomicsOrJS, |
+ "xor", AtomicsXorJS, |
+ "exchange", AtomicsExchangeJS, |
+ "isLockFree", AtomicsIsLockFreeJS, |
+]); |
+ |
+}) |