UNPKG

capnp-js

Version:

Capnproto run-time decoding and encoding for Node

180 lines (179 loc) 7.76 kB
var isNull = require('../reader/isNull'); var copy = require('./copy/pointer'); var primitives = require('./primitives'); var layout = require('./layout/index'); // Float conversion helpers var buffer = new ArrayBuffer(8); var view = new DataView(buffer); function throwOnInactive(actual, sought) { if (actual !== sought) throw new Error("Attempted to access an inactive union member"); } exports.throwOnInactive = throwOnInactive; exports.bool = function(value, defaultValue, bytes, position, bitPosition) { primitives.bool(!!value ^ defaultValue, bytes, position, bitPosition); }; exports.int8 = function(value, defaultValue, bytes, position) { primitives.int8(value ^ defaultValue, bytes, position); }; exports.int16 = function(value, defaultValue, bytes, position) { primitives.int16(value ^ defaultValue, bytes, position); }; exports.int32 = function(value, defaultValue, bytes, position) { primitives.int32(value ^ defaultValue, bytes, position); }; exports.int64 = function(value, defaultValue, bytes, position) { primitives.int32(value[0] ^ defaultValue[0], bytes, position + 4); primitives.int32(value[1] ^ defaultValue[1], bytes, position); }; exports.uint8 = function(value, defaultValue, bytes, position) { primitives.uint8(value ^ defaultValue, bytes, position); }; exports.uint16 = function(value, defaultValue, bytes, position) { primitives.uint16(value ^ defaultValue, bytes, position); }; exports.uint32 = function(value, defaultValue, bytes, position) { primitives.uint32(value ^ defaultValue, bytes, position); }; exports.uint64 = function(value, defaultValue, bytes, position) { primitives.uint32(value[0] ^ defaultValue[0], bytes, position + 4); primitives.uint32(value[1] ^ defaultValue[1], bytes, position); }; exports.float32 = function(value, defaultBytes, bytes, position) { view.setFloat32(0, value, true); var i = 3; do { bytes[position + i] = buffer[i] ^ defaultBytes[i]; } while (i--); }; exports.float64 = function(value, defaultBytes, bytes, position) { view.setFloat64(0, value, true); var i = 7; do { bytes[position + i] = buffer[i] ^ defaultBytes[i]; } while (i--); }; exports.pointer = { disown: function(Type) { return function(context, offset) { var pointer = { segment: context._segment, position: context._pointersSection + offset }; var instance = Type._deref(context._arena, pointer); context._arena._zero(pointer, 8); instance._isOrphan = true; return instance; }; }, disownReader: function(ReaderType) { return function(context, offset) { var pointer = { segment: context._segment, position: context._pointersSection + offset }; var instance = Type._deref(context._arena, pointer, 0); context._arena._zero(pointer, 8); instance._isOrphan = true; return instance; }; }, has: function() { return function(context, offset) { return !isNull({ segment: context._segment, position: context._pointersSection + offset }); }; } }; exports.list = { adopt: function() { return function(context, offset, value) { var meta = value._rt(); var blob = { segment: value._segment, position: value._begin }; if (meta.layout === 7) { blob.position -= 8; } layout.list.nonpreallocated(context._arena, { segment: context._segment, position: context._pointersSection + offset }, blob, meta, value._length); value._isOrphan = false; }; }, get: function(List) { return function(defaultPosition, context, offset) { var pointer = { segment: context._segment, position: context._pointersSection + offset }; if (isNull(pointer)) { var d = context._pointerDefaults[defaultPosition]; copy.setListPointer(d._arena, d._layout(), context._arena, pointer); } return List._deref(context._arena, pointer); }; }, init: function(List) { return function(context, offset, length) { return List._init(context._arena, { segment: context._segment, position: context._pointersSection + offset }, length); }; }, set: function(List) { return function(context, offset, value) { copy.setListPointer(value._arena, value._layout(), context._arena, { segment: context._segment, position: context._pointersSection + offset }); }; } }; exports.struct = { adopt: function() { return function(context, offset, value) { layout.struct.nonpreallocated(context._arena, { segment: context._segment, position: context._pointersSection + offset }, { segment: value._segment, position: value._dataSection }, value._rt()); value._isOrphan = false; }; }, get: function(Structure) { return function(defaultPosition, context, offset) { var pointer = { segment: context._segment, position: context._pointersSection + offset }; if (isNull(pointer)) { var d = context._pointerDefaults[defaultPosition]; copy.setStructPointer(d._arena, d._layout(), context._arena, pointer); } return Structure._deref(context._arena, pointer); }; }, init: function(Structure) { return function(context, offset) { return Structure._init(context._arena, { segment: context._segment, position: context._pointersSection + offset }); }; }, set: function(Structure) { return function(context, offset, value) { copy.setStructPointer(value._arena, value._layout(), context._arena, { segment: context._segment, position: context._pointersSection + offset }); }; } };