static bool ValidateAtomicsBuiltinFunction(JSContext *cx, AsmJSModule::Global &global, HandleValue globalVal) { RootedValue v(cx); if (!GetDataProperty(cx, globalVal, cx->names().Atomics, &v)) return false; RootedPropertyName field(cx, global.atomicsName()); if (!GetDataProperty(cx, v, field, &v)) return false; Native native = nullptr; switch (global.atomicsBuiltinFunction()) { case AsmJSAtomicsBuiltin_compareExchange: native = atomics_compareExchange; break; case AsmJSAtomicsBuiltin_load: native = atomics_load; break; case AsmJSAtomicsBuiltin_store: native = atomics_store; break; case AsmJSAtomicsBuiltin_fence: native = atomics_fence; break; case AsmJSAtomicsBuiltin_add: native = atomics_add; break; case AsmJSAtomicsBuiltin_sub: native = atomics_sub; break; case AsmJSAtomicsBuiltin_and: native = atomics_and; break; case AsmJSAtomicsBuiltin_or: native = atomics_or; break; case AsmJSAtomicsBuiltin_xor: native = atomics_xor; break; } if (!IsNativeFunction(v, native)) return LinkFail(cx, "bad Atomics.* builtin function"); return true; }