static bool SendFunctionsToPerf(JSContext *cx, AsmJSModule &module) { if (!PerfFuncEnabled()) return true; uintptr_t base = (uintptr_t) module.codeBase(); const char *filename = module.scriptSource()->filename(); for (unsigned i = 0; i < module.numPerfFunctions(); i++) { const AsmJSModule::ProfiledFunction &func = module.perfProfiledFunction(i); uintptr_t start = base + (unsigned long) func.startCodeOffset; uintptr_t end = base + (unsigned long) func.endCodeOffset; JS_ASSERT(end >= start); size_t size = end - start; JSAutoByteString bytes; const char *name = AtomToPrintableString(cx, func.name, &bytes); if (!name) return false; writePerfSpewerAsmJSFunctionMap(start, size, filename, func.lineno, func.columnIndex, name); } return true; }
static bool SendFunctionsToPerf(JSContext *cx, AsmJSModule &module) { if (!PerfFuncEnabled()) return true; AsmJSPerfSpewer perfSpewer; unsigned long base = (unsigned long) module.functionCode(); const AsmJSModule::PostLinkFailureInfo &info = module.postLinkFailureInfo(); const char *filename = const_cast<char *>(info.scriptSource->filename()); for (unsigned i = 0; i < module.numPerfFunctions(); i++) { const AsmJSModule::ProfiledFunction &func = module.perfProfiledFunction(i); unsigned long start = base + (unsigned long) func.startCodeOffset; unsigned long end = base + (unsigned long) func.endCodeOffset; JS_ASSERT(end >= start); unsigned long size = (end - start); JSAutoByteString bytes; const char *method_name = AtomToPrintableString(cx, func.name, &bytes); if (!method_name) return false; unsigned lineno = func.lineno; unsigned columnIndex = func.columnIndex; perfSpewer.writeFunctionMap(start, size, filename, lineno, columnIndex, method_name); } return true; }