capnp-js
Version:
Capnproto run-time decoding and encoding for Node
58 lines (57 loc) • 2.26 kB
JavaScript
var reader = require('../../reader/layout/list');
var isNull = require('../../reader/isNull');
var layout = require('../layout/list');
var copy = require('../copy/pointer');
var upgrade = require('../upgrade');
var field = require('./field/index');
var deref = function(List) {
List._deref = function(arena, pointer) {
var ell = reader.unsafe(arena, pointer);
if (ell.dataBytes < List._CT.dataBytes || ell.pointersBytes < List._CT.pointersBytes) {
upgrade.list(arena, pointer, List._CT);
return new List(arena, false, reader.unsafe(arena, pointer));
}
return new List(arena, false, ell);
};
};
var init = function(List) {
var stride = List._CT.dataBytes + List._CT.pointersBytes;
List._init = function(arena, pointer, length) {
var size = length * stride;
var blob = arena._preallocate(pointer.segment, size);
arena._zero(blob, size);
layout.preallocated(pointer, blob, List._CT, length);
return new List(arena, false, reader.unsafe(arena, pointer));
};
};
var initOrphan = function(List) {
List._initOrphan = function(arena, length) {
var size = length * (List._CT.dataBytes + List._CT.pointersBytes);
var blob = arena._allocate(size);
arena._zero(blob, size);
return new List(arena, true, {
segment: blob.segment,
begin: blob.position,
length: length,
dataBytes: List._CT.dataBytes,
pointersBytes: List._CT.pointersBytes
});
};
};
var set = function(List) {
List._set = function(arena, pointer, value) {
if (value._TYPE.equiv(List._TYPE)) throw new TypeError();
copy.setListPointer(value._arena, value._layout(), arena, pointer);
};
};
exports.deref = deref;
exports.init = init;
exports.initOrphan = initOrphan;
exports.set = set;
exports.install = function(Nonstruct) {
deref(Nonstruct);
init(Nonstruct);
initOrphan(Nonstruct);
set(Nonstruct);
field.install(Nonstruct);
};