static bool ValidateSimdType(JSContext *cx, AsmJSModule::Global &global, HandleValue globalVal, MutableHandleValue out) { RootedValue v(cx); if (!GetDataProperty(cx, globalVal, cx->names().SIMD, &v)) return false; AsmJSSimdType type; if (global.which() == AsmJSModule::Global::SimdCtor) type = global.simdCtorType(); else type = global.simdOperationType(); RootedPropertyName simdTypeName(cx, SimdTypeToName(cx, type)); if (!GetDataProperty(cx, v, simdTypeName, &v)) return false; if (!v.isObject()) return LinkFail(cx, "bad SIMD type"); RootedObject simdDesc(cx, &v.toObject()); if (!simdDesc->is<SimdTypeDescr>()) return LinkFail(cx, "bad SIMD type"); if (AsmJSSimdTypeToTypeDescrType(type) != simdDesc->as<SimdTypeDescr>().type()) return LinkFail(cx, "bad SIMD type"); out.set(v); return true; }
static bool ValidateSimdOperation(JSContext *cx, AsmJSModule::Global &global, HandleValue globalVal) { // SIMD operations are loaded from the SIMD type, so the type must have been // validated before the operation. RootedValue v(cx); JS_ALWAYS_TRUE(ValidateSimdType(cx, global, globalVal, &v)); RootedPropertyName opName(cx, global.simdOperationName()); if (!GetDataProperty(cx, v, opName, &v)) return false; Native native = nullptr; switch (global.simdOperationType()) { #define SET_NATIVE_INT32X4(op) case AsmJSSimdOperation_##op: native = simd_int32x4_##op; break; #define SET_NATIVE_FLOAT32X4(op) case AsmJSSimdOperation_##op: native = simd_float32x4_##op; break; #define FALLTHROUGH(op) case AsmJSSimdOperation_##op: case AsmJSSimdType_int32x4: switch (global.simdOperation()) { FOREACH_INT32X4_SIMD_OP(SET_NATIVE_INT32X4) FOREACH_COMMONX4_SIMD_OP(SET_NATIVE_INT32X4) FOREACH_FLOAT32X4_SIMD_OP(FALLTHROUGH) MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("shouldn't have been validated in the first " "place"); } break; case AsmJSSimdType_float32x4: switch (global.simdOperation()) { FOREACH_FLOAT32X4_SIMD_OP(SET_NATIVE_FLOAT32X4) FOREACH_COMMONX4_SIMD_OP(SET_NATIVE_FLOAT32X4) FOREACH_INT32X4_SIMD_OP(FALLTHROUGH) MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("shouldn't have been validated in the first " "place"); } break; #undef FALLTHROUGH #undef SET_NATIVE_FLOAT32X4 #undef SET_NATIVE_INT32X4 #undef SET_NATIVE } if (!native || !IsNativeFunction(v, native)) return LinkFail(cx, "bad SIMD.type.* operation"); return true; }