Skip to content

Commit 6418a86

Browse files
committedJan 24, 2019
Take alignment into account when dealing with structs
1 parent 73f4619 commit 6418a86

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed
 

‎index.js

+19-16
Original file line numberDiff line numberDiff line change
@@ -2318,27 +2318,25 @@ function Runtime() {
23182318
toNative = identityTransform;
23192319
}
23202320

2321+
const [totalSize, fieldOffsets] = fieldTypes.reduce(function (result, t) {
2322+
const [previousOffset, offsets] = result;
2323+
2324+
const {size} = t;
2325+
const offset = align(previousOffset, size);
2326+
offsets.push(offset);
2327+
2328+
return [offset + size, offsets];
2329+
}, [0, []]);
2330+
23212331
return {
2322-
type: fieldTypes.map(function (t) {
2323-
return t.type;
2324-
}),
2325-
size: fieldTypes.reduce(function (totalSize, t) {
2326-
return totalSize + t.size;
2327-
}, 0),
2332+
type: fieldTypes.map(t => t.type),
2333+
size: totalSize,
23282334
read: function (address) {
2329-
let source = address;
2330-
return fieldTypes.map((type, index) => {
2331-
const result = type.read(source);
2332-
source = source.add(type.size);
2333-
return result;
2334-
});
2335+
return fieldTypes.map((type, index) => type.read(address.add(fieldOffsets[index])));
23352336
},
23362337
write: function (address, values) {
2337-
let target = address;
23382338
values.forEach((value, index) => {
2339-
const type = fieldTypes[index];
2340-
type.write(target, value);
2341-
target = target.add(type.size);
2339+
fieldTypes[index].write(address.add(fieldOffsets[index]), value);
23422340
});
23432341
},
23442342
fromNative: fromNative,
@@ -2545,6 +2543,11 @@ function Runtime() {
25452543
function identityTransform(v) {
25462544
return v;
25472545
}
2546+
2547+
function align(value, boundary) {
2548+
const remainder = value % boundary;
2549+
return (remainder === 0) ? value : value + (boundary - remainder);
2550+
}
25482551
}
25492552

25502553
let _api = null;

0 commit comments

Comments
 (0)
Please sign in to comment.