ScriptLoader.java revision 1643:133ea8746b37
1/* 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package jdk.nashorn.internal.runtime; 27 28import java.lang.reflect.Module; 29import java.security.CodeSource; 30import java.util.Objects; 31 32/** 33 * Responsible for loading script generated classes. 34 * 35 */ 36final class ScriptLoader extends NashornLoader { 37 private static final String NASHORN_PKG_PREFIX = "jdk.nashorn.internal."; 38 39 private volatile boolean structureAccessAdded; 40 private final Module scriptModule; 41 private final Context context; 42 43 /*package-private*/ Context getContext() { 44 return context; 45 } 46 47 /** 48 * Constructor. 49 */ 50 ScriptLoader(final ClassLoader parent, final Context context) { 51 super(parent); 52 this.context = context; 53 54 // new scripts module, it's specific exports and read-edges 55 scriptModule = defineModule("jdk.scripting.nashorn.scripts", this); 56 addModuleExports(scriptModule, SCRIPTS_PKG, nashornModule); 57 addReadsModule(scriptModule, nashornModule); 58 addReadsModule(scriptModule, Object.class.getModule()); 59 60 // specific exports from nashorn to new scripts module 61 nashornModule.addExports(OBJECTS_PKG, scriptModule); 62 nashornModule.addExports(RUNTIME_PKG, scriptModule); 63 nashornModule.addExports(RUNTIME_ARRAYS_PKG, scriptModule); 64 nashornModule.addExports(RUNTIME_LINKER_PKG, scriptModule); 65 nashornModule.addExports(SCRIPTS_PKG, scriptModule); 66 67 // nashorn needs to read scripts module methods,fields 68 nashornModule.addReads(scriptModule); 69 } 70 71 @Override 72 protected Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException { 73 checkPackageAccess(name); 74 if (name.startsWith(NASHORN_PKG_PREFIX)) { 75 final StructureLoader sharedCl = context.getSharedLoader(); 76 final Class<?> cl = sharedCl.loadClass(name); 77 if (! structureAccessAdded) { 78 if (cl.getClassLoader() == sharedCl) { 79 structureAccessAdded = true; 80 final Module structModule = sharedCl.getModule(); 81 addModuleExports(structModule, SCRIPTS_PKG, scriptModule); 82 addReadsModule(scriptModule, structModule); 83 } 84 } 85 return cl; 86 } 87 return super.loadClass(name, resolve); 88 } 89 90 // package-private and private stuff below this point 91 92 /** 93 * Install a class for use by the Nashorn runtime 94 * 95 * @param name Binary name of class. 96 * @param data Class data bytes. 97 * @param cs CodeSource code source of the class bytes. 98 * 99 * @return Installed class. 100 */ 101 synchronized Class<?> installClass(final String name, final byte[] data, final CodeSource cs) { 102 return defineClass(name, data, 0, data.length, Objects.requireNonNull(cs)); 103 } 104} 105