Skip to content

Commit

Permalink
process: split execution into main scripts
Browse files Browse the repository at this point in the history
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: #25667
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
joyeecheung committed Jan 30, 2019
1 parent feebdc5 commit 6967f91
Show file tree
Hide file tree
Showing 37 changed files with 855 additions and 721 deletions.
19 changes: 9 additions & 10 deletions lib/internal/bootstrap/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,33 +13,32 @@ const { hasTracing, hasInspector } = process.binding('config');

// Modules with source code compiled in js2c that
// cannot be compiled with the code cache.
const cannotUseCache = [
const cannotBeRequired = [
'sys', // Deprecated.
'internal/v8_prof_polyfill',
'internal/v8_prof_processor',

'internal/per_context',

'internal/test/binding',
// TODO(joyeecheung): update the C++ side so that
// the code cache is also used when compiling these two files.

'internal/bootstrap/loaders',
'internal/bootstrap/node'
];

// Skip modules that cannot be required when they are not
// built into the binary.
if (!hasInspector) {
cannotUseCache.push(
cannotBeRequired.push(
'inspector',
'internal/util/inspector',
);
}
if (!hasTracing) {
cannotUseCache.push('trace_events');
cannotBeRequired.push('trace_events');
}
if (!process.versions.openssl) {
cannotUseCache.push(
cannotBeRequired.push(
'crypto',
'https',
'http2',
Expand Down Expand Up @@ -67,10 +66,10 @@ if (!process.versions.openssl) {

const cachableBuiltins = [];
for (const id of NativeModule.map.keys()) {
if (id.startsWith('internal/deps')) {
cannotUseCache.push(id);
if (id.startsWith('internal/deps') || id.startsWith('internal/main')) {
cannotBeRequired.push(id);
}
if (!cannotUseCache.includes(id)) {
if (!cannotBeRequired.includes(id)) {
cachableBuiltins.push(id);
}
}
Expand All @@ -79,5 +78,5 @@ module.exports = {
cachableBuiltins,
getCodeCache,
compileFunction,
cannotUseCache
cannotBeRequired
};
12 changes: 9 additions & 3 deletions lib/internal/bootstrap/loaders.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,12 @@ internalBinding('module_wrap').callbackMap = new WeakMap();

// Think of this as module.exports in this file even though it is not
// written in CommonJS style.
const loaderExports = { internalBinding, NativeModule };
const loaderExports = {
internalBinding,
NativeModule,
require: nativeModuleRequire
};

const loaderId = 'internal/bootstrap/loaders';

// Set up NativeModule.
Expand Down Expand Up @@ -194,7 +199,7 @@ for (var i = 0; i < moduleIds.length; ++i) {
NativeModule.map.set(id, mod);
}

NativeModule.require = function(id) {
function nativeModuleRequire(id) {
if (id === loaderId) {
return loaderExports;
}
Expand All @@ -218,8 +223,9 @@ NativeModule.require = function(id) {
moduleLoadList.push(`NativeModule ${id}`);
mod.compile();
return mod.exports;
};
}

NativeModule.require = nativeModuleRequire;
NativeModule.exists = function(id) {
return NativeModule.map.has(id);
};
Expand Down
Loading

0 comments on commit 6967f91

Please sign in to comment.