From 8a09f3fb0bff86ccc8cce4290b03d498fa59318a Mon Sep 17 00:00:00 2001 From: Maxim Zaks Date: Sun, 14 Aug 2022 03:29:28 +0200 Subject: [PATCH] Fix FlexBuffers JS/TS bug https://github.com/google/flatbuffers/issues/6934 (#7434) Co-authored-by: Derek Bailey --- tests/JavaScriptFlexBuffersTest.js | 1 + ts/flexbuffers/reference-util.ts | 12 ++++++------ ts/flexbuffers/reference.ts | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/JavaScriptFlexBuffersTest.js b/tests/JavaScriptFlexBuffersTest.js index d2462c674..f7ea85fb8 100644 --- a/tests/JavaScriptFlexBuffersTest.js +++ b/tests/JavaScriptFlexBuffersTest.js @@ -264,6 +264,7 @@ function testRoundTrip() { _assert(example); _assert(0x100000001n); + _assert({ test_number: 72.6 }) } function testRoundTripWithBuilder() { diff --git a/ts/flexbuffers/reference-util.ts b/ts/flexbuffers/reference-util.ts index c55a941aa..52fb6007f 100644 --- a/ts/flexbuffers/reference-util.ts +++ b/ts/flexbuffers/reference-util.ts @@ -65,8 +65,8 @@ export function keyIndex(key: string, dataView: DataView, offset: number, parent const input = toUTF8Array(key); const keysVectorOffset = indirect(dataView, offset, parentWidth) - byteWidth * 3; const bitWidth = fromByteWidth(byteWidth); - const indirectOffset = keysVectorOffset - (readUInt(dataView, keysVectorOffset, bitWidth) as number); - const _byteWidth = readUInt(dataView, keysVectorOffset + byteWidth, bitWidth) as number; + const indirectOffset = keysVectorOffset - Number(readUInt(dataView, keysVectorOffset, bitWidth)); + const _byteWidth = Number(readUInt(dataView, keysVectorOffset + byteWidth, bitWidth)); let low = 0; let high = length - 1; while (low <= high) { @@ -84,7 +84,7 @@ export function keyIndex(key: string, dataView: DataView, offset: number, parent export function diffKeys(input: Uint8Array, index: number, dataView: DataView, offset: number, width: number): number { const keyOffset = offset + index * width; - const keyIndirectOffset = keyOffset - (readUInt(dataView, keyOffset, fromByteWidth(width)) as number); + const keyIndirectOffset = keyOffset - Number(readUInt(dataView, keyOffset, fromByteWidth(width))); for (let i = 0; i < input.length; i++) { const dif = input[i] - dataView.getUint8(keyIndirectOffset + i); if (dif !== 0) { @@ -97,10 +97,10 @@ export function diffKeys(input: Uint8Array, index: number, dataView: DataView, o export function keyForIndex(index: number, dataView: DataView, offset: number, parentWidth: number, byteWidth: number): string { const keysVectorOffset = indirect(dataView, offset, parentWidth) - byteWidth * 3; const bitWidth = fromByteWidth(byteWidth); - const indirectOffset = keysVectorOffset - (readUInt(dataView, keysVectorOffset, bitWidth) as number); - const _byteWidth = readUInt(dataView, keysVectorOffset + byteWidth, bitWidth) as number; + const indirectOffset = keysVectorOffset - Number(readUInt(dataView, keysVectorOffset, bitWidth)); + const _byteWidth = Number(readUInt(dataView, keysVectorOffset + byteWidth, bitWidth)); const keyOffset = indirectOffset + index * _byteWidth; - const keyIndirectOffset = keyOffset - (readUInt(dataView, keyOffset, fromByteWidth(_byteWidth)) as number); + const keyIndirectOffset = keyOffset - Number(readUInt(dataView, keyOffset, fromByteWidth(_byteWidth))); let length = 0; while (dataView.getUint8(keyIndirectOffset + length) !== 0) { length++; diff --git a/ts/flexbuffers/reference.ts b/ts/flexbuffers/reference.ts index 0eff6f465..38c2f0a94 100644 --- a/ts/flexbuffers/reference.ts +++ b/ts/flexbuffers/reference.ts @@ -157,7 +157,7 @@ export class Reference { } else { this._length = 1; } - return this._length; + return Number(this._length); } toObject(): unknown {