mirror of
https://github.com/denoland/deno.git
synced 2024-11-25 15:29:32 -05:00
Decode main.js.map during snapshotting.
Pro: time ./out/debug/deno tests/error_001.ts 3.0s -> 0.4s Con: time ./tool/build.py snapshot 33s -> 1m52s out/debug/gen/snapshot_deno.bin 39M -> 121M
This commit is contained in:
parent
27ecfc1617
commit
b3400d822f
4 changed files with 21 additions and 13 deletions
|
@ -388,6 +388,7 @@ export class DenoCompiler
|
||||||
let lastModule: ModuleMetaData | undefined;
|
let lastModule: ModuleMetaData | undefined;
|
||||||
sourceMaps.install({
|
sourceMaps.install({
|
||||||
installPrepareStackTrace: true,
|
installPrepareStackTrace: true,
|
||||||
|
|
||||||
getGeneratedContents: (fileName: string): string | RawSourceMap => {
|
getGeneratedContents: (fileName: string): string | RawSourceMap => {
|
||||||
this._log("compiler.getGeneratedContents", fileName);
|
this._log("compiler.getGeneratedContents", fileName);
|
||||||
if (fileName === "gen/bundle/main.js") {
|
if (fileName === "gen/bundle/main.js") {
|
||||||
|
@ -419,6 +420,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() {
|
private constructor() {
|
||||||
|
|
|
@ -11,6 +11,10 @@ import { promiseErrorExaminer, promiseRejectHandler } from "./promise_util";
|
||||||
import { replLoop } from "./repl";
|
import { replLoop } from "./repl";
|
||||||
import { version } from "typescript";
|
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 {
|
function sendStart(): msg.StartRes {
|
||||||
const builder = flatbuffers.createBuilder();
|
const builder = flatbuffers.createBuilder();
|
||||||
msg.Start.startStart(builder);
|
msg.Start.startStart(builder);
|
||||||
|
@ -44,7 +48,6 @@ export default function denoMain() {
|
||||||
libdeno.setGlobalErrorHandler(onGlobalError);
|
libdeno.setGlobalErrorHandler(onGlobalError);
|
||||||
libdeno.setPromiseRejectHandler(promiseRejectHandler);
|
libdeno.setPromiseRejectHandler(promiseRejectHandler);
|
||||||
libdeno.setPromiseErrorExaminer(promiseErrorExaminer);
|
libdeno.setPromiseErrorExaminer(promiseErrorExaminer);
|
||||||
const compiler = DenoCompiler.instance();
|
|
||||||
|
|
||||||
// First we send an empty "Start" message to let the privileged side know we
|
// 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
|
// are ready. The response should be a "StartRes" message containing the CLI
|
||||||
|
|
|
@ -186,7 +186,7 @@ function CallSiteToString(frame: CallSite): string {
|
||||||
// Regex for detecting source maps
|
// Regex for detecting source maps
|
||||||
const reSourceMap = /^data:application\/json[^,]+base64,/;
|
const reSourceMap = /^data:application\/json[^,]+base64,/;
|
||||||
|
|
||||||
function loadConsumer(source: string): SourceMapConsumer | null {
|
export function loadConsumer(source: string): SourceMapConsumer | null {
|
||||||
let consumer = consumers.get(source);
|
let consumer = consumers.get(source);
|
||||||
if (consumer == null) {
|
if (consumer == null) {
|
||||||
const code = getGeneratedContents(source);
|
const code = getGeneratedContents(source);
|
||||||
|
@ -210,8 +210,8 @@ function loadConsumer(source: string): SourceMapConsumer | null {
|
||||||
sourceMapData = arrayToStr(ui8);
|
sourceMapData = arrayToStr(ui8);
|
||||||
sourceMappingURL = source;
|
sourceMappingURL = source;
|
||||||
} else {
|
} else {
|
||||||
// Support source map URLs relative to the source URL
|
// TODO Support source map URLs relative to the source URL
|
||||||
//sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
|
// sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
|
||||||
sourceMapData = getGeneratedContents(sourceMappingURL);
|
sourceMapData = getGeneratedContents(sourceMappingURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +219,6 @@ function loadConsumer(source: string): SourceMapConsumer | null {
|
||||||
typeof sourceMapData === "string"
|
typeof sourceMapData === "string"
|
||||||
? JSON.parse(sourceMapData)
|
? JSON.parse(sourceMapData)
|
||||||
: sourceMapData;
|
: sourceMapData;
|
||||||
//console.log("sourceMapData", sourceMapData);
|
|
||||||
consumer = new SourceMapConsumer(rawSourceMap);
|
consumer = new SourceMapConsumer(rawSourceMap);
|
||||||
consumers.set(source, consumer);
|
consumers.set(source, consumer);
|
||||||
}
|
}
|
||||||
|
@ -242,7 +241,7 @@ function retrieveSourceMapURL(fileData: string): string | null {
|
||||||
return lastMatch[1];
|
return lastMatch[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
function mapSourcePosition(position: Position): MappedPosition {
|
export function mapSourcePosition(position: Position): MappedPosition {
|
||||||
const consumer = loadConsumer(position.source);
|
const consumer = loadConsumer(position.source);
|
||||||
if (consumer == null) {
|
if (consumer == null) {
|
||||||
return position;
|
return position;
|
||||||
|
|
|
@ -521,13 +521,6 @@ void InitializeContext(v8::Isolate* isolate, v8::Local<v8::Context> context,
|
||||||
.FromJust());
|
.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) {
|
if (source_map != nullptr) {
|
||||||
v8::TryCatch try_catch(isolate);
|
v8::TryCatch try_catch(isolate);
|
||||||
v8::ScriptOrigin origin(v8_str("set_source_map.js"));
|
v8::ScriptOrigin origin(v8_str("set_source_map.js"));
|
||||||
|
@ -551,6 +544,13 @@ void InitializeContext(v8::Isolate* isolate, v8::Local<v8::Context> context,
|
||||||
source_map_obj.ToLocalChecked())
|
source_map_obj.ToLocalChecked())
|
||||||
.FromJust());
|
.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue