commit b2fee3b5a19cfa559c0bca81ac98165260530d72
parent 72aeedf32d5a4f0e43a648aa5143de20e176d07f
Author: Nazım Can Altınova <canaltinova@gmail.com>
Date: Tue, 21 Oct 2025 23:59:08 +0000
Bug 1979114 - Convert the JS sources into JS objects in additionalInfo r=mstange,profiler-reviewers,iain
We convert the JS sources into an object of objects that can hold
`uuid -> source text` map. That way we can keep this object
inside the JS codebase.
Differential Revision: https://phabricator.services.mozilla.com/D259268
Diffstat:
3 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/devtools/client/performance-new/@types/gecko.d.ts b/devtools/client/performance-new/@types/gecko.d.ts
@@ -160,8 +160,13 @@ declare namespace MockedExports {
arch: string;
}
+ type JSSources = Partial<{
+ [sourceUuid: string]: string;
+ }>;
+
interface ProfileGenerationAdditionalInformation {
sharedLibraries: SharedLibrary[];
+ jsSources: JSSources;
}
interface ProfileAndAdditionalInformation {
diff --git a/tools/profiler/core/ProfileAdditionalInformation.cpp b/tools/profiler/core/ProfileAdditionalInformation.cpp
@@ -16,6 +16,26 @@
#ifdef MOZ_GECKO_PROFILER
# include "platform.h"
+JSString*
+mozilla::ProfileGenerationAdditionalInformation::CreateJSStringFromSourceData(
+ JSContext* aCx, const ProfilerJSSourceData& aSourceData) const {
+ return aSourceData.data().match(
+ [&](const ProfilerJSSourceData::SourceTextUTF16& srcText) -> JSString* {
+ return JS_NewUCStringCopyN(aCx, srcText.chars().get(),
+ srcText.length());
+ },
+ [&](const ProfilerJSSourceData::SourceTextUTF8& srcText) -> JSString* {
+ return JS_NewStringCopyN(aCx, srcText.chars().get(), srcText.length());
+ },
+ [&](const ProfilerJSSourceData::RetrievableFile&) -> JSString* {
+ // FIXME: Implement this later.
+ return JS_NewStringCopyZ(aCx, "[unavailable]");
+ },
+ [&](const ProfilerJSSourceData::Unavailable&) -> JSString* {
+ return JS_NewStringCopyZ(aCx, "[unavailable]");
+ });
+}
+
void mozilla::ProfileGenerationAdditionalInformation::ToJSValue(
JSContext* aCx, JS::MutableHandle<JS::Value> aRetVal) const {
// Get the shared libraries array.
@@ -32,8 +52,24 @@ void mozilla::ProfileGenerationAdditionalInformation::ToJSValue(
buffer16.Length(), &sharedLibrariesVal));
}
+ // Create jsSources object, which is UUID to source text mapping for
+ // WebChannel.
+ JS::Rooted<JSObject*> jsSourcesObj(aCx, JS_NewPlainObject(aCx));
+ if (jsSourcesObj) {
+ for (const auto& entry : mJSSourceEntries) {
+ JSString* sourceStr = CreateJSStringFromSourceData(aCx, entry.sourceData);
+ if (sourceStr) {
+ JS::Rooted<JS::Value> sourceVal(aCx, JS::StringValue(sourceStr));
+ JS_SetProperty(aCx, jsSourcesObj, PromiseFlatCString(entry.uuid).get(),
+ sourceVal);
+ }
+ }
+ }
+
JS::Rooted<JSObject*> additionalInfoObj(aCx, JS_NewPlainObject(aCx));
+ JS::Rooted<JS::Value> jsSourcesVal(aCx, JS::ObjectValue(*jsSourcesObj));
JS_SetProperty(aCx, additionalInfoObj, "sharedLibraries", sharedLibrariesVal);
+ JS_SetProperty(aCx, additionalInfoObj, "jsSources", jsSourcesVal);
aRetVal.setObject(*additionalInfoObj);
}
#endif // MOZ_GECKO_PROFILER
diff --git a/tools/profiler/public/ProfileAdditionalInformation.h b/tools/profiler/public/ProfileAdditionalInformation.h
@@ -81,6 +81,12 @@ struct ProfileGenerationAdditionalInformation {
void ToJSValue(JSContext* aCx, JS::MutableHandle<JS::Value> aRetVal) const;
+ friend IPC::ParamTraits<mozilla::ProfileGenerationAdditionalInformation>;
+
+ private:
+ JSString* CreateJSStringFromSourceData(
+ JSContext* aCx, const ProfilerJSSourceData& aSourceData) const;
+
SharedLibraryInfo mSharedLibraries;
nsTArray<JSSourceEntry> mJSSourceEntries;
};