UNPKG

capnp-js

Version:

Capnproto run-time decoding and encoding for Node

55 lines (54 loc) 1.92 kB
var type = require('../../type'); var statics = require('./statics'); var methods = require('./methods'); /* * Lists of dereferencable stuff, excluding structures. E.g. Text, Data, * List(X), AnyPointer. */ module.exports = function(Nonstruct) { var t = new type.List(Nonstruct._TYPE); var ct = { meta: 1, layout: 6, dataBytes: 0, pointersBytes: 8 }; var Pointers = function(arena, depth, isOrphan, list) { if (depth > arena.maxDepth) { throw new Error("Exceeded nesting depth limit"); } this._arena = arena; this._depth = depth; this._isOrphan = isOrphan; this._segment = list.segment; this._begin = list.begin; this._length = list.length; this._dataBytes = list.dataBytes; this._pointersBytes = list.pointersBytes; this._stride = this._dataBytes + this._pointersBytes; arena.limiter.read(list.segment, list.begin, list.length << 3); }; Pointers._TYPE = t; Pointers._CT = ct; Pointers._FIELD = {}; Pointers._HASH = "L|" + Nonstruct._HASH; Pointers._B64_NULL = "AQAAAAYAAAA="; statics.install(Pointers); Pointers.prototype = { _TYPE: t, _CT: ct, _rt: methods.rt, _layout: methods.layout }; Pointers.prototype.get = function(index) { if (index < 0 || this._length <= index) { throw new RangeError(); } return Nonstruct._deref(this._arena, { segment: this._segment, position: this._begin + this._dataBytes + index * this._stride }, this._depth + 1); }; methods.install(Pointers.prototype); return Pointers; };