capnp-js
Version:
Capnproto run-time decoding and encoding for Node
93 lines (92 loc) • 2.99 kB
JavaScript
var primitives = require('../primitives');
var safe = require('./safe');
var unsafe = require('./unsafe');
/*
* Compute the number of bytes in a structure's data section.
*
* * pointer Datum - A pointer to the structure whose data section byte
* count is sought.
*
* RETURNS: UInt19
*/
var dataBytes = function(pointer) {
return primitives.uint16(pointer.segment, pointer.position + 4) << 3;
};
/*
* Compute the number of bytes in a structure's pointer section.
*
* * pointer Datum - A pointer to the structure whose pointer section byte
* count is sought.
*
* RETURNS: UInt19
*/
var pointersBytes = function(pointer) {
return primitives.uint16(pointer.segment, pointer.position + 6) << 3;
};
/*
* Compute a structure's layout from its pointer and blob.
*
* * tag Datum - A structure's pointer.
* * blob Datum - The blob corresponding to `tag`.
*
* RETURNS: StructureLayout
*/
var layout = function(tag, blob) {
var pointers = blob.position + dataBytes(tag);
return {
meta: 0,
segment: blob.segment,
dataSection: blob.position,
pointersSection: pointers,
end: pointers + pointersBytes(tag)
};
};
/*
* Compute the layout of a blob from its metadata.
*/
var meta = function(blob, meta_) {
var pointers = blob.position + meta_.dataBytes;
return {
meta: 0,
segment: blob.segment,
dataSection: blob.position,
pointersSection: pointers,
end: pointers + meta_.pointersBytes
};
};
/*
* Compute the layout of an intrasegment structure pointer's structure.
* This function also handles the targets of single-far pointers.
*
* * pointer Datum - Position of the intrasegment structure pointer.
*
* RETURNS: StructureLayout
*/
var intrasegment = function(pointer) {
var half = primitives.int32(pointer.segment, pointer.position) & 4294967292;
var blob = {
segment: pointer.segment,
position: pointer.position + 8 + half + half
};
return layout(pointer, blob);
};
/*
* Compute the layout of an off-segment structure's layout. Single-far
* pointers should be resolved externally and then layed-out by
* `intrasegment`.
*
* * tag Datum - The far pointer's tag word.
* * blob Datum - The structure's blob.
*
* RETURNS: StructureLayout
*/
var intersegment = function(tag, blob) {
return layout(tag, blob);
};
exports.safe = safe(intrasegment, intersegment, 0);
exports.unsafe = unsafe(intrasegment, intersegment, 0);
exports.meta = meta;
exports.intrasegment = intrasegment;
exports.intersegment = intersegment;
exports.dataBytes = dataBytes;
exports.pointersBytes = pointersBytes;