--- old/make/build.xml 2014-12-04 19:42:57.736283942 +0530 +++ new/make/build.xml 2014-12-04 19:42:57.632283423 +0530 @@ -36,9 +36,9 @@ - + - + --- old/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/AstDeserializer.java 2014-12-04 19:42:58.384287155 +0530 +++ new/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/AstDeserializer.java 2014-12-04 19:42:58.160286048 +0530 @@ -27,6 +27,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.zip.InflaterInputStream; import jdk.nashorn.internal.ir.FunctionNode; @@ -36,12 +38,18 @@ */ final class AstDeserializer { static FunctionNode deserialize(final byte[] serializedAst) { - try { - return (FunctionNode)new ObjectInputStream(new InflaterInputStream(new ByteArrayInputStream( - serializedAst))).readObject(); - } catch (final ClassNotFoundException | IOException e) { - // This is internal, can't happen - throw new AssertionError("Unexpected exception deserializing function", e); - } + // FIXME: do we need this doPrivileged block at all? + return AccessController.doPrivileged(new PrivilegedAction() { + @Override + public FunctionNode run() { + try { + return (FunctionNode)new ObjectInputStream(new InflaterInputStream( + new ByteArrayInputStream(serializedAst))).readObject(); + } catch (final ClassNotFoundException | IOException e) { + // This is internal, can't happen + throw new AssertionError("Unexpected exception deserializing function", e); + } + } + }); } } --- old/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java 2014-12-04 19:42:58.864289537 +0530 +++ new/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java 2014-12-04 19:42:58.740288928 +0530 @@ -45,7 +45,15 @@ * A Dynalink linker to handle web browser built-in JS (DOM etc.) objects. */ final class BrowserJSObjectLinker implements TypeBasedGuardingDynamicLinker { - private static final ClassLoader myLoader = BrowserJSObjectLinker.class.getClassLoader(); + private static ClassLoader extLoader; + static { + extLoader = BrowserJSObjectLinker.class.getClassLoader(); + // in case nashorn is loaded as bootstrap! + if (extLoader == null) { + extLoader = ClassLoader.getSystemClassLoader().getParent(); + } + } + private static final String JSOBJECT_CLASS = "netscape.javascript.JSObject"; // not final because this is lazily initialized // when we hit a subclass for the first time. @@ -69,7 +77,7 @@ // check if this class is a subclass of JSObject Class clazz = type; while (clazz != null) { - if (clazz.getClassLoader() == myLoader && + if (clazz.getClassLoader() == extLoader && clazz.getName().equals(JSOBJECT_CLASS)) { jsObjectClass = clazz; return true; --- old/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java 2014-12-04 19:42:59.300291701 +0530 +++ new/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java 2014-12-04 19:42:59.204291218 +0530 @@ -104,7 +104,7 @@ // SecurityException for nashorn's classes!. For adapter's to work, we // should be able to refer to the few classes it needs in its implementation. if(VISIBLE_INTERNAL_CLASS_NAMES.contains(name)) { - return myLoader.loadClass(name); + return myLoader != null? myLoader.loadClass(name) : Class.forName(name, false, myLoader); } throw se; } --- old/test/script/basic/JDK-8066232.js 2014-12-04 19:42:59.736293860 +0530 +++ new/test/script/basic/JDK-8066232.js 2014-12-04 19:42:59.600293184 +0530 @@ -34,3 +34,5 @@ } catch(e if 1) { } })() + +print("SUCCESS");