13void Heap::Atomics::init()
16 Scope scope(internalClass->engine);
17 ScopedObject m(scope,
this);
19 m->defineDefaultProperty(QStringLiteral(
"add"), QV4::Atomics::method_add, 3);
20 m->defineDefaultProperty(QStringLiteral(
"and"), QV4::Atomics::method_and, 3);
21 m->defineDefaultProperty(QStringLiteral(
"compareExchange"), QV4::Atomics::method_compareExchange, 4);
22 m->defineDefaultProperty(QStringLiteral(
"exchange"), QV4::Atomics::method_exchange, 3);
23 m->defineDefaultProperty(QStringLiteral(
"isLockFree"), QV4::Atomics::method_isLockFree, 1);
24 m->defineDefaultProperty(QStringLiteral(
"load"), QV4::Atomics::method_load, 2);
25 m->defineDefaultProperty(QStringLiteral(
"or"), QV4::Atomics::method_or, 3);
26 m->defineDefaultProperty(QStringLiteral(
"store"), QV4::Atomics::method_store, 3);
27 m->defineDefaultProperty(QStringLiteral(
"sub"), QV4::Atomics::method_sub, 3);
28 m->defineDefaultProperty(QStringLiteral(
"wait"), QV4::Atomics::method_wait, 4);
29 m->defineDefaultProperty(QStringLiteral(
"wake"), QV4::Atomics::method_wake, 3);
30 m->defineDefaultProperty(QStringLiteral(
"xor"), QV4::Atomics::method_xor, 3);
32 ScopedString name(scope, scope.engine->newString(QStringLiteral(
"Atomics")));
33 m->defineReadonlyConfigurableProperty(scope.engine->symbol_toStringTag(), name);
38 const TypedArray *a = typedArray.as<TypedArray>();
40 scope.engine->throwTypeError();
44 TypedArrayType t(a->arrayType());
45 if (!a->d()->type->atomicLoad || (onlyInt32 && t != TypedArrayType::Int32Array)) {
46 scope.engine->throwTypeError();
50 Scoped<SharedArrayBuffer> buffer(scope, a->d()->buffer);
51 if (!buffer->isSharedArrayBuffer()) {
52 scope.engine->throwTypeError();
55 Q_ASSERT(!buffer->hasDetachedArrayData());
76 return scope.engine->throwTypeError();
78 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
80 return Encode::undefined();
81 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
82 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
84 return Encode::undefined();
86 Value v = Value::fromReturnedValue((argc > 2 ? argv[2] : Value::undefinedValue()).convertedToNumber());
87 if (scope.hasException())
88 return Encode::undefined();
90 int bytesPerElement = a.d()->type->bytesPerElement;
91 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
93 return a.d()->type->atomicModifyOps[modify](buffer->arrayData() + byteOffset, v);
106ReturnedValue Atomics::method_compareExchange(
const FunctionObject *f,
const Value *,
const Value *argv,
int argc)
110 return scope.engine->throwTypeError();
112 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
114 return Encode::undefined();
115 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
116 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
118 return Encode::undefined();
120 Value expected = Value::fromReturnedValue((argc > 2 ? argv[2] : Value::undefinedValue()).convertedToNumber());
121 if (scope.hasException())
122 return Encode::undefined();
123 Value v = Value::fromReturnedValue((argc > 3 ? argv[3] : Value::undefinedValue()).convertedToNumber());
124 if (scope.hasException())
125 return Encode::undefined();
127 int bytesPerElement = a.d()->type->bytesPerElement;
128 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
130 return a.d()->type->atomicCompareExchange(buffer->arrayData() + byteOffset, expected, v);
154ReturnedValue Atomics::method_load(
const FunctionObject *f,
const Value *,
const Value *argv,
int argc)
158 return scope.engine->throwTypeError();
160 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
162 return Encode::undefined();
163 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
164 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
166 return Encode::undefined();
168 int bytesPerElement = a.d()->type->bytesPerElement;
169 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
171 return a.d()->type->atomicLoad(buffer->arrayData() + byteOffset);
179ReturnedValue Atomics::method_store(
const FunctionObject *f,
const Value *,
const Value *argv,
int argc)
183 return scope.engine->throwTypeError();
185 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
187 return Encode::undefined();
188 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
189 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
191 return Encode::undefined();
193 Value v = Value::fromReturnedValue((argc > 2 ? argv[2] : Value::undefinedValue()).convertedToNumber());
194 if (scope.hasException())
195 return Encode::undefined();
197 int bytesPerElement = a.d()->type->bytesPerElement;
198 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
200 return a.d()->type->atomicStore(buffer->arrayData() + byteOffset, v);