From a8b4e346b4477e340f36a59f83a0974afd541f4b Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 26 Apr 2023 18:53:13 -0400 Subject: [PATCH] refactor(ext/node): use a snapshottable global name for Node's globalThis (#18860) --- ext/node/analyze.rs | 11 +++++------ ext/node/build.rs | 10 ++++++++++ ext/node/lib.rs | 14 ++------------ 3 files changed, 17 insertions(+), 18 deletions(-) create mode 100644 ext/node/build.rs diff --git a/ext/node/analyze.rs b/ext/node/analyze.rs index c7181c4aca..2622ce8dab 100644 --- a/ext/node/analyze.rs +++ b/ext/node/analyze.rs @@ -341,7 +341,7 @@ fn esm_code_from_top_level_decls( } let mut result = String::new(); - let global_this_expr = NODE_GLOBAL_THIS_NAME.as_str(); + let global_this_expr = NODE_GLOBAL_THIS_NAME; let global_this_expr = if has_global_this { global_this_expr } else { @@ -506,10 +506,9 @@ mod tests { "export const x = 1;", &HashSet::from(["x".to_string()]), ); - assert!(r.contains(&format!( - "var globalThis = {};", - NODE_GLOBAL_THIS_NAME.as_str() - ))); + assert!( + r.contains(&format!("var globalThis = {};", NODE_GLOBAL_THIS_NAME,)) + ); assert!(r.contains("var process = globalThis.process;")); assert!(r.contains("export const x = 1;")); } @@ -533,7 +532,7 @@ mod tests { "var setTimeout = globalThis.setTimeout;\n", "export const x = 1;" ), - NODE_GLOBAL_THIS_NAME.as_str(), + NODE_GLOBAL_THIS_NAME, ) ); } diff --git a/ext/node/build.rs b/ext/node/build.rs new file mode 100644 index 0000000000..e9b960cab2 --- /dev/null +++ b/ext/node/build.rs @@ -0,0 +1,10 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +fn main() { + // we use a changing variable name to make it harder to depend on this + let crate_version = env!("CARGO_PKG_VERSION"); + println!( + "cargo:rustc-env=NODE_GLOBAL_THIS_NAME=__DENO_NODE_GLOBAL_THIS_{}__", + crate_version.replace('.', "_") + ); +} diff --git a/ext/node/lib.rs b/ext/node/lib.rs index 84530423f3..cc4afb2b80 100644 --- a/ext/node/lib.rs +++ b/ext/node/lib.rs @@ -169,15 +169,7 @@ pub trait NpmResolver: std::fmt::Debug + Send + Sync { ) -> Result<(), AnyError>; } -pub static NODE_GLOBAL_THIS_NAME: Lazy = Lazy::new(|| { - let now = std::time::SystemTime::now(); - let seconds = now - .duration_since(std::time::SystemTime::UNIX_EPOCH) - .unwrap() - .as_secs(); - // use a changing variable name to make it hard to depend on this - format!("__DENO_NODE_GLOBAL_THIS_{seconds}__") -}); +pub const NODE_GLOBAL_THIS_NAME: &str = env!("NODE_GLOBAL_THIS_NAME"); pub static NODE_ENV_VAR_ALLOWLIST: Lazy> = Lazy::new(|| { // The full list of environment variables supported by Node.js is available @@ -557,9 +549,7 @@ pub fn initialize_runtime( argv0 ); }})('{}', {}, {});"#, - NODE_GLOBAL_THIS_NAME.as_str(), - uses_local_node_modules_dir, - argv0 + NODE_GLOBAL_THIS_NAME, uses_local_node_modules_dir, argv0 ); js_runtime.execute_script(located_script_name!(), source_code.into())?;