UNPKG

capnp-js-plugin

Version:

Capnproto implementation for Javascript

58 lines (56 loc) 1.98 kB
var any = require('capnp-js/reader/layout/any'); var meta = require('capnp-js/reader/list/meta'); var wordAlign = require('capnp-js/wordAlign'); var targeted = function(arena, iStart, iEnd) { var bytes = 0; for (;iStart.position < iEnd.position; iStart.position += 8) { bytes += blob(arena, any.unsafe(arena, iStart)); } return bytes; }; var blob = function(arena, layout) { var bytes; switch (layout.meta) { case 0: // Locals bytes = layout.end - layout.dataSection; // Follow pointers bytes += targeted(arena, { segment: layout.segment, position: layout.pointersSection }, { segment: layout.segment, position: layout.end }); break; case 1: // Locals var m = meta(layout); if (m.layout === 1) { bytes = layout.length >>> 3; if (layout.length & 7) bytes += 1; return wordAlign(bytes); } else if (m.layout === 7) { bytes = 8; } else { bytes = 0; } bytes += layout.length * (layout.dataBytes + layout.pointersBytes); bytes = wordAlign(bytes); if (layout.pointersBytes) { var iPointer = { segment: layout.segment, position: layout.begin + layout.dataBytes }; for (var i = 0; i < layout.length; ++i, iPointer.position += layout.dataBytes) { bytes += targeted(arena, iPointer, { segment: iPointer.segment, position: iPointer.position + layout.pointersBytes }); } } break; } return bytes; }; module.exports = blob;