diff options
Diffstat (limited to 'src/jdk/nashorn/internal/runtime/StoredScript.java')
-rw-r--r-- | src/jdk/nashorn/internal/runtime/StoredScript.java | 86 |
1 files changed, 56 insertions, 30 deletions
diff --git a/src/jdk/nashorn/internal/runtime/StoredScript.java b/src/jdk/nashorn/internal/runtime/StoredScript.java index 14a0ced0..eea01e79 100644 --- a/src/jdk/nashorn/internal/runtime/StoredScript.java +++ b/src/jdk/nashorn/internal/runtime/StoredScript.java @@ -27,7 +27,7 @@ package jdk.nashorn.internal.runtime; import java.io.Serializable; import java.util.Arrays; -import java.util.LinkedHashMap; +import java.util.HashMap; import java.util.Map; /** @@ -58,7 +58,7 @@ public final class StoredScript implements Serializable { * @param compilationId compilation id * @param mainClassName main class name * @param classBytes map of class names to class bytes - * @param initializers initializer map, id -> FunctionInitializer + * @param initializers initializer map, id -> FunctionInitializer * @param constants constants array */ public StoredScript(final int compilationId, final String mainClassName, final Map<String, byte[]> classBytes, final Map<Integer, FunctionInitializer> initializers, final Object[] constants) { @@ -77,44 +77,70 @@ public final class StoredScript implements Serializable { return compilationId; } - /** - * Returns the main class name. - * @return the main class name - */ - public String getMainClassName() { - return mainClassName; - } + private Map<String, Class<?>> installClasses(final Source source, final CodeInstaller installer) { + final Map<String, Class<?>> installedClasses = new HashMap<>(); + final byte[] mainClassBytes = classBytes.get(mainClassName); + final Class<?> mainClass = installer.install(mainClassName, mainClassBytes); + + installedClasses.put(mainClassName, mainClass); - /** - * Returns a map of class names to class bytes. - * @return map of class bytes - */ - public Map<String, byte[]> getClassBytes() { - final Map<String, byte[]> clonedMap = new LinkedHashMap<>(); for (final Map.Entry<String, byte[]> entry : classBytes.entrySet()) { - clonedMap.put(entry.getKey(), entry.getValue().clone()); + final String className = entry.getKey(); + + if (!className.equals(mainClassName)) { + installedClasses.put(className, installer.install(className, entry.getValue())); + } } - return clonedMap; + + installer.initialize(installedClasses.values(), source, constants); + return installedClasses; } - /** - * Returns the constants array. - * @return constants array - */ - public Object[] getConstants() { - return constants.clone(); + FunctionInitializer installFunction(final RecompilableScriptFunctionData data, final CodeInstaller installer) { + final Map<String, Class<?>> installedClasses = installClasses(data.getSource(), installer); + + assert initializers != null; + assert initializers.size() == 1; + final FunctionInitializer initializer = initializers.values().iterator().next(); + + for (int i = 0; i < constants.length; i++) { + if (constants[i] instanceof RecompilableScriptFunctionData) { + // replace deserialized function data with the ones we already have + final RecompilableScriptFunctionData newData = data.getScriptFunctionData(((RecompilableScriptFunctionData) constants[i]).getFunctionNodeId()); + assert newData != null; + newData.initTransients(data.getSource(), installer); + constants[i] = newData; + } + } + + initializer.setCode(installedClasses.get(initializer.getClassName())); + return initializer; } /** - * Returns the function initializers map. - * @return The initializers map. + * Install as script. + * + * @param source the source + * @param installer the installer + * @return main script class */ - public Map<Integer, FunctionInitializer> getInitializers() { - final Map<Integer, FunctionInitializer> clonedMap = new LinkedHashMap<>(); - for (final Map.Entry<Integer, FunctionInitializer> entry : initializers.entrySet()) { - clonedMap.put(entry.getKey(), new FunctionInitializer(entry.getValue())); + Class<?> installScript(final Source source, final CodeInstaller installer) { + + final Map<String, Class<?>> installedClasses = installClasses(source, installer); + + for (final Object constant : constants) { + if (constant instanceof RecompilableScriptFunctionData) { + final RecompilableScriptFunctionData data = (RecompilableScriptFunctionData) constant; + data.initTransients(source, installer); + final FunctionInitializer initializer = initializers.get(data.getFunctionNodeId()); + if (initializer != null) { + initializer.setCode(installedClasses.get(initializer.getClassName())); + data.initializeCode(initializer); + } + } } - return clonedMap; + + return installedClasses.get(mainClassName); } @Override |