From 316bc10515f16e336bcc12e93d0d20dbe2e99dfe Mon Sep 17 00:00:00 2001 From: Alexander Bertram Date: Tue, 28 Sep 2021 11:41:46 +0200 Subject: [PATCH 1/2] Fixes incorrect DataViewImpl when constructed with offset. See bug report in https://github.com/gwtproject/gwt/issues/9738 --- .../typedarrays/shared/DataViewTest.java | 9 ++++++ .../typedarrays/server/DataViewImpl.java | 30 +++++++++---------- .../typedarrays/server/JavaImpl.java | 1 + 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/gwt-typedarrays-gwt2-tests/src/test/java/org/gwtproject/typedarrays/shared/DataViewTest.java b/gwt-typedarrays-gwt2-tests/src/test/java/org/gwtproject/typedarrays/shared/DataViewTest.java index b556c98..08b447f 100644 --- a/gwt-typedarrays-gwt2-tests/src/test/java/org/gwtproject/typedarrays/shared/DataViewTest.java +++ b/gwt-typedarrays-gwt2-tests/src/test/java/org/gwtproject/typedarrays/shared/DataViewTest.java @@ -71,6 +71,15 @@ public void testBasic() { assertEquals(0x80042001, view.getInt32(0, true)); } + public void testWithOffset() { + Int8Array array = TypedArrays.createInt8Array(8); + array.set(new byte[] {0, 1, 2, 3, 4, 5, 6, 7}, 0); + + DataView view = TypedArrays.createDataView(array.buffer(), 3, 4); + assertEquals((byte) 3, view.getInt8(0)); + assertEquals((byte) 4, view.getInt8(1)); + } + // public void testFoo() { // System.out.println((short)0x80); // System.out.println((byte)((short)0x80)); diff --git a/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/DataViewImpl.java b/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/DataViewImpl.java index 7443a9e..fe6aae7 100644 --- a/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/DataViewImpl.java +++ b/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/DataViewImpl.java @@ -39,7 +39,7 @@ public float getFloat32(int byteOffset) { @Override public float getFloat32(int byteOffset, boolean littleEndian) { - return arrayBuf.getFloat32(byteOffset, littleEndian); + return arrayBuf.getFloat32(this.byteOffset + byteOffset, littleEndian); } @Override @@ -49,7 +49,7 @@ public double getFloat64(int byteOffset) { @Override public double getFloat64(int byteOffset, boolean littleEndian) { - return arrayBuf.getFloat64(byteOffset, littleEndian); + return arrayBuf.getFloat64(this.byteOffset + byteOffset, littleEndian); } @Override @@ -59,7 +59,7 @@ public short getInt16(int byteOffset) { @Override public short getInt16(int byteOffset, boolean littleEndian) { - return arrayBuf.getInt16(byteOffset, littleEndian); + return arrayBuf.getInt16(this.byteOffset + byteOffset, littleEndian); } @Override @@ -69,12 +69,12 @@ public int getInt32(int byteOffset) { @Override public int getInt32(int byteOffset, boolean littleEndian) { - return arrayBuf.getInt32(byteOffset, littleEndian); + return arrayBuf.getInt32(this.byteOffset + byteOffset, littleEndian); } @Override public byte getInt8(int byteOffset) { - return arrayBuf.getInt8(byteOffset); + return arrayBuf.getInt8(this.byteOffset + byteOffset); } @Override @@ -84,7 +84,7 @@ public int getUint16(int byteOffset) { @Override public int getUint16(int byteOffset, boolean littleEndian) { - int val = arrayBuf.getInt16(byteOffset, littleEndian); + int val = arrayBuf.getInt16(this.byteOffset + byteOffset, littleEndian); if (val < 0) { val += 0x10000; } @@ -98,7 +98,7 @@ public long getUint32(int byteOffset) { @Override public long getUint32(int byteOffset, boolean littleEndian) { - long val = arrayBuf.getInt32(byteOffset, littleEndian); + long val = arrayBuf.getInt32(this.byteOffset + byteOffset, littleEndian); if (val < 0) { val += 0x100000000L; } @@ -131,7 +131,7 @@ public void setFloat32(int byteOffset, float value) { @Override public void setFloat32(int byteOffset, float value, boolean littleEndian) { - arrayBuf.setFloat32(byteOffset, value, littleEndian); + arrayBuf.setFloat32(this.byteOffset + byteOffset, value, littleEndian); } @Override @@ -141,7 +141,7 @@ public void setFloat64(int byteOffset, double value) { @Override public void setFloat64(int byteOffset, double value, boolean littleEndian) { - arrayBuf.setFloat64(byteOffset, value, littleEndian); + arrayBuf.setFloat64(this.byteOffset + byteOffset, value, littleEndian); } @Override @@ -151,7 +151,7 @@ public void setInt16(int byteOffset, int value) { @Override public void setInt16(int byteOffset, int value, boolean littleEndian) { - arrayBuf.setInt16(byteOffset, (short) (value & 0xFFFF), littleEndian); + arrayBuf.setInt16(this.byteOffset + byteOffset, (short) (value & 0xFFFF), littleEndian); } @Override @@ -161,12 +161,12 @@ public void setInt32(int byteOffset, int value) { @Override public void setInt32(int byteOffset, int value, boolean littleEndian) { - arrayBuf.setInt32(byteOffset, value, littleEndian); + arrayBuf.setInt32(this.byteOffset + byteOffset, value, littleEndian); } @Override public void setInt8(int byteOffset, int value) { - arrayBuf.setInt8(byteOffset, (byte) (value & 255)); + arrayBuf.setInt8(this.byteOffset + byteOffset, (byte) (value & 255)); } @Override @@ -176,7 +176,7 @@ public void setUint16(int byteOffset, int value) { @Override public void setUint16(int byteOffset, int value, boolean littleEndian) { - arrayBuf.setInt16(byteOffset, (short) (value & 0xFFFF), littleEndian); + arrayBuf.setInt16(this.byteOffset + byteOffset, (short) (value & 0xFFFF), littleEndian); } @Override @@ -186,7 +186,7 @@ public void setUint32(int byteOffset, long value) { @Override public void setUint32(int byteOffset, long value, boolean littleEndian) { - arrayBuf.setInt32(byteOffset, (int) (value & 0xFFFFFFFF), littleEndian); + arrayBuf.setInt32(this.byteOffset + byteOffset, (int) (value & 0xFFFFFFFF), littleEndian); } @Override @@ -201,6 +201,6 @@ public void setUint32FromDouble(int byteOffset, double value, boolean littleEndi @Override public void setUint8(int byteOffset, int value) { - arrayBuf.setInt8(byteOffset, (byte) (value & 255)); + arrayBuf.setInt8(this.byteOffset + byteOffset, (byte) (value & 255)); } } diff --git a/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java b/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java index 02ea46e..cc5ee4a 100644 --- a/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java +++ b/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java @@ -42,6 +42,7 @@ public ArrayBuffer createArrayBuffer(int length) { @GwtIncompatible @Override public DataView createDataView(ArrayBuffer buffer, int byteOffset, int byteLength) { + ArrayBufferImpl impl = (ArrayBufferImpl) buffer; return new DataViewImpl(buffer, byteOffset, byteLength); } From 0d18955f9318d595415323450223792ed74ef9e0 Mon Sep 17 00:00:00 2001 From: Alexander Bertram Date: Tue, 28 Sep 2021 12:00:43 +0200 Subject: [PATCH 2/2] Remove unused assignment --- .../main/java/org/gwtproject/typedarrays/server/JavaImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java b/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java index cc5ee4a..02ea46e 100644 --- a/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java +++ b/gwt-typedarrays/src/main/java/org/gwtproject/typedarrays/server/JavaImpl.java @@ -42,7 +42,6 @@ public ArrayBuffer createArrayBuffer(int length) { @GwtIncompatible @Override public DataView createDataView(ArrayBuffer buffer, int byteOffset, int byteLength) { - ArrayBufferImpl impl = (ArrayBufferImpl) buffer; return new DataViewImpl(buffer, byteOffset, byteLength); }