-
Notifications
You must be signed in to change notification settings - Fork 30.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lib: save primordials during bootstrap and use it in builtins
This patches changes the `safe_globals` internal module into a script that gets run during bootstrap and saves JavaScript builtins (primordials) into an object that is available for all other builtin modules to access lexically later. PR-URL: #25816 Refs: #18795 Reviewed-By: Bradley Farias <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Gus Caplan <[email protected]>
- Loading branch information
1 parent
f63817f
commit 92ca506
Showing
17 changed files
with
185 additions
and
105 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -46,3 +46,4 @@ globals: | |
DCHECK_LT: false | ||
DCHECK_NE: false | ||
internalBinding: false | ||
primordials: false |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
'use strict'; | ||
|
||
/* global breakAtBootstrap, primordials */ | ||
|
||
// This file subclasses and stores the JS builtins that come from the VM | ||
// so that Node.js's builtin modules do not need to later look these up from | ||
// the global proxy, which can be mutated by users. | ||
|
||
// TODO(joyeecheung): we can restrict access to these globals in builtin | ||
// modules through the JS linter, for example: ban access such as `Object` | ||
// (which falls back to a lookup in the global proxy) in favor of | ||
// `primordials.Object` where `primordials` is a lexical variable passed | ||
// by the native module compiler. | ||
|
||
if (breakAtBootstrap) { | ||
debugger; // eslint-disable-line no-debugger | ||
} | ||
|
||
function copyProps(src, dest) { | ||
for (const key of Reflect.ownKeys(src)) { | ||
if (!Reflect.getOwnPropertyDescriptor(dest, key)) { | ||
Reflect.defineProperty( | ||
dest, | ||
key, | ||
Reflect.getOwnPropertyDescriptor(src, key)); | ||
} | ||
} | ||
} | ||
|
||
function makeSafe(unsafe, safe) { | ||
copyProps(unsafe.prototype, safe.prototype); | ||
copyProps(unsafe, safe); | ||
Object.setPrototypeOf(safe.prototype, null); | ||
Object.freeze(safe.prototype); | ||
Object.freeze(safe); | ||
return safe; | ||
} | ||
|
||
// Subclass the constructors because we need to use their prototype | ||
// methods later. | ||
primordials.SafeMap = makeSafe( | ||
Map, | ||
class SafeMap extends Map {} | ||
); | ||
primordials.SafeWeakMap = makeSafe( | ||
WeakMap, | ||
class SafeWeakMap extends WeakMap {} | ||
); | ||
primordials.SafeSet = makeSafe( | ||
Set, | ||
class SafeSet extends Set {} | ||
); | ||
primordials.SafePromise = makeSafe( | ||
Promise, | ||
class SafePromise extends Promise {} | ||
); | ||
|
||
// Create copies of the namespace objects | ||
[ | ||
'JSON', | ||
'Math', | ||
'Reflect' | ||
].forEach((name) => { | ||
const target = primordials[name] = Object.create(null); | ||
copyProps(global[name], target); | ||
}); | ||
|
||
// Create copies of intrinsic objects | ||
[ | ||
'Array', | ||
'Date', | ||
'Function', | ||
'Object', | ||
'RegExp', | ||
'String' | ||
].forEach((name) => { | ||
const target = primordials[name] = Object.create(null); | ||
copyProps(global[name], target); | ||
const proto = primordials[name + 'Prototype'] = Object.create(null); | ||
copyProps(global[name].prototype, proto); | ||
}); | ||
|
||
Object.setPrototypeOf(primordials, null); | ||
Object.freeze(primordials); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.