UNPKG

capnp-js

Version:

Capnproto run-time decoding and encoding for Node

58 lines (57 loc) 2.26 kB
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); };