capnp-js-plugin
Version:
Capnproto implementation for Javascript
58 lines (56 loc) • 1.98 kB
JavaScript
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;