mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
6967f91368
This patch splits the execution mode selection from the environment setup in `lib/internal/bootstrap/node.js`, and split the entry point of different execution mode into main scripts under `lib/internal/main`: - `check_syntax.js`: used when `-c`/`--check` which only checks the syntax of the input instead of executing it. - `eval_stdin.js`: used when `-e` is passed without value and stdin is not a TTY (e.g. something is piped). - `eval_string`: used when `-e` is passed along with a string argument - `inspect.js`: for `node inspect`/`node debug` - `print_bash_completion.js`: for `--completion-bash` - `print_help.js`: for `--help` - `prof_process.js`: for `--prof-process` - `repl.js`: for the REPL - `run_main_module.js`: used when a main module is passed - `run_third_party_main.js`: for the legacy `_third_party_main.js` support - `worker_thread.js`: for workers This makes the entry points easier to navigate and paves the way for customized v8 snapshots (that do not need to deserialize execution mode setup) and better embedder APIs. As an example, after this patch, for the most common case where Node.js executes a user module as an entry point, it essentially goes through: - `lib/internal/per_context.js` to setup the v8 Context (which is also run when setting up contexts for the `vm` module) - `lib/internal/bootstrap/loaders.js` to set up internal binding and builtin module loaders (that are separate from the loaders accessible in the user land). - `lib/internal/bootstrap/node.js`: to set up the rest of the environment, including various globals and the process object - `lib/internal/main/run_main_module.js`: which is selected from C++ to prepare execution of the user module. This patch also removes `NativeModuleLoader::CompileAndCall` and exposes `NativeModuleLoader::LookupAndCompile` directly so that we can handle syntax errors and runtime errors of bootstrap scripts differently. PR-URL: https://github.com/nodejs/node/pull/25667 Reviewed-By: Anna Henningsen <anna@addaleax.net>
72 lines
2.2 KiB
JavaScript
72 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
// Flags: --expose-internals
|
|
// This test verifies that if the binary is compiled with code cache,
|
|
// and the cache is used when built in modules are compiled.
|
|
// Otherwise, verifies that no cache is used when compiling builtins.
|
|
|
|
const { isMainThread } = require('../common');
|
|
const assert = require('assert');
|
|
const {
|
|
cachableBuiltins,
|
|
cannotBeRequired
|
|
} = require('internal/bootstrap/cache');
|
|
|
|
const {
|
|
internalBinding
|
|
} = require('internal/test/binding');
|
|
const {
|
|
getCacheUsage
|
|
} = internalBinding('native_module');
|
|
|
|
for (const key of cachableBuiltins) {
|
|
if (!isMainThread && key === 'trace_events') {
|
|
continue; // Cannot load trace_events in workers
|
|
}
|
|
require(key);
|
|
}
|
|
|
|
// The computation has to be delayed until we have done loading modules
|
|
const {
|
|
compiledWithoutCache,
|
|
compiledWithCache
|
|
} = getCacheUsage();
|
|
|
|
const loadedModules = process.moduleLoadList
|
|
.filter((m) => m.startsWith('NativeModule'))
|
|
.map((m) => m.replace('NativeModule ', ''));
|
|
|
|
// The binary is not configured with code cache, verifies that the builtins
|
|
// are all compiled without cache and we are doing the bookkeeping right.
|
|
if (process.config.variables.node_code_cache_path === undefined) {
|
|
console.log('The binary is not configured with code cache');
|
|
if (isMainThread) {
|
|
assert.deepStrictEqual(compiledWithCache, new Set());
|
|
for (const key of loadedModules) {
|
|
assert(compiledWithoutCache.has(key),
|
|
`"${key}" should've been compiled without code cache`);
|
|
}
|
|
} else {
|
|
// TODO(joyeecheung): create a list of modules whose cache can be shared
|
|
// from the main thread to the worker thread and check that their
|
|
// cache are hit
|
|
assert.notDeepStrictEqual(compiledWithCache, new Set());
|
|
}
|
|
} else {
|
|
console.log('The binary is configured with code cache');
|
|
assert.strictEqual(
|
|
typeof process.config.variables.node_code_cache_path,
|
|
'string'
|
|
);
|
|
|
|
for (const key of loadedModules) {
|
|
if (cannotBeRequired.includes(key)) {
|
|
assert(compiledWithoutCache.has(key),
|
|
`"${key}" should've been compiled without code cache`);
|
|
} else {
|
|
assert(compiledWithCache.has(key),
|
|
`"${key}" should've been compiled with code cache`);
|
|
}
|
|
}
|
|
}
|