diff --git a/src/node_contextify.cc b/src/node_contextify.cc index 0f51b7cde40db8..35b95b8a5e3533 100644 --- a/src/node_contextify.cc +++ b/src/node_contextify.cc @@ -507,10 +507,11 @@ class ContextifyScript : public BaseObject { ScriptCompiler::CachedData* cached_data = nullptr; if (!cached_data_buf.IsEmpty()) { - ArrayBuffer::Contents contents = - cached_data_buf.ToLocalChecked()->Buffer()->GetContents(); + Local ui8 = cached_data_buf.ToLocalChecked(); + ArrayBuffer::Contents contents = ui8->Buffer()->GetContents(); cached_data = new ScriptCompiler::CachedData( - static_cast(contents.Data()), contents.ByteLength()); + static_cast(contents.Data()) + ui8->ByteOffset(), + ui8->ByteLength()); } ScriptOrigin origin(filename, lineOffset, columnOffset); diff --git a/test/parallel/test-vm-cached-data.js b/test/parallel/test-vm-cached-data.js index 47ea592b531538..549eeecf26d9a4 100644 --- a/test/parallel/test-vm-cached-data.js +++ b/test/parallel/test-vm-cached-data.js @@ -4,30 +4,58 @@ const assert = require('assert'); const vm = require('vm'); const Buffer = require('buffer').Buffer; -const originalSource = '(function bcd() { return \'original\'; })'; +function getSource(tag) { + return `(function ${tag}() { return \'${tag}\'; })`; +} -// It should produce code cache -const original = new vm.Script(originalSource, { - produceCachedData: true -}); -assert(original.cachedData instanceof Buffer); +function produce(source) { + const script = new vm.Script(source, { + produceCachedData: true + }); + assert(script.cachedData instanceof Buffer); -assert.equal(original.runInThisContext()(), 'original'); + return script.cachedData; +} -// It should consume code cache -const success = new vm.Script(originalSource, { - cachedData: original.cachedData -}); -assert(!success.cachedDataRejected); +function testProduceConsume() { + const source = getSource('original'); -assert.equal(success.runInThisContext()(), 'original'); + const data = produce(source); -// It should reject invalid code cache -const reject = new vm.Script('(function abc() { return \'invalid\'; })', { - cachedData: original.cachedData -}); -assert(reject.cachedDataRejected); -assert.equal(reject.runInThisContext()(), 'invalid'); + // It should consume code cache + const script = new vm.Script(source, { + cachedData: data + }); + assert(!script.cachedDataRejected); + assert.equal(script.runInThisContext()(), 'original'); +} +testProduceConsume(); + +function testRejectInvalid() { + const source = getSource('invalid'); + + const data = produce(source); + + // It should reject invalid code cache + const script = new vm.Script(getSource('invalid_1'), { + cachedData: data + }); + assert(script.cachedDataRejected); + assert.equal(script.runInThisContext()(), 'invalid_1'); +} +testRejectInvalid(); + +function testRejectSlice() { + const source = getSource('slice'); + + const data = produce(source).slice(4); + + const script = new vm.Script(source, { + cachedData: data + }); + assert(script.cachedDataRejected); +} +testRejectSlice(); // It should throw on non-Buffer cachedData assert.throws(() => {