diff options
Diffstat (limited to 'tools/generate_code_cache.js')
-rw-r--r-- | tools/generate_code_cache.js | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/tools/generate_code_cache.js b/tools/generate_code_cache.js index 740cbd718a..35411bc5af 100644 --- a/tools/generate_code_cache.js +++ b/tools/generate_code_cache.js @@ -9,9 +9,17 @@ const { getCodeCache, + getSource, cachableBuiltins } = require('internal/bootstrap/cache'); +function hash(str) { + if (process.versions.openssl) { + return require('crypto').createHash('sha256').update(str).digest('hex'); + } + return ''; +} + const fs = require('fs'); const resultPath = process.argv[2]; @@ -51,6 +59,8 @@ function getInitalizer(key, cache) { const defName = key.replace(/\//g, '_').replace(/-/g, '_'); const definition = `static uint8_t ${defName}_raw[] = {\n` + `${cache.join(',')}\n};`; + const source = getSource(key); + const sourceHash = hash(source); const initializer = ` v8::Local<v8::ArrayBuffer> ${defName}_ab = v8::ArrayBuffer::New(isolate, ${defName}_raw, ${cache.length}); @@ -60,13 +70,19 @@ function getInitalizer(key, cache) { FIXED_ONE_BYTE_STRING(isolate, "${key}"), ${defName}_array).FromJust(); `; + const hashIntializer = ` + target->Set(context, + FIXED_ONE_BYTE_STRING(isolate, "${key}"), + OneByteString(isolate, "${sourceHash}")).FromJust(); + `; return { - definition, initializer + definition, initializer, hashIntializer, sourceHash }; } const cacheDefinitions = []; const cacheInitializers = []; +const cacheHashInitializers = []; let totalCacheSize = 0; @@ -79,11 +95,14 @@ for (const key of cachableBuiltins) { const length = cachedData.length; totalCacheSize += length; - const { definition, initializer } = getInitalizer(key, cachedData); + const { + definition, initializer, hashIntializer, sourceHash + } = getInitalizer(key, cachedData); cacheDefinitions.push(definition); cacheInitializers.push(initializer); + cacheHashInitializers.push(hashIntializer); console.log(`Generated cache for '${key}', size = ${formatSize(length)}` + - `, total = ${formatSize(totalCacheSize)}`); + `, hash = ${sourceHash}, total = ${formatSize(totalCacheSize)}`); } const result = `#include "node.h" @@ -106,6 +125,13 @@ void DefineCodeCache(Environment* env, v8::Local<v8::Object> target) { ${cacheInitializers.join('\n')} } +// The target here will be returned as \`internalBinding('code_cache_hash')\` +void DefineCodeCacheHash(Environment* env, v8::Local<v8::Object> target) { + v8::Isolate* isolate = env->isolate(); + v8::Local<v8::Context> context = env->context(); + ${cacheHashInitializers.join('\n')} +} + } // namespace node `; |