8047359: large string size RangeError should be thrown rather than reporting negative length
Reviewed-by: hannesw, attila
--- a/nashorn/make/build.xml Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/make/build.xml Tue Jul 01 17:37:39 2014 +0530
@@ -125,8 +125,7 @@
encoding="${javac.encoding}"
includeantruntime="false" fork="true">
<compilerarg value="-J-Djava.ext.dirs="/>
- <compilerarg value="-Xlint:unchecked"/>
- <compilerarg value="-Xlint:deprecation"/>
+ <compilerarg value="-Xlint:all"/>
<compilerarg value="-XDignore.symbol.file"/>
<compilerarg value="-Xdiags:verbose"/>
</javac>
--- a/nashorn/src/jdk/internal/dynalink/beans/OverloadedMethod.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/internal/dynalink/beans/OverloadedMethod.java Tue Jul 01 17:37:39 2014 +0530
@@ -152,7 +152,7 @@
@SuppressWarnings("unused")
private MethodHandle selectMethod(final Object[] args) throws NoSuchMethodException {
- final Class<?>[] argTypes = new Class[args.length];
+ final Class<?>[] argTypes = new Class<?>[args.length];
for(int i = 0; i < argTypes.length; ++i) {
final Object arg = args[i];
argTypes[i] = arg == null ? ClassString.NULL_CLASS : arg.getClass();
--- a/nashorn/src/jdk/internal/dynalink/support/CompositeTypeBasedGuardingDynamicLinker.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/internal/dynalink/support/CompositeTypeBasedGuardingDynamicLinker.java Tue Jul 01 17:37:39 2014 +0530
@@ -111,7 +111,7 @@
private final TypeBasedGuardingDynamicLinker[] linkers;
private final List<TypeBasedGuardingDynamicLinker>[] singletonLinkers;
- @SuppressWarnings("unchecked")
+ @SuppressWarnings(value={"unchecked", "rawtypes"})
ClassToLinker(final TypeBasedGuardingDynamicLinker[] linkers) {
this.linkers = linkers;
singletonLinkers = new List[linkers.length];
@@ -120,6 +120,7 @@
}
}
+ @SuppressWarnings("fallthrough")
@Override
protected List<TypeBasedGuardingDynamicLinker> computeValue(final Class<?> clazz) {
List<TypeBasedGuardingDynamicLinker> list = NO_LINKER;
--- a/nashorn/src/jdk/nashorn/internal/codegen/FunctionSignature.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/codegen/FunctionSignature.java Tue Jul 01 17:37:39 2014 +0530
@@ -141,7 +141,7 @@
paramTypeList.add(paramType.getTypeClass());
}
- this.methodType = MH.type(returnType.getTypeClass(), paramTypeList.toArray(new Class[paramTypes.length]));
+ this.methodType = MH.type(returnType.getTypeClass(), paramTypeList.toArray(new Class<?>[paramTypes.length]));
}
/**
--- a/nashorn/src/jdk/nashorn/internal/ir/debug/NashornClassReader.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/ir/debug/NashornClassReader.java Tue Jul 01 17:37:39 2014 +0530
@@ -443,7 +443,7 @@
@Override
protected Label readLabel(final int offset, final Label[] labels) {
final Label label = super.readLabel(offset, labels);
- label.info = (int)offset;
+ label.info = offset;
return label;
}
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Tue Jul 01 17:37:39 2014 +0530
@@ -909,6 +909,7 @@
sb.append(n);
}
+ @SuppressWarnings("fallthrough")
private static String toStringImpl(final Object self, final int format) {
final NativeDate nd = getNativeDate(self);
--- a/nashorn/src/jdk/nashorn/internal/runtime/ConsString.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ConsString.java Tue Jul 01 17:37:39 2014 +0530
@@ -57,6 +57,9 @@
this.left = left;
this.right = right;
length = left.length() + right.length();
+ if (length < 0) {
+ throw new IllegalArgumentException("too big concatenated String");
+ }
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Tue Jul 01 17:37:39 2014 +0530
@@ -27,6 +27,7 @@
import static jdk.nashorn.internal.codegen.CompilerConstants.staticCall;
import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
+import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError;
import static jdk.nashorn.internal.runtime.ECMAErrors.referenceError;
import static jdk.nashorn.internal.runtime.ECMAErrors.syntaxError;
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
@@ -531,7 +532,11 @@
if (xPrim instanceof String || yPrim instanceof String
|| xPrim instanceof ConsString || yPrim instanceof ConsString) {
- return new ConsString(JSType.toCharSequence(xPrim), JSType.toCharSequence(yPrim));
+ try {
+ return new ConsString(JSType.toCharSequence(xPrim), JSType.toCharSequence(yPrim));
+ } catch (final IllegalArgumentException iae) {
+ throw rangeError(iae, "concat.string.too.big");
+ }
}
return JSType.toNumber(xPrim) + JSType.toNumber(yPrim);
--- a/nashorn/src/jdk/nashorn/internal/runtime/Source.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Source.java Tue Jul 01 17:37:39 2014 +0530
@@ -306,6 +306,7 @@
return array == null;
}
+ @SuppressWarnings("try")
protected void checkPermissionAndClose() throws IOException {
try (InputStream in = url.openStream()) {
// empty
--- a/nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java Tue Jul 01 17:37:39 2014 +0530
@@ -201,7 +201,7 @@
@Override
public Object getObjectValue(final ScriptObject self, final ScriptObject owner) {
- return userAccessorGetter(getAccessors((owner != null) ? owner : (ScriptObject)self), self);
+ return userAccessorGetter(getAccessors((owner != null) ? owner : self), self);
}
@Override
@@ -221,7 +221,7 @@
@Override
public void setValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict) {
- userAccessorSetter(getAccessors((owner != null) ? owner : (ScriptObject)self), strict ? getKey() : null, self, value);
+ userAccessorSetter(getAccessors((owner != null) ? owner : self), strict ? getKey() : null, self, value);
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ByteBufferArrayData.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ByteBufferArrayData.java Tue Jul 01 17:37:39 2014 +0530
@@ -150,7 +150,7 @@
@Override
public Object getObject(final int index) {
- return (int)(0x0ff & buf.get(index));
+ return 0x0ff & buf.get(index);
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/linker/InvokeByName.java Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/runtime/linker/InvokeByName.java Tue Jul 01 17:37:39 2014 +0530
@@ -90,7 +90,7 @@
if(plength == 0) {
finalPtypes = new Class<?>[] { Object.class, targetClass };
} else {
- finalPtypes = new Class[plength + 2];
+ finalPtypes = new Class<?>[plength + 2];
finalPtypes[0] = Object.class;
finalPtypes[1] = targetClass;
System.arraycopy(ptypes, 0, finalPtypes, 2, plength);
--- a/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties Mon Jun 30 17:31:28 2014 +0200
+++ b/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties Tue Jul 01 17:37:39 2014 +0530
@@ -151,6 +151,7 @@
range.error.invalid.radix=radix argument must be in [2, 36]
range.error.invalid.date=Invalid Date
range.error.too.many.errors=Script contains too many errors: {0} errors
+range.error.concat.string.too.big=Concatenated String is too big
reference.error.not.defined="{0}" is not defined
reference.error.cant.be.used.as.lhs="{0}" can not be used as the left-hand side of assignment
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8047359.js Tue Jul 01 17:37:39 2014 +0530
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014, 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-8047359: large string size RangeError should be thrown rather than reporting negative length
+ *
+ * @test
+ * @run
+ */
+
+try {
+ var s = " "; for (var i=0;i<31;++i) s+=s; s.length;
+ throw new Error("should have thrown RangeError!");
+} catch (e) {
+ if (! (e instanceof RangeError)) {
+ fail("RangeError expected, got " + e);
+ }
+}
+
+try {
+ var s = " "; for (var i=0;i<31;++i) s+=s;
+ throw new Error("should have thrown RangeError!");
+} catch (e) {
+ if (! (e instanceof RangeError)) {
+ fail("RangeError expected, got " + e);
+ }
+}