# HG changeset patch # User sundar # Date 1383204017 -19800 # Node ID 351ccd3f56e3ed350b9481d25f6c33b36cb37e13 # Parent 5b10d6333fef2c37360b620da7aec8d0ff791c71# Parent 44238d753963172a45368f571e565a4b709aa9af Merge diff -r 5b10d6333fef -r 351ccd3f56e3 nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java --- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Oct 29 10:40:00 2013 -0300 +++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Oct 31 12:50:17 2013 +0530 @@ -706,6 +706,12 @@ final CallNode.EvalArgs evalArgs = callNode.getEvalArgs(); // load evaluated code load(evalArgs.getCode(), Type.OBJECT); + // load second and subsequent args for side-effect + final List args = callNode.getArgs(); + final int numArgs = args.size(); + for (int i = 1; i < numArgs; i++) { + load(args.get(i)).pop(); + } // special/extra 'eval' arguments load(evalArgs.getThis()); method.load(evalArgs.getLocation()); diff -r 5b10d6333fef -r 351ccd3f56e3 nashorn/src/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java --- a/nashorn/src/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Tue Oct 29 10:40:00 2013 -0300 +++ b/nashorn/src/jdk/nashorn/internal/ir/debug/ObjectSizeCalculator.java Thu Oct 31 12:50:17 2013 +0530 @@ -25,10 +25,10 @@ package jdk.nashorn.internal.ir.debug; -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryPoolMXBean; import java.lang.reflect.Array; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayDeque; import java.util.ArrayList; @@ -51,9 +51,9 @@ * switch, it can not detect * this fact and will report incorrect sizes, as it will presume the default JVM * behavior. - * - * @author Attila Szegedi */ + +@SuppressWarnings("StaticNonFinalUsedInInitialization") public class ObjectSizeCalculator { /** @@ -368,6 +368,29 @@ type.getName()); } + // ALERT: java.lang.management is not available in compact 1. We need + // to use reflection to soft link test memory statistics. + + static Class managementFactory = null; + static Class memoryPoolMXBean = null; + static Class memoryUsage = null; + static Method getMemoryPoolMXBeans = null; + static Method getUsage = null; + static Method getMax = null; + static { + try { + managementFactory = Class.forName("java.lang.management.ManagementFactory"); + memoryPoolMXBean = Class.forName("java.lang.management.MemoryPoolMXBean"); + memoryUsage = Class.forName("java.lang.management.MemoryUsage"); + + getMemoryPoolMXBeans = managementFactory.getMethod("getMemoryPoolMXBeans"); + getUsage = memoryPoolMXBean.getMethod("getUsage"); + getMax = memoryUsage.getMethod("getMax"); + } catch (ClassNotFoundException | NoSuchMethodException | SecurityException ex) { + // Pass thru, asserts when attempting to use. + } + } + /** * Return the current memory usage * @return current memory usage derived from system configuration @@ -409,9 +432,33 @@ strVmVersion.indexOf('.'))); if (vmVersion >= 17) { long maxMemory = 0; - for (MemoryPoolMXBean mp : ManagementFactory.getMemoryPoolMXBeans()) { - maxMemory += mp.getUsage().getMax(); + + /* + See ALERT above. The reflection code below duplicates the following + sequence, and avoids hard coding of java.lang.management. + + for (MemoryPoolMXBean mp : ManagementFactory.getMemoryPoolMXBeans()) { + maxMemory += mp.getUsage().getMax(); + } + */ + + if (getMemoryPoolMXBeans == null) { + throw new AssertionError("java.lang.management not available in compact 1"); } + + try { + final List memoryPoolMXBeans = (List)getMemoryPoolMXBeans.invoke(managementFactory); + for (final Object mp : memoryPoolMXBeans) { + final Object usage = getUsage.invoke(mp); + final Object max = getMax.invoke(usage); + maxMemory += ((Long)max).longValue(); + } + } catch (IllegalAccessException | + IllegalArgumentException | + InvocationTargetException ex) { + throw new AssertionError("java.lang.management not available in compact 1"); + } + if (maxMemory < 30L * 1024 * 1024 * 1024) { // HotSpot 17.0 and above use compressed OOPs below 30GB of RAM total // for all memory pools (yes, including code cache). diff -r 5b10d6333fef -r 351ccd3f56e3 nashorn/src/jdk/nashorn/internal/runtime/ScriptingFunctions.java --- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptingFunctions.java Tue Oct 29 10:40:00 2013 -0300 +++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptingFunctions.java Thu Oct 31 12:50:17 2013 +0530 @@ -190,7 +190,7 @@ char buffer[] = new char[1024]; try (final InputStreamReader inputStream = new InputStreamReader(process.getErrorStream())) { for (int length; (length = inputStream.read(buffer, 0, buffer.length)) != -1; ) { - outBuffer.append(buffer, 0, length); + errBuffer.append(buffer, 0, length); } } catch (IOException ex) { exception[1] = ex; diff -r 5b10d6333fef -r 351ccd3f56e3 nashorn/test/script/basic/JDK-8027562.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8027562.js Thu Oct 31 12:50:17 2013 +0530 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2010, 2013, 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-8027562: eval should load second and subsequent arguments for side effect + * + * @test + * @run + */ + +try { + eval("", x); + fail("should have thrown ReferenceError for 'x'"); +} catch (e) { + if (! (e instanceof ReferenceError)) { + fail("Expected ReferenceError, got " + e); + } + print(e); +} diff -r 5b10d6333fef -r 351ccd3f56e3 nashorn/test/script/basic/JDK-8027562.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8027562.js.EXPECTED Thu Oct 31 12:50:17 2013 +0530 @@ -0,0 +1,1 @@ +ReferenceError: "x" is not defined