static bool ValidateMathBuiltin(JSContext *cx, AsmJSModule::Global &global, HandleValue globalVal) { RootedValue v(cx); if (!GetDataProperty(cx, globalVal, cx->names().Math, &v)) return false; RootedPropertyName field(cx, global.mathName()); if (!GetDataProperty(cx, v, field, &v)) return false; Native native = nullptr; switch (global.mathBuiltin()) { case AsmJSMathBuiltin_sin: native = math_sin; break; case AsmJSMathBuiltin_cos: native = math_cos; break; case AsmJSMathBuiltin_tan: native = math_tan; break; case AsmJSMathBuiltin_asin: native = math_asin; break; case AsmJSMathBuiltin_acos: native = math_acos; break; case AsmJSMathBuiltin_atan: native = math_atan; break; case AsmJSMathBuiltin_ceil: native = math_ceil; break; case AsmJSMathBuiltin_floor: native = math_floor; break; case AsmJSMathBuiltin_exp: native = math_exp; break; case AsmJSMathBuiltin_log: native = math_log; break; case AsmJSMathBuiltin_pow: native = js_math_pow; break; case AsmJSMathBuiltin_sqrt: native = js_math_sqrt; break; case AsmJSMathBuiltin_abs: native = js_math_abs; break; case AsmJSMathBuiltin_atan2: native = math_atan2; break; case AsmJSMathBuiltin_imul: native = math_imul; break; case AsmJSMathBuiltin_fround: native = math_fround; break; } if (!IsNativeFunction(v, native)) return LinkFail(cx, "bad Math.* builtin"); return true; }