Merge
authorsundar
Thu, 31 Oct 2013 12:50:17 +0530
changeset 21463 351ccd3f56e3
parent 21459 5b10d6333fef (current diff)
parent 21462 44238d753963 (diff)
child 21464 5f83d7dc1b34
child 21687 c30b84d16c23
Merge
--- 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<Expression> 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());
--- 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).
--- 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;
--- /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);
+}
--- /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