summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2020-01-12 22:20:33 +1100
committerBartek IwaƄczuk <biwanczuk@gmail.com>2020-01-12 12:20:33 +0100
commit737ab94ea1bdf65eeef323ea37e84bcf430fb92c (patch)
treeb6a239195a960557a5d32f1762886f77a71a9104 /cli
parent8fac8ab130b3cb8a93d7e0e37fa1ea6ea4cc2e4a (diff)
Create an old program to be used in snapshot. (#3644)
Diffstat (limited to 'cli')
-rw-r--r--cli/js.rs10
-rw-r--r--cli/js/compiler.ts19
-rw-r--r--cli/js/compiler_bootstrap.ts34
-rw-r--r--cli/js/compiler_bundler.ts14
-rw-r--r--cli/js/compiler_host.ts10
-rw-r--r--cli/js/compiler_sourcefile.ts2
-rw-r--r--cli/js/dispatch.ts5
-rw-r--r--cli/js/dispatch_json.ts2
-rw-r--r--cli/lib.rs2
-rw-r--r--cli/ops/compiler.rs22
10 files changed, 61 insertions, 59 deletions
diff --git a/cli/js.rs b/cli/js.rs
index 09fe3f8fa..73cac327d 100644
--- a/cli/js.rs
+++ b/cli/js.rs
@@ -16,16 +16,6 @@ pub static COMPILER_SNAPSHOT_MAP: &[u8] =
pub static COMPILER_SNAPSHOT_DTS: &[u8] =
include_bytes!(concat!(env!("OUT_DIR"), "/COMPILER_SNAPSHOT.d.ts"));
-static DENO_RUNTIME: &str = include_str!("js/lib.deno_runtime.d.ts");
-
-/// Same as deno_typescript::get_asset but also has lib.deno_runtime.d.ts
-pub fn get_asset(name: &str) -> Option<&'static str> {
- match name {
- "lib.deno_runtime.d.ts" => Some(DENO_RUNTIME),
- _ => deno_typescript::get_asset(name),
- }
-}
-
#[test]
fn cli_snapshot() {
let mut isolate = deno_core::Isolate::new(
diff --git a/cli/js/compiler.ts b/cli/js/compiler.ts
index 0d9cf83d9..76a0f7262 100644
--- a/cli/js/compiler.ts
+++ b/cli/js/compiler.ts
@@ -6,6 +6,7 @@ import "./globals.ts";
import "./ts_global.d.ts";
import { TranspileOnlyResult } from "./compiler_api.ts";
+import { oldProgram } from "./compiler_bootstrap.ts";
import { setRootExports } from "./compiler_bundler.ts";
import {
defaultBundlerOptions,
@@ -73,7 +74,7 @@ interface CompileResult {
// bootstrap the runtime environment, this gets called as the isolate is setup
self.denoMain = function denoMain(compilerType?: string): void {
- os.start(true, compilerType || "TS");
+ os.start(true, compilerType ?? "TS");
};
// bootstrap the worker environment, this gets called as the isolate is setup
@@ -135,7 +136,12 @@ self.compilerMain = function compilerMain(): void {
// to generate the program and possibly emit it.
if (!diagnostics || (diagnostics && diagnostics.length === 0)) {
const options = host.getCompilationSettings();
- const program = ts.createProgram(rootNames, options, host);
+ const program = ts.createProgram({
+ rootNames,
+ options,
+ host,
+ oldProgram
+ });
diagnostics = ts
.getPreEmitDiagnostics(program)
@@ -213,11 +219,12 @@ self.compilerMain = function compilerMain(): void {
}
host.mergeOptions(...compilerOptions);
- const program = ts.createProgram(
+ const program = ts.createProgram({
rootNames,
- host.getCompilationSettings(),
- host
- );
+ options: host.getCompilationSettings(),
+ host,
+ oldProgram
+ });
if (bundle) {
setRootExports(program, rootNames[0]);
diff --git a/cli/js/compiler_bootstrap.ts b/cli/js/compiler_bootstrap.ts
new file mode 100644
index 000000000..6de978750
--- /dev/null
+++ b/cli/js/compiler_bootstrap.ts
@@ -0,0 +1,34 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+import { ASSETS, Host } from "./compiler_host.ts";
+import { core } from "./core.ts";
+import * as dispatch from "./dispatch.ts";
+import { sendSync } from "./dispatch_json.ts";
+
+// This registers ops that are available during the snapshotting process.
+const ops = core.ops();
+for (const [name, opId] of Object.entries(ops)) {
+ const opName = `OP_${name.toUpperCase()}`;
+ // TODO This type casting is dangerous, and should be improved when the same
+ // code in `os.ts` is done.
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ (dispatch as any)[opName] = opId;
+}
+
+const host = new Host({ writeFile(): void {} });
+const options = host.getCompilationSettings();
+
+/** Used to generate the foundational AST for all other compilations, so it can
+ * be cached as part of the snapshot and available to speed up startup */
+export const oldProgram = ts.createProgram({
+ rootNames: [`${ASSETS}/bootstrap.ts`],
+ options,
+ host
+});
+
+/** A module loader which is concatenated into bundle files. We read all static
+ * assets during the snapshotting process, which is why this is located in
+ * compiler_bootstrap. */
+export const bundleLoader = sendSync(dispatch.OP_FETCH_ASSET, {
+ name: "bundle_loader.js"
+});
diff --git a/cli/js/compiler_bundler.ts b/cli/js/compiler_bundler.ts
index a4e4557ca..8fb68cc7a 100644
--- a/cli/js/compiler_bundler.ts
+++ b/cli/js/compiler_bundler.ts
@@ -1,7 +1,6 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
-import * as dispatch from "./dispatch.ts";
-import { sendSync } from "./dispatch_json.ts";
+import { bundleLoader } from "./compiler_bootstrap.ts";
import {
assert,
commonPath,
@@ -9,11 +8,6 @@ import {
CHAR_FORWARD_SLASH
} from "./util.ts";
-const BUNDLE_LOADER = "bundle_loader.js";
-
-/** A loader of bundled modules that we will inline into any bundle outputs. */
-let bundleLoader: string;
-
/** Local state of what the root exports are of a root module. */
let rootExports: string[] | undefined;
@@ -40,12 +34,6 @@ export function buildBundle(
data: string,
sourceFiles: readonly ts.SourceFile[]
): string {
- // we can only do this once we are bootstrapped and easiest way to do it is
- // inline here
- if (!bundleLoader) {
- bundleLoader = sendSync(dispatch.OP_FETCH_ASSET, { name: BUNDLE_LOADER });
- }
-
// when outputting to AMD and a single outfile, TypeScript makes up the module
// specifiers which are used to define the modules, and doesn't expose them
// publicly, so we have to try to replicate
diff --git a/cli/js/compiler_host.ts b/cli/js/compiler_host.ts
index 89f5f506d..576273bbd 100644
--- a/cli/js/compiler_host.ts
+++ b/cli/js/compiler_host.ts
@@ -18,7 +18,7 @@ export interface ConfigureResponse {
diagnostics?: ts.Diagnostic[];
}
-const ASSETS = "$asset$";
+export const ASSETS = "$asset$";
/** Options that need to be used when generating a bundle (either trusted or
* runtime). */
@@ -129,11 +129,11 @@ export class Host implements ts.CompilerHost {
private _writeFile: WriteFileCallback;
private _getAsset(filename: string): SourceFile {
- const sourceFile = SourceFile.get(filename);
+ const url = filename.split("/").pop()!;
+ const sourceFile = SourceFile.get(url);
if (sourceFile) {
return sourceFile;
}
- const url = filename.split("/").pop()!;
const name = url.includes(".") ? url : `${url}.d.ts`;
const sourceCode = sendSync(dispatch.OP_FETCH_ASSET, { name });
return new SourceFile({
@@ -238,13 +238,15 @@ export class Host implements ts.CompilerHost {
: SourceFile.get(fileName);
assert(sourceFile != null);
if (!sourceFile.tsSourceFile) {
+ assert(sourceFile.sourceCode != null);
sourceFile.tsSourceFile = ts.createSourceFile(
fileName,
sourceFile.sourceCode,
languageVersion
);
+ delete sourceFile.sourceCode;
}
- return sourceFile!.tsSourceFile;
+ return sourceFile.tsSourceFile;
} catch (e) {
if (onError) {
onError(String(e));
diff --git a/cli/js/compiler_sourcefile.ts b/cli/js/compiler_sourcefile.ts
index 46e5cbe3b..21cece387 100644
--- a/cli/js/compiler_sourcefile.ts
+++ b/cli/js/compiler_sourcefile.ts
@@ -61,7 +61,7 @@ export class SourceFile {
mediaType!: MediaType;
processed = false;
- sourceCode!: string;
+ sourceCode?: string;
tsSourceFile?: ts.SourceFile;
url!: string;
diff --git a/cli/js/dispatch.ts b/cli/js/dispatch.ts
index bb0861e9e..31c42c224 100644
--- a/cli/js/dispatch.ts
+++ b/cli/js/dispatch.ts
@@ -66,13 +66,16 @@ export let OP_READ_LINK: number;
export let OP_TRUNCATE: number;
export let OP_MAKE_TEMP_DIR: number;
export let OP_CWD: number;
-export let OP_FETCH_ASSET: number;
export let OP_DIAL_TLS: number;
export let OP_HOSTNAME: number;
export let OP_OPEN_PLUGIN: number;
export let OP_COMPILE: number;
export let OP_TRANSPILE: number;
+/** **WARNING:** This is only available during the snapshotting process and is
+ * unavailable at runtime. */
+export let OP_FETCH_ASSET: number;
+
const PLUGIN_ASYNC_HANDLER_MAP: Map<number, AsyncHandler> = new Map();
export function setPluginAsyncHandler(
diff --git a/cli/js/dispatch_json.ts b/cli/js/dispatch_json.ts
index 9efb4f59b..07095ea4b 100644
--- a/cli/js/dispatch_json.ts
+++ b/cli/js/dispatch_json.ts
@@ -62,7 +62,7 @@ export function sendSync(
const resUi8 = core.dispatch(opId, argsUi8, zeroCopy);
util.assert(resUi8 != null);
- const res = decode(resUi8!);
+ const res = decode(resUi8);
util.assert(res.promiseId == null);
return unwrapResponse(res);
}
diff --git a/cli/lib.rs b/cli/lib.rs
index 6882fea20..1b906e620 100644
--- a/cli/lib.rs
+++ b/cli/lib.rs
@@ -146,7 +146,7 @@ fn create_worker_and_state(
}
fn types_command() {
- let content = crate::js::get_asset("lib.deno_runtime.d.ts").unwrap();
+ let content = deno_typescript::get_asset("lib.deno_runtime.d.ts").unwrap();
println!("{}", content);
}
diff --git a/cli/ops/compiler.rs b/cli/ops/compiler.rs
index 114a4e1f0..5d6875fb0 100644
--- a/cli/ops/compiler.rs
+++ b/cli/ops/compiler.rs
@@ -20,10 +20,6 @@ pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
"fetch_source_files",
s.core_op(json_op(s.stateful_op(op_fetch_source_files))),
);
- i.register_op(
- "fetch_asset",
- s.core_op(json_op(s.stateful_op(op_fetch_asset))),
- );
i.register_op("compile", s.core_op(json_op(s.stateful_op(op_compile))));
i.register_op("transpile", s.core_op(json_op(s.stateful_op(op_transpile))));
}
@@ -155,24 +151,6 @@ fn op_fetch_source_files(
Ok(JsonOp::Async(future))
}
-#[derive(Deserialize)]
-struct FetchAssetArgs {
- name: String,
-}
-
-fn op_fetch_asset(
- _state: &ThreadSafeState,
- args: Value,
- _zero_copy: Option<PinnedBuf>,
-) -> Result<JsonOp, ErrBox> {
- let args: FetchAssetArgs = serde_json::from_value(args)?;
- if let Some(source_code) = crate::js::get_asset(&args.name) {
- Ok(JsonOp::Sync(json!(source_code)))
- } else {
- panic!("op_fetch_asset bad asset {}", args.name)
- }
-}
-
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct CompileArgs {