# HG changeset patch # User lana # Date 1465499232 0 # Node ID 35214991a26451d2bbac3e73732ede534464a373 # Parent db87ac7c7464abb6fb91913f8991ccfb05a88cae# Parent b4b3d017b651a46faf48cba02ac2b00c6998fcc8 Merge diff -r db87ac7c7464 -r 35214991a264 nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java --- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java Thu Jun 09 17:28:39 2016 +0000 +++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Console.java Thu Jun 09 19:07:12 2016 +0000 @@ -59,7 +59,8 @@ in.setHandleUserInterrupt(true); in.setBellEnabled(true); in.setCopyPasteDetection(true); - in.setHistory(new EditingHistory(in, Files.readAllLines(historyFile.toPath())) { + final Iterable existingHistory = historyFile.exists() ? Files.readAllLines(historyFile.toPath()) : null; + in.setHistory(new EditingHistory(in, existingHistory) { @Override protected boolean isComplete(CharSequence input) { return completer.isComplete(input.toString()); } diff -r db87ac7c7464 -r 35214991a264 nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java --- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java Thu Jun 09 17:28:39 2016 +0000 +++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/Main.java Thu Jun 09 19:07:12 2016 +0000 @@ -117,7 +117,7 @@ final PrintWriter err = context.getErr(); final Global oldGlobal = Context.getGlobal(); final boolean globalChanged = (oldGlobal != global); - final PropertiesHelper propsHelper = new PropertiesHelper(env._classpath); + final PropertiesHelper propsHelper = new PropertiesHelper(context); final NashornCompleter completer = new NashornCompleter(context, global, this, propsHelper); try (final Console in = new Console(System.in, System.out, HIST_FILE, completer, diff -r db87ac7c7464 -r 35214991a264 nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PackagesHelper.java --- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PackagesHelper.java Thu Jun 09 17:28:39 2016 +0000 +++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PackagesHelper.java Thu Jun 09 19:07:12 2016 +0000 @@ -25,6 +25,7 @@ package jdk.nashorn.tools.jjs; +import java.lang.reflect.Modifier; import java.io.IOException; import java.io.File; import java.net.URI; @@ -49,6 +50,7 @@ import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; import javax.tools.ToolProvider; +import jdk.nashorn.internal.runtime.Context; /** * A helper class to compute properties of a Java package object. Properties of @@ -72,6 +74,7 @@ return compiler != null; } + private final Context context; private final StandardJavaFileManager fm; private final Set fileKinds; private final FileSystem jrtfs; @@ -79,9 +82,11 @@ /** * Construct a new PackagesHelper. * - * @param classPath Class path to compute properties of java package objects + * @param context the current Nashorn Context */ - PackagesHelper(final String classPath) throws IOException { + PackagesHelper(final Context context) throws IOException { + this.context = context; + final String classPath = context.getEnv()._classpath; if (isJavacAvailable()) { fm = compiler.getStandardFileManager(null, null, null); fileKinds = EnumSet.of(JavaFileObject.Kind.CLASS); @@ -166,8 +171,11 @@ String str = p.getFileName().toString(); // get rid of ".class", if any if (str.endsWith(".class")) { - props.add(str.substring(0, str.length() - ".class".length())); - } else { + final String clsName = str.substring(0, str.length() - ".class".length()); + if (clsName.indexOf('$') == -1 && isClassAccessible(pkg + "." + clsName)) { + props.add(str); + } + } else if (isPackageAccessible(pkg + "." + str)) { props.add(str); } } @@ -193,7 +201,10 @@ if (nextDot != -1) { // subpackage - eg. "regex" for "java.util" - props.add(binaryName.substring(start, nextDot)); + final String pkgName = binaryName.substring(start, nextDot); + if (isPackageAccessible(binaryName.substring(0, nextDot))) { + props.add(binaryName.substring(start, nextDot)); + } } else { // class - filter out nested, inner, anonymous, local classes. // Dynalink supported public nested classes as properties of @@ -201,7 +212,7 @@ // "$" internal names as properties of package object. final String clsName = binaryName.substring(start); - if (clsName.indexOf('$') == -1) { + if (clsName.indexOf('$') == -1 && isClassAccessible(binaryName)) { props.add(clsName); } } @@ -214,4 +225,22 @@ .map(File::new) .collect(Collectors.toList()); } + + private boolean isClassAccessible(final String className) { + try { + final Class clz = context.findClass(className); + return Modifier.isPublic(clz.getModifiers()); + } catch (final ClassNotFoundException cnfe) { + } + return false; + } + + private boolean isPackageAccessible(final String pkgName) { + try { + Context.checkPackageAccess(pkgName); + return true; + } catch (final SecurityException se) { + return false; + } + } } diff -r db87ac7c7464 -r 35214991a264 nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PropertiesHelper.java --- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PropertiesHelper.java Thu Jun 09 17:28:39 2016 +0000 +++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/PropertiesHelper.java Thu Jun 09 19:07:12 2016 +0000 @@ -33,6 +33,7 @@ import java.util.WeakHashMap; import java.util.regex.Pattern; import java.util.stream.Collectors; +import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.NativeJavaPackage; import jdk.nashorn.internal.runtime.PropertyMap; @@ -52,11 +53,11 @@ /** * Construct a new PropertiesHelper. * - * @param classPath Class path to compute properties of java package objects + * @param context the current nashorn Context */ - PropertiesHelper(final String classPath) { + PropertiesHelper(final Context context) { try { - this.pkgsHelper = new PackagesHelper(classPath); + this.pkgsHelper = new PackagesHelper(context); } catch (final IOException exp) { if (Main.DEBUG) { exp.printStackTrace(); diff -r db87ac7c7464 -r 35214991a264 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java Thu Jun 09 17:28:39 2016 +0000 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java Thu Jun 09 19:07:12 2016 +0000 @@ -286,7 +286,7 @@ superClassName = Type.getInternalName(superClass); generatedClassName = getGeneratedClassName(superClass, interfaces); - cw.visit(Opcodes.V1_7, ACC_PUBLIC | ACC_SUPER, generatedClassName, null, superClassName, getInternalTypeNames(interfaces)); + cw.visit(Opcodes.V1_8, ACC_PUBLIC | ACC_SUPER, generatedClassName, null, superClassName, getInternalTypeNames(interfaces)); generateField(GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR); generateField(DELEGATE_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR); @@ -1031,7 +1031,9 @@ if (!constructor && Modifier.isInterface(owner.getModifiers())) { // we should call default method on the immediate "super" type - not on (possibly) // the indirectly inherited interface class! - mv.invokespecial(Type.getInternalName(findInvokespecialOwnerFor(owner)), name, methodDesc, false); + final Class superType = findInvokespecialOwnerFor(owner); + mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(superType), name, methodDesc, + Modifier.isInterface(superType.getModifiers())); } else { mv.invokespecial(superClassName, name, methodDesc, false); }