summaryrefslogtreecommitdiff
path: root/tools/generate_code_cache.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/generate_code_cache.js')
-rw-r--r--tools/generate_code_cache.js32
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
`;