mirror of
https://github.com/nodejs/node.git
synced 2025-05-02 20:25:27 +00:00

This patch makes it possible to generate the code cache for the builtins directly from the original script object (instead of compiling a new one) and after the script has been run (via `NativeModule.require`). Before this patch only the top level functions (the wrapped ones) are included in the cache, after this patch the inner functions in those modules will be included as well. Also blacklists modules from dependencies like V8 and node-inspect since we cannot guarantee that they are suitable to be executed directly. PR-URL: https://github.com/nodejs/node/pull/21567 Refs: https://github.com/nodejs/node/issues/21563 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: John-David Dalton <john.david.dalton@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
// This is only exposed for internal build steps and testing purposes.
|
|
// We create new copies of the source and the code cache
|
|
// so the resources eventually used to compile builtin modules
|
|
// cannot be tampered with even with --expose-internals
|
|
|
|
const {
|
|
NativeModule, internalBinding
|
|
} = require('internal/bootstrap/loaders');
|
|
|
|
function getCodeCache(id) {
|
|
const cached = NativeModule.getCached(id);
|
|
if (cached && (cached.loaded || cached.loading)) {
|
|
return cached.script.createCachedData();
|
|
}
|
|
|
|
// The script has not been compiled and run
|
|
NativeModule.require(id);
|
|
return getCodeCache(id);
|
|
}
|
|
|
|
const depsModule = Object.keys(NativeModule._source).filter(
|
|
(key) => NativeModule.isDepsModule(key) || key.startsWith('internal/deps')
|
|
);
|
|
|
|
// Modules with source code compiled in js2c that
|
|
// cannot be compiled with the code cache
|
|
const cannotUseCache = [
|
|
'config',
|
|
'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'
|
|
].concat(depsModule);
|
|
|
|
module.exports = {
|
|
cachableBuiltins: Object.keys(NativeModule._source).filter(
|
|
(key) => !cannotUseCache.includes(key)
|
|
),
|
|
builtinSource: Object.assign({}, NativeModule._source),
|
|
getCodeCache,
|
|
codeCache: internalBinding('code_cache'),
|
|
compiledWithoutCache: NativeModule.compiledWithoutCache,
|
|
compiledWithCache: NativeModule.compiledWithCache,
|
|
nativeModuleWrap(script) {
|
|
return NativeModule.wrap(script);
|
|
},
|
|
cannotUseCache
|
|
};
|