mirror of
https://github.com/denoland/deno.git
synced 2024-12-25 00:29:09 -05:00
Revert "Create an old program to be used in snapshot. (#3644)"
Ref #3712. This change allowed the deno_typescript crate to reference
cli/js/lib.deno_runtime.d.ts which breaks "cargo package". We intend to
reintroduce a revised version of this patch later once "cargo
package" is working and tested.
This reverts commit 737ab94ea1
.
This commit is contained in:
parent
7fd50065a7
commit
fa7f34eb8c
14 changed files with 59 additions and 84 deletions
10
cli/js.rs
10
cli/js.rs
|
@ -16,6 +16,16 @@ pub static COMPILER_SNAPSHOT_MAP: &[u8] =
|
||||||
pub static COMPILER_SNAPSHOT_DTS: &[u8] =
|
pub static COMPILER_SNAPSHOT_DTS: &[u8] =
|
||||||
include_bytes!(concat!(env!("OUT_DIR"), "/COMPILER_SNAPSHOT.d.ts"));
|
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]
|
#[test]
|
||||||
fn cli_snapshot() {
|
fn cli_snapshot() {
|
||||||
let mut isolate = deno_core::Isolate::new(
|
let mut isolate = deno_core::Isolate::new(
|
||||||
|
|
|
@ -6,7 +6,6 @@ import "./globals.ts";
|
||||||
import "./ts_global.d.ts";
|
import "./ts_global.d.ts";
|
||||||
|
|
||||||
import { TranspileOnlyResult } from "./compiler_api.ts";
|
import { TranspileOnlyResult } from "./compiler_api.ts";
|
||||||
import { oldProgram } from "./compiler_bootstrap.ts";
|
|
||||||
import { setRootExports } from "./compiler_bundler.ts";
|
import { setRootExports } from "./compiler_bundler.ts";
|
||||||
import {
|
import {
|
||||||
defaultBundlerOptions,
|
defaultBundlerOptions,
|
||||||
|
@ -143,12 +142,7 @@ self.bootstrapTsCompiler = function tsCompilerMain(): void {
|
||||||
// to generate the program and possibly emit it.
|
// to generate the program and possibly emit it.
|
||||||
if (!diagnostics || (diagnostics && diagnostics.length === 0)) {
|
if (!diagnostics || (diagnostics && diagnostics.length === 0)) {
|
||||||
const options = host.getCompilationSettings();
|
const options = host.getCompilationSettings();
|
||||||
const program = ts.createProgram({
|
const program = ts.createProgram(rootNames, options, host);
|
||||||
rootNames,
|
|
||||||
options,
|
|
||||||
host,
|
|
||||||
oldProgram
|
|
||||||
});
|
|
||||||
|
|
||||||
diagnostics = ts
|
diagnostics = ts
|
||||||
.getPreEmitDiagnostics(program)
|
.getPreEmitDiagnostics(program)
|
||||||
|
@ -226,12 +220,11 @@ self.bootstrapTsCompiler = function tsCompilerMain(): void {
|
||||||
}
|
}
|
||||||
host.mergeOptions(...compilerOptions);
|
host.mergeOptions(...compilerOptions);
|
||||||
|
|
||||||
const program = ts.createProgram({
|
const program = ts.createProgram(
|
||||||
rootNames,
|
rootNames,
|
||||||
options: host.getCompilationSettings(),
|
host.getCompilationSettings(),
|
||||||
host,
|
host
|
||||||
oldProgram
|
);
|
||||||
});
|
|
||||||
|
|
||||||
if (bundle) {
|
if (bundle) {
|
||||||
setRootExports(program, rootNames[0]);
|
setRootExports(program, rootNames[0]);
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
// 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"
|
|
||||||
});
|
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
import { bundleLoader } from "./compiler_bootstrap.ts";
|
import * as dispatch from "./dispatch.ts";
|
||||||
|
import { sendSync } from "./dispatch_json.ts";
|
||||||
import {
|
import {
|
||||||
assert,
|
assert,
|
||||||
commonPath,
|
commonPath,
|
||||||
|
@ -8,6 +9,11 @@ import {
|
||||||
CHAR_FORWARD_SLASH
|
CHAR_FORWARD_SLASH
|
||||||
} from "./util.ts";
|
} 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. */
|
/** Local state of what the root exports are of a root module. */
|
||||||
let rootExports: string[] | undefined;
|
let rootExports: string[] | undefined;
|
||||||
|
|
||||||
|
@ -34,6 +40,12 @@ export function buildBundle(
|
||||||
data: string,
|
data: string,
|
||||||
sourceFiles: readonly ts.SourceFile[]
|
sourceFiles: readonly ts.SourceFile[]
|
||||||
): string {
|
): 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
|
// 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
|
// specifiers which are used to define the modules, and doesn't expose them
|
||||||
// publicly, so we have to try to replicate
|
// publicly, so we have to try to replicate
|
||||||
|
|
|
@ -18,7 +18,7 @@ export interface ConfigureResponse {
|
||||||
diagnostics?: ts.Diagnostic[];
|
diagnostics?: ts.Diagnostic[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ASSETS = "$asset$";
|
const ASSETS = "$asset$";
|
||||||
|
|
||||||
/** Options that need to be used when generating a bundle (either trusted or
|
/** Options that need to be used when generating a bundle (either trusted or
|
||||||
* runtime). */
|
* runtime). */
|
||||||
|
@ -129,11 +129,11 @@ export class Host implements ts.CompilerHost {
|
||||||
private _writeFile: WriteFileCallback;
|
private _writeFile: WriteFileCallback;
|
||||||
|
|
||||||
private _getAsset(filename: string): SourceFile {
|
private _getAsset(filename: string): SourceFile {
|
||||||
const url = filename.split("/").pop()!;
|
const sourceFile = SourceFile.get(filename);
|
||||||
const sourceFile = SourceFile.get(url);
|
|
||||||
if (sourceFile) {
|
if (sourceFile) {
|
||||||
return sourceFile;
|
return sourceFile;
|
||||||
}
|
}
|
||||||
|
const url = filename.split("/").pop()!;
|
||||||
const name = url.includes(".") ? url : `${url}.d.ts`;
|
const name = url.includes(".") ? url : `${url}.d.ts`;
|
||||||
const sourceCode = sendSync(dispatch.OP_FETCH_ASSET, { name });
|
const sourceCode = sendSync(dispatch.OP_FETCH_ASSET, { name });
|
||||||
return new SourceFile({
|
return new SourceFile({
|
||||||
|
@ -238,15 +238,13 @@ export class Host implements ts.CompilerHost {
|
||||||
: SourceFile.get(fileName);
|
: SourceFile.get(fileName);
|
||||||
assert(sourceFile != null);
|
assert(sourceFile != null);
|
||||||
if (!sourceFile.tsSourceFile) {
|
if (!sourceFile.tsSourceFile) {
|
||||||
assert(sourceFile.sourceCode != null);
|
|
||||||
sourceFile.tsSourceFile = ts.createSourceFile(
|
sourceFile.tsSourceFile = ts.createSourceFile(
|
||||||
fileName,
|
fileName,
|
||||||
sourceFile.sourceCode,
|
sourceFile.sourceCode,
|
||||||
languageVersion
|
languageVersion
|
||||||
);
|
);
|
||||||
delete sourceFile.sourceCode;
|
|
||||||
}
|
}
|
||||||
return sourceFile.tsSourceFile;
|
return sourceFile!.tsSourceFile;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (onError) {
|
if (onError) {
|
||||||
onError(String(e));
|
onError(String(e));
|
||||||
|
|
|
@ -61,7 +61,7 @@ export class SourceFile {
|
||||||
|
|
||||||
mediaType!: MediaType;
|
mediaType!: MediaType;
|
||||||
processed = false;
|
processed = false;
|
||||||
sourceCode?: string;
|
sourceCode!: string;
|
||||||
tsSourceFile?: ts.SourceFile;
|
tsSourceFile?: ts.SourceFile;
|
||||||
url!: string;
|
url!: string;
|
||||||
|
|
||||||
|
|
|
@ -70,15 +70,12 @@ export let OP_TRUNCATE: number;
|
||||||
export let OP_MAKE_TEMP_DIR: number;
|
export let OP_MAKE_TEMP_DIR: number;
|
||||||
export let OP_CWD: number;
|
export let OP_CWD: number;
|
||||||
export let OP_CONNECT_TLS: number;
|
export let OP_CONNECT_TLS: number;
|
||||||
|
export let OP_FETCH_ASSET: number;
|
||||||
export let OP_HOSTNAME: number;
|
export let OP_HOSTNAME: number;
|
||||||
export let OP_OPEN_PLUGIN: number;
|
export let OP_OPEN_PLUGIN: number;
|
||||||
export let OP_COMPILE: number;
|
export let OP_COMPILE: number;
|
||||||
export let OP_TRANSPILE: 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();
|
const PLUGIN_ASYNC_HANDLER_MAP: Map<number, AsyncHandler> = new Map();
|
||||||
|
|
||||||
export function setPluginAsyncHandler(
|
export function setPluginAsyncHandler(
|
||||||
|
|
|
@ -62,7 +62,7 @@ export function sendSync(
|
||||||
const resUi8 = core.dispatch(opId, argsUi8, zeroCopy);
|
const resUi8 = core.dispatch(opId, argsUi8, zeroCopy);
|
||||||
util.assert(resUi8 != null);
|
util.assert(resUi8 != null);
|
||||||
|
|
||||||
const res = decode(resUi8);
|
const res = decode(resUi8!);
|
||||||
util.assert(res.promiseId == null);
|
util.assert(res.promiseId == null);
|
||||||
return unwrapResponse(res);
|
return unwrapResponse(res);
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,7 @@ fn create_worker_and_state(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn types_command() {
|
fn types_command() {
|
||||||
let content = deno_typescript::get_asset("lib.deno_runtime.d.ts").unwrap();
|
let content = crate::js::get_asset("lib.deno_runtime.d.ts").unwrap();
|
||||||
println!("{}", content);
|
println!("{}", content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,10 @@ pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
|
||||||
"fetch_source_files",
|
"fetch_source_files",
|
||||||
s.core_op(json_op(s.stateful_op(op_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))),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
@ -145,3 +149,21 @@ fn op_fetch_source_files(
|
||||||
|
|
||||||
Ok(JsonOp::Async(future))
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -692,7 +692,6 @@ impl Isolate {
|
||||||
let mut hs = v8::HandleScope::new(&mut locker);
|
let mut hs = v8::HandleScope::new(&mut locker);
|
||||||
let scope = hs.enter();
|
let scope = hs.enter();
|
||||||
self.global_context.reset(scope);
|
self.global_context.reset(scope);
|
||||||
self.shared_response_buf.reset(scope);
|
|
||||||
|
|
||||||
let snapshot_creator = self.snapshot_creator.as_mut().unwrap();
|
let snapshot_creator = self.snapshot_creator.as_mut().unwrap();
|
||||||
let snapshot = snapshot_creator
|
let snapshot = snapshot_creator
|
||||||
|
|
|
@ -184,6 +184,7 @@ SharedQueue Binary Layout
|
||||||
}
|
}
|
||||||
|
|
||||||
function dispatch(opId, control, zeroCopy = null) {
|
function dispatch(opId, control, zeroCopy = null) {
|
||||||
|
maybeInit();
|
||||||
return Deno.core.send(opId, control, zeroCopy);
|
return Deno.core.send(opId, control, zeroCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,10 +203,6 @@ pub fn mksnapshot_bundle_ts(
|
||||||
state: Arc<Mutex<TSState>>,
|
state: Arc<Mutex<TSState>>,
|
||||||
) -> Result<(), ErrBox> {
|
) -> Result<(), ErrBox> {
|
||||||
let runtime_isolate = &mut Isolate::new(StartupData::None, true);
|
let runtime_isolate = &mut Isolate::new(StartupData::None, true);
|
||||||
runtime_isolate.register_op(
|
|
||||||
"fetch_asset",
|
|
||||||
compiler_op(state.clone(), ops::json_op(ops::fetch_asset)),
|
|
||||||
);
|
|
||||||
let source_code_vec = std::fs::read(bundle)?;
|
let source_code_vec = std::fs::read(bundle)?;
|
||||||
let source_code = std::str::from_utf8(&source_code_vec)?;
|
let source_code = std::str::from_utf8(&source_code_vec)?;
|
||||||
|
|
||||||
|
@ -259,10 +255,6 @@ pub fn get_asset(name: &str) -> Option<&'static str> {
|
||||||
}
|
}
|
||||||
match name {
|
match name {
|
||||||
"bundle_loader.js" => Some(include_str!("bundle_loader.js")),
|
"bundle_loader.js" => Some(include_str!("bundle_loader.js")),
|
||||||
"lib.deno_runtime.d.ts" => {
|
|
||||||
Some(include_str!("../cli/js/lib.deno_runtime.d.ts"))
|
|
||||||
}
|
|
||||||
"bootstrap.ts" => Some("console.log(\"hello deno\");"),
|
|
||||||
"typescript.d.ts" => inc!("typescript.d.ts"),
|
"typescript.d.ts" => inc!("typescript.d.ts"),
|
||||||
"lib.esnext.d.ts" => inc!("lib.esnext.d.ts"),
|
"lib.esnext.d.ts" => inc!("lib.esnext.d.ts"),
|
||||||
"lib.es2020.d.ts" => inc!("lib.es2020.d.ts"),
|
"lib.es2020.d.ts" => inc!("lib.es2020.d.ts"),
|
||||||
|
|
|
@ -110,21 +110,6 @@ pub fn resolve_module_names(
|
||||||
Ok(json!(resolved))
|
Ok(json!(resolved))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
struct FetchAssetArgs {
|
|
||||||
name: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn fetch_asset(_s: &mut TSState, v: Value) -> Result<Value, ErrBox> {
|
|
||||||
let args: FetchAssetArgs = serde_json::from_value(v)?;
|
|
||||||
if let Some(source_code) = crate::get_asset(&args.name) {
|
|
||||||
Ok(json!(source_code))
|
|
||||||
} else {
|
|
||||||
panic!("op_fetch_asset bad asset {}", args.name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
struct Exit {
|
struct Exit {
|
||||||
|
|
Loading…
Reference in a new issue