Skip to content

Commit

Permalink
v8: refactor struture of v8 module
Browse files Browse the repository at this point in the history
Use the more efficient module.exports = {} pattern,
restructure imports from bindings, requires.

PR-URL: #12681
Reviewed-By: Vse Mozhet Byt <vsemozhetbyt@gmail.com>
  • Loading branch information
jasnell committed Apr 28, 2017
1 parent bed4612 commit 1052383
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 56 deletions.
3 changes: 1 addition & 2 deletions benchmark/v8/get-stats.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ const bench = common.createBenchmark(main, {
'getHeapStatistics',
'getHeapSpaceStatistics'
],
n: [1e6],
flags: ['--ignition --turbo', '']
n: [1e6]
});

function main(conf) {
Expand Down
116 changes: 62 additions & 54 deletions lib/v8.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,44 +14,50 @@

'use strict';

const Buffer = require('buffer').Buffer;

const v8binding = process.binding('v8');
const serdesBinding = process.binding('serdes');
const bufferBinding = process.binding('buffer');

const { Buffer } = require('buffer');
const { Serializer, Deserializer } = process.binding('serdes');
const { copy } = process.binding('buffer');
const { objectToString } = require('internal/util');
const { FastBuffer } = require('internal/buffer');

// Properties for heap statistics buffer extraction.
const {
cachedDataVersionTag,
setFlagsFromString,
heapStatisticsArrayBuffer,
heapSpaceStatisticsArrayBuffer,
updateHeapStatisticsArrayBuffer,
updateHeapSpaceStatisticsArrayBuffer,

// Properties for heap and heap space statistics buffer extraction.
kTotalHeapSizeIndex,
kTotalHeapSizeExecutableIndex,
kTotalPhysicalSizeIndex,
kTotalAvailableSize,
kUsedHeapSizeIndex,
kHeapSizeLimitIndex,
kDoesZapGarbageIndex,
kMallocedMemoryIndex,
kPeakMallocedMemoryIndex,
kHeapSpaces,
kHeapSpaceStatisticsPropertiesCount,
kSpaceSizeIndex,
kSpaceUsedSizeIndex,
kSpaceAvailableSizeIndex,
kPhysicalSpaceSizeIndex
} = process.binding('v8');

const kNumberOfHeapSpaces = kHeapSpaces.length;

const heapStatisticsBuffer =
new Float64Array(v8binding.heapStatisticsArrayBuffer);
const kTotalHeapSizeIndex = v8binding.kTotalHeapSizeIndex;
const kTotalHeapSizeExecutableIndex = v8binding.kTotalHeapSizeExecutableIndex;
const kTotalPhysicalSizeIndex = v8binding.kTotalPhysicalSizeIndex;
const kTotalAvailableSize = v8binding.kTotalAvailableSize;
const kUsedHeapSizeIndex = v8binding.kUsedHeapSizeIndex;
const kHeapSizeLimitIndex = v8binding.kHeapSizeLimitIndex;
const kDoesZapGarbageIndex = v8binding.kDoesZapGarbageIndex;
const kMallocedMemoryIndex = v8binding.kMallocedMemoryIndex;
const kPeakMallocedMemoryIndex = v8binding.kPeakMallocedMemoryIndex;

// Properties for heap space statistics buffer extraction.
new Float64Array(heapStatisticsArrayBuffer);

const heapSpaceStatisticsBuffer =
new Float64Array(v8binding.heapSpaceStatisticsArrayBuffer);
const kHeapSpaces = v8binding.kHeapSpaces;
const kNumberOfHeapSpaces = kHeapSpaces.length;
const kHeapSpaceStatisticsPropertiesCount =
v8binding.kHeapSpaceStatisticsPropertiesCount;
const kSpaceSizeIndex = v8binding.kSpaceSizeIndex;
const kSpaceUsedSizeIndex = v8binding.kSpaceUsedSizeIndex;
const kSpaceAvailableSizeIndex = v8binding.kSpaceAvailableSizeIndex;
const kPhysicalSpaceSizeIndex = v8binding.kPhysicalSpaceSizeIndex;

exports.getHeapStatistics = function() {
new Float64Array(heapSpaceStatisticsArrayBuffer);

function getHeapStatistics() {
const buffer = heapStatisticsBuffer;

v8binding.updateHeapStatisticsArrayBuffer();
updateHeapStatisticsArrayBuffer();

return {
'total_heap_size': buffer[kTotalHeapSizeIndex],
Expand All @@ -64,15 +70,12 @@ exports.getHeapStatistics = function() {
'peak_malloced_memory': buffer[kPeakMallocedMemoryIndex],
'does_zap_garbage': buffer[kDoesZapGarbageIndex]
};
};

exports.cachedDataVersionTag = v8binding.cachedDataVersionTag;
exports.setFlagsFromString = v8binding.setFlagsFromString;
}

exports.getHeapSpaceStatistics = function() {
function getHeapSpaceStatistics() {
const heapSpaceStatistics = new Array(kNumberOfHeapSpaces);
const buffer = heapSpaceStatisticsBuffer;
v8binding.updateHeapSpaceStatisticsArrayBuffer();
updateHeapSpaceStatisticsArrayBuffer();

for (var i = 0; i < kNumberOfHeapSpaces; i++) {
const propertyOffset = i * kHeapSpaceStatisticsPropertiesCount;
Expand All @@ -86,17 +89,14 @@ exports.getHeapSpaceStatistics = function() {
}

return heapSpaceStatistics;
};
}

/* V8 serialization API */

const Serializer = exports.Serializer = serdesBinding.Serializer;
const Deserializer = exports.Deserializer = serdesBinding.Deserializer;

/* JS methods for the base objects */
Serializer.prototype._getDataCloneError = Error;

Deserializer.prototype.readRawBytes = function(length) {
Deserializer.prototype.readRawBytes = function readRawBytes(length) {
const offset = this._readRawBytes(length);
// `this.buffer` can be a Buffer or a plain Uint8Array, so just calling
// `.slice()` doesn't work.
Expand Down Expand Up @@ -155,8 +155,6 @@ class DefaultSerializer extends Serializer {
}
}

exports.DefaultSerializer = DefaultSerializer;

class DefaultDeserializer extends Deserializer {
constructor(buffer) {
super(buffer);
Expand All @@ -176,27 +174,37 @@ class DefaultDeserializer extends Deserializer {
byteLength / BYTES_PER_ELEMENT);
} else {
// Copy to an aligned buffer first.
const copy = Buffer.allocUnsafe(byteLength);
bufferBinding.copy(this.buffer, copy, 0,
byteOffset, byteOffset + byteLength);
return new ctor(copy.buffer,
copy.byteOffset,
const buffer_copy = Buffer.allocUnsafe(byteLength);
copy(this.buffer, buffer_copy, 0, byteOffset, byteOffset + byteLength);
return new ctor(buffer_copy.buffer,
buffer_copy.byteOffset,
byteLength / BYTES_PER_ELEMENT);
}
}
}

exports.DefaultDeserializer = DefaultDeserializer;

exports.serialize = function serialize(value) {
function serialize(value) {
const ser = new DefaultSerializer();
ser.writeHeader();
ser.writeValue(value);
return ser.releaseBuffer();
};
}

exports.deserialize = function deserialize(buffer) {
function deserialize(buffer) {
const der = new DefaultDeserializer(buffer);
der.readHeader();
return der.readValue();
}

module.exports = exports = {
cachedDataVersionTag,
getHeapStatistics,
getHeapSpaceStatistics,
setFlagsFromString,
Serializer,
Deserializer,
DefaultSerializer,
DefaultDeserializer,
deserialize,
serialize
};

0 comments on commit 1052383

Please sign in to comment.