Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Decode main.js.map during snapshotting. #1092

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions js/compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ export class DenoCompiler
private _setupSourceMaps(): void {
sourceMaps.install({
installPrepareStackTrace: true,

getGeneratedContents: (fileName: string): string | RawSourceMap => {
this._log("compiler.getGeneratedContents", fileName);
if (fileName === "gen/bundle/main.js") {
Expand All @@ -387,6 +388,11 @@ export class DenoCompiler
}
}
});
// Pre-compute source maps for main.js.map. This will happen at compile-time
// as long as Compiler is instanciated before the snapshot is created..
const consumer = sourceMaps.loadConsumer("gen/bundle/main.js");
assert(consumer != null);
consumer!.computeColumnSpans();
}

private constructor() {
Expand Down
5 changes: 4 additions & 1 deletion js/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import { sendSync, handleAsyncMsgFromRust } from "./dispatch";
import { promiseErrorExaminer, promiseRejectHandler } from "./promise_util";
import { version } from "typescript";

// Instantiate compiler at the top-level so it decodes source maps for the main
// bundle during snapshot.
const compiler = DenoCompiler.instance();

function sendStart(): msg.StartRes {
const builder = flatbuffers.createBuilder();
msg.Start.startStart(builder);
Expand Down Expand Up @@ -43,7 +47,6 @@ export default function denoMain() {
libdeno.setGlobalErrorHandler(onGlobalError);
libdeno.setPromiseRejectHandler(promiseRejectHandler);
libdeno.setPromiseErrorExaminer(promiseErrorExaminer);
const compiler = DenoCompiler.instance();

// First we send an empty "Start" message to let the privileged side know we
// are ready. The response should be a "StartRes" message containing the CLI
Expand Down
9 changes: 4 additions & 5 deletions js/v8_source_maps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ function CallSiteToString(frame: CallSite): string {
// Regex for detecting source maps
const reSourceMap = /^data:application\/json[^,]+base64,/;

function loadConsumer(source: string): SourceMapConsumer | null {
export function loadConsumer(source: string): SourceMapConsumer | null {
let consumer = consumers.get(source);
if (consumer == null) {
const code = getGeneratedContents(source);
Expand All @@ -210,16 +210,15 @@ function loadConsumer(source: string): SourceMapConsumer | null {
sourceMapData = arrayToStr(ui8);
sourceMappingURL = source;
} else {
// Support source map URLs relative to the source URL
//sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
// TODO Support source map URLs relative to the source URL
// sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
sourceMapData = getGeneratedContents(sourceMappingURL);
}

const rawSourceMap =
typeof sourceMapData === "string"
? JSON.parse(sourceMapData)
: sourceMapData;
//console.log("sourceMapData", sourceMapData);
consumer = new SourceMapConsumer(rawSourceMap);
consumers.set(source, consumer);
}
Expand All @@ -242,7 +241,7 @@ function retrieveSourceMapURL(fileData: string): string | null {
return lastMatch[1];
}

function mapSourcePosition(position: Position): MappedPosition {
export function mapSourcePosition(position: Position): MappedPosition {
const consumer = loadConsumer(position.source);
if (consumer == null) {
return position;
Expand Down
14 changes: 7 additions & 7 deletions libdeno/binding.cc
Original file line number Diff line number Diff line change
Expand Up @@ -521,13 +521,6 @@ void InitializeContext(v8::Isolate* isolate, v8::Local<v8::Context> context,
.FromJust());

{
auto source = deno::v8_str(js_source);
CHECK(
deno_val->Set(context, deno::v8_str("mainSource"), source).FromJust());

bool r = deno::ExecuteV8StringSource(context, js_filename, source);
CHECK(r);

if (source_map != nullptr) {
v8::TryCatch try_catch(isolate);
v8::ScriptOrigin origin(v8_str("set_source_map.js"));
Expand All @@ -551,6 +544,13 @@ void InitializeContext(v8::Isolate* isolate, v8::Local<v8::Context> context,
source_map_obj.ToLocalChecked())
.FromJust());
}

auto source = deno::v8_str(js_source);
CHECK(
deno_val->Set(context, deno::v8_str("mainSource"), source).FromJust());

bool r = deno::ExecuteV8StringSource(context, js_filename, source);
CHECK(r);
}
}

Expand Down