12void Heap::Atomics::init()
15 Scope scope(internalClass->engine);
16 ScopedObject m(scope,
this);
18 m->defineDefaultProperty(QStringLiteral(
"add"), QV4::Atomics::method_add, 3);
19 m->defineDefaultProperty(QStringLiteral(
"and"), QV4::Atomics::method_and, 3);
20 m->defineDefaultProperty(QStringLiteral(
"compareExchange"), QV4::Atomics::method_compareExchange, 4);
21 m->defineDefaultProperty(QStringLiteral(
"exchange"), QV4::Atomics::method_exchange, 3);
22 m->defineDefaultProperty(QStringLiteral(
"isLockFree"), QV4::Atomics::method_isLockFree, 1);
23 m->defineDefaultProperty(QStringLiteral(
"load"), QV4::Atomics::method_load, 2);
24 m->defineDefaultProperty(QStringLiteral(
"or"), QV4::Atomics::method_or, 3);
25 m->defineDefaultProperty(QStringLiteral(
"store"), QV4::Atomics::method_store, 3);
26 m->defineDefaultProperty(QStringLiteral(
"sub"), QV4::Atomics::method_sub, 3);
27 m->defineDefaultProperty(QStringLiteral(
"wait"), QV4::Atomics::method_wait, 4);
28 m->defineDefaultProperty(QStringLiteral(
"wake"), QV4::Atomics::method_wake, 3);
29 m->defineDefaultProperty(QStringLiteral(
"xor"), QV4::Atomics::method_xor, 3);
31 ScopedString name(scope, scope.engine->newString(QStringLiteral(
"Atomics")));
32 m->defineReadonlyConfigurableProperty(scope.engine->symbol_toStringTag(), name);
37 const TypedArray *a = typedArray.as<TypedArray>();
39 scope.engine->throwTypeError();
43 TypedArrayType t(a->arrayType());
44 if (!a->d()->type->atomicLoad || (onlyInt32 && t != TypedArrayType::Int32Array)) {
45 scope.engine->throwTypeError();
49 Scoped<SharedArrayBuffer> buffer(scope, a->d()->buffer);
50 if (!buffer->isSharedArrayBuffer()) {
51 scope.engine->throwTypeError();
54 Q_ASSERT(!buffer->hasDetachedArrayData());
75 return scope.engine->throwTypeError();
77 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
79 return Encode::undefined();
80 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
81 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
83 return Encode::undefined();
85 Value v = Value::fromReturnedValue((argc > 2 ? argv[2] : Value::undefinedValue()).convertedToNumber());
86 if (scope.hasException())
87 return Encode::undefined();
89 int bytesPerElement = a.d()->type->bytesPerElement;
90 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
92 return a.d()->type->atomicModifyOps[modify](buffer->arrayData() + byteOffset, v);
105ReturnedValue Atomics::method_compareExchange(
const FunctionObject *f,
const Value *,
const Value *argv,
int argc)
109 return scope.engine->throwTypeError();
111 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
113 return Encode::undefined();
114 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
115 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
117 return Encode::undefined();
119 Value expected = Value::fromReturnedValue((argc > 2 ? argv[2] : Value::undefinedValue()).convertedToNumber());
120 if (scope.hasException())
121 return Encode::undefined();
122 Value v = Value::fromReturnedValue((argc > 3 ? argv[3] : Value::undefinedValue()).convertedToNumber());
123 if (scope.hasException())
124 return Encode::undefined();
126 int bytesPerElement = a.d()->type->bytesPerElement;
127 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
129 return a.d()->type->atomicCompareExchange(buffer->arrayData() + byteOffset, expected, v);
153ReturnedValue Atomics::method_load(
const FunctionObject *f,
const Value *,
const Value *argv,
int argc)
157 return scope.engine->throwTypeError();
159 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
161 return Encode::undefined();
162 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
163 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
165 return Encode::undefined();
167 int bytesPerElement = a.d()->type->bytesPerElement;
168 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
170 return a.d()->type->atomicLoad(buffer->arrayData() + byteOffset);
178ReturnedValue Atomics::method_store(
const FunctionObject *f,
const Value *,
const Value *argv,
int argc)
182 return scope.engine->throwTypeError();
184 SharedArrayBuffer *buffer = validateSharedIntegerTypedArray(scope, argv[0]);
186 return Encode::undefined();
187 const TypedArray &a =
static_cast<
const TypedArray &>(argv[0]);
188 int index = validateAtomicAccess(scope, a, argc > 1 ? argv[1] : Value::undefinedValue());
190 return Encode::undefined();
192 Value v = Value::fromReturnedValue((argc > 2 ? argv[2] : Value::undefinedValue()).convertedToNumber());
193 if (scope.hasException())
194 return Encode::undefined();
196 int bytesPerElement = a.d()->type->bytesPerElement;
197 int byteOffset = a.d()->byteOffset + index * bytesPerElement;
199 return a.d()->type->atomicStore(buffer->arrayData() + byteOffset, v);