diff --git a/src/jdk/nashorn/internal/objects/NativeDataView.java b/src/jdk/nashorn/internal/objects/NativeDataView.java index 44d06065592b44d87281c6ab4be5cff4548b1e87..759c168bbbde62fe88b06dab95fc666b79d77731 100644 --- a/src/jdk/nashorn/internal/objects/NativeDataView.java +++ b/src/jdk/nashorn/internal/objects/NativeDataView.java @@ -416,7 +416,7 @@ public class NativeDataView extends ScriptObject { * @return 32-bit unsigned int value at the byteOffset */ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) - public static long getUint32(final Object self, final Object byteOffset, final Object littleEndian) { + public static double getUint32(final Object self, final Object byteOffset, final Object littleEndian) { try { return 0xFFFFFFFFL & getBuffer(self, littleEndian).getInt(JSType.toInt32(byteOffset)); } catch (final IllegalArgumentException iae) { @@ -432,7 +432,7 @@ public class NativeDataView extends ScriptObject { * @return 32-bit unsigned int value at the byteOffset */ @SpecializedFunction - public static long getUint32(final Object self, final int byteOffset) { + public static double getUint32(final Object self, final int byteOffset) { try { return JSType.toUint32(getBuffer(self, false).getInt(JSType.toInt32(byteOffset))); } catch (final IllegalArgumentException iae) { @@ -449,7 +449,7 @@ public class NativeDataView extends ScriptObject { * @return 32-bit unsigned int value at the byteOffset */ @SpecializedFunction - public static long getUint32(final Object self, final int byteOffset, final boolean littleEndian) { + public static double getUint32(final Object self, final int byteOffset, final boolean littleEndian) { try { return JSType.toUint32(getBuffer(self, littleEndian).getInt(JSType.toInt32(byteOffset))); } catch (final IllegalArgumentException iae) { @@ -837,9 +837,9 @@ public class NativeDataView extends ScriptObject { * @return undefined */ @SpecializedFunction - public static Object setUint32(final Object self, final int byteOffset, final long value) { + public static Object setUint32(final Object self, final int byteOffset, final double value) { try { - getBuffer(self, false).putInt(byteOffset, (int)value); + getBuffer(self, false).putInt(byteOffset, (int) JSType.toUint32(value)); return UNDEFINED; } catch (final IllegalArgumentException iae) { throw rangeError(iae, "dataview.offset"); @@ -856,9 +856,9 @@ public class NativeDataView extends ScriptObject { * @return undefined */ @SpecializedFunction - public static Object setUint32(final Object self, final int byteOffset, final long value, final boolean littleEndian) { + public static Object setUint32(final Object self, final int byteOffset, final double value, final boolean littleEndian) { try { - getBuffer(self, littleEndian).putInt(byteOffset, (int)value); + getBuffer(self, littleEndian).putInt(byteOffset, (int) JSType.toUint32(value)); return UNDEFINED; } catch (final IllegalArgumentException iae) { throw rangeError(iae, "dataview.offset"); diff --git a/src/jdk/nashorn/internal/runtime/AccessorProperty.java b/src/jdk/nashorn/internal/runtime/AccessorProperty.java index 47b81fadf879970962f47b79be54441843e03619..b2530dfd2a68445cef9206d0dc7e4a1b0c7447cf 100644 --- a/src/jdk/nashorn/internal/runtime/AccessorProperty.java +++ b/src/jdk/nashorn/internal/runtime/AccessorProperty.java @@ -349,8 +349,6 @@ public class AccessorProperty extends Property { setType(hasDualFields() ? JSType.unboxedFieldType(initialValue) : Object.class); if (initialValue instanceof Integer) { invokeSetter(owner, ((Integer)initialValue).intValue()); - } else if (initialValue instanceof Long) { - invokeSetter(owner, ((Long)initialValue).longValue()); } else if (initialValue instanceof Double) { invokeSetter(owner, ((Double)initialValue).doubleValue()); } else { diff --git a/test/script/basic/JDK-8181191.js b/test/script/basic/JDK-8181191.js new file mode 100644 index 0000000000000000000000000000000000000000..4f4ef496d1f1f2385525bd0413ce47243d6dd187 --- /dev/null +++ b/test/script/basic/JDK-8181191.js @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8181191: getUint32 returning Long + * + * @test + * @run + */ + + +function uint32(x) { + var buffer = new ArrayBuffer(16); + var dataview = new DataView(buffer); + dataview.setUint32(0, x); + return dataview.getUint32(0); +} + +Assert.assertTrue(typeof uint32(0x7f) === 'number'); +Assert.assertTrue(typeof uint32(0x80) === 'number'); +Assert.assertTrue(typeof uint32(0xffffffff) === 'number'); +Assert.assertTrue(typeof uint32(0x100000000) === 'number'); + +Assert.assertTrue(uint32(0x7f) === 0x7f); +Assert.assertTrue(uint32(0x80) === 0x80); +Assert.assertTrue(uint32(0xffffffff) === 0xffffffff); +Assert.assertTrue(uint32(0x100000000) === 0x0); + +Assert.assertTrue(uint32(0x7f) === uint32(0x7f)); +Assert.assertTrue(uint32(0x80) === uint32(0x80)); +Assert.assertTrue(uint32(0xffffffff) === uint32(0xffffffff)); +Assert.assertTrue(uint32(0x100000000) === uint32(0x100000000)); diff --git a/test/src/jdk/nashorn/api/scripting/test/JDK_8182996_Test.java b/test/src/jdk/nashorn/api/scripting/test/JDK_8182996_Test.java new file mode 100644 index 0000000000000000000000000000000000000000..e4c55d52ace81188cbb65ef5f32df048db3567c8 --- /dev/null +++ b/test/src/jdk/nashorn/api/scripting/test/JDK_8182996_Test.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.nashorn.api.scripting.test; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.script.*; + +import static org.testng.Assert.assertEquals; + +/** + * @bug 8182996 + * @summary Incorrect mapping Long type to JavaScript equivalent + */ +@SuppressWarnings("javadoc") +public class JDK_8182996_Test { + + private ScriptEngine engine; + Bindings bindings; + + + @BeforeClass + public void setupTest() { + engine = new ScriptEngineManager().getEngineByName("js"); + bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); + + bindings.put("long1", Long.valueOf(1L)); + bindings.put("long2", Long.valueOf(2L)); + bindings.put("long2", Long.valueOf(3L)); + } + + @Test + public void testType() throws ScriptException { + assertEquals(engine.eval("typeof long1"), "object"); + assertEquals(engine.eval("typeof long2"), "object"); + } + + @Test + public void testValue() throws ScriptException { + assertEquals(engine.eval("long1"), Long.valueOf(1)); + assertEquals(engine.eval("long2"), Long.valueOf(3)); + assertEquals(bindings.get("long1"), Long.valueOf(1)); + assertEquals(bindings.get("long2"), Long.valueOf(3)); + } + +}