Merge
This commit is contained in:
commit
607cd7698d
@ -59,7 +59,8 @@ class Console implements AutoCloseable {
|
|||||||
in.setHandleUserInterrupt(true);
|
in.setHandleUserInterrupt(true);
|
||||||
in.setBellEnabled(true);
|
in.setBellEnabled(true);
|
||||||
in.setCopyPasteDetection(true);
|
in.setCopyPasteDetection(true);
|
||||||
in.setHistory(new EditingHistory(in, Files.readAllLines(historyFile.toPath())) {
|
final Iterable<String> existingHistory = historyFile.exists() ? Files.readAllLines(historyFile.toPath()) : null;
|
||||||
|
in.setHistory(new EditingHistory(in, existingHistory) {
|
||||||
@Override protected boolean isComplete(CharSequence input) {
|
@Override protected boolean isComplete(CharSequence input) {
|
||||||
return completer.isComplete(input.toString());
|
return completer.isComplete(input.toString());
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ public final class Main extends Shell {
|
|||||||
final PrintWriter err = context.getErr();
|
final PrintWriter err = context.getErr();
|
||||||
final Global oldGlobal = Context.getGlobal();
|
final Global oldGlobal = Context.getGlobal();
|
||||||
final boolean globalChanged = (oldGlobal != global);
|
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);
|
final NashornCompleter completer = new NashornCompleter(context, global, this, propsHelper);
|
||||||
|
|
||||||
try (final Console in = new Console(System.in, System.out, HIST_FILE, completer,
|
try (final Console in = new Console(System.in, System.out, HIST_FILE, completer,
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
package jdk.nashorn.tools.jjs;
|
package jdk.nashorn.tools.jjs;
|
||||||
|
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
@ -49,6 +50,7 @@ import javax.tools.JavaFileObject;
|
|||||||
import javax.tools.StandardJavaFileManager;
|
import javax.tools.StandardJavaFileManager;
|
||||||
import javax.tools.StandardLocation;
|
import javax.tools.StandardLocation;
|
||||||
import javax.tools.ToolProvider;
|
import javax.tools.ToolProvider;
|
||||||
|
import jdk.nashorn.internal.runtime.Context;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A helper class to compute properties of a Java package object. Properties of
|
* A helper class to compute properties of a Java package object. Properties of
|
||||||
@ -72,6 +74,7 @@ final class PackagesHelper {
|
|||||||
return compiler != null;
|
return compiler != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
private final StandardJavaFileManager fm;
|
private final StandardJavaFileManager fm;
|
||||||
private final Set<JavaFileObject.Kind> fileKinds;
|
private final Set<JavaFileObject.Kind> fileKinds;
|
||||||
private final FileSystem jrtfs;
|
private final FileSystem jrtfs;
|
||||||
@ -79,9 +82,11 @@ final class PackagesHelper {
|
|||||||
/**
|
/**
|
||||||
* Construct a new PackagesHelper.
|
* 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()) {
|
if (isJavacAvailable()) {
|
||||||
fm = compiler.getStandardFileManager(null, null, null);
|
fm = compiler.getStandardFileManager(null, null, null);
|
||||||
fileKinds = EnumSet.of(JavaFileObject.Kind.CLASS);
|
fileKinds = EnumSet.of(JavaFileObject.Kind.CLASS);
|
||||||
@ -166,8 +171,11 @@ final class PackagesHelper {
|
|||||||
String str = p.getFileName().toString();
|
String str = p.getFileName().toString();
|
||||||
// get rid of ".class", if any
|
// get rid of ".class", if any
|
||||||
if (str.endsWith(".class")) {
|
if (str.endsWith(".class")) {
|
||||||
props.add(str.substring(0, str.length() - ".class".length()));
|
final String clsName = str.substring(0, str.length() - ".class".length());
|
||||||
} else {
|
if (clsName.indexOf('$') == -1 && isClassAccessible(pkg + "." + clsName)) {
|
||||||
|
props.add(str);
|
||||||
|
}
|
||||||
|
} else if (isPackageAccessible(pkg + "." + str)) {
|
||||||
props.add(str);
|
props.add(str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,7 +201,10 @@ final class PackagesHelper {
|
|||||||
|
|
||||||
if (nextDot != -1) {
|
if (nextDot != -1) {
|
||||||
// subpackage - eg. "regex" for "java.util"
|
// 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 {
|
} else {
|
||||||
// class - filter out nested, inner, anonymous, local classes.
|
// class - filter out nested, inner, anonymous, local classes.
|
||||||
// Dynalink supported public nested classes as properties of
|
// Dynalink supported public nested classes as properties of
|
||||||
@ -201,7 +212,7 @@ final class PackagesHelper {
|
|||||||
// "$" internal names as properties of package object.
|
// "$" internal names as properties of package object.
|
||||||
|
|
||||||
final String clsName = binaryName.substring(start);
|
final String clsName = binaryName.substring(start);
|
||||||
if (clsName.indexOf('$') == -1) {
|
if (clsName.indexOf('$') == -1 && isClassAccessible(binaryName)) {
|
||||||
props.add(clsName);
|
props.add(clsName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -214,4 +225,22 @@ final class PackagesHelper {
|
|||||||
.map(File::new)
|
.map(File::new)
|
||||||
.collect(Collectors.toList());
|
.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ import java.util.List;
|
|||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import jdk.nashorn.internal.runtime.Context;
|
||||||
import jdk.nashorn.internal.runtime.JSType;
|
import jdk.nashorn.internal.runtime.JSType;
|
||||||
import jdk.nashorn.internal.runtime.NativeJavaPackage;
|
import jdk.nashorn.internal.runtime.NativeJavaPackage;
|
||||||
import jdk.nashorn.internal.runtime.PropertyMap;
|
import jdk.nashorn.internal.runtime.PropertyMap;
|
||||||
@ -52,11 +53,11 @@ final class PropertiesHelper {
|
|||||||
/**
|
/**
|
||||||
* Construct a new PropertiesHelper.
|
* 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 {
|
try {
|
||||||
this.pkgsHelper = new PackagesHelper(classPath);
|
this.pkgsHelper = new PackagesHelper(context);
|
||||||
} catch (final IOException exp) {
|
} catch (final IOException exp) {
|
||||||
if (Main.DEBUG) {
|
if (Main.DEBUG) {
|
||||||
exp.printStackTrace();
|
exp.printStackTrace();
|
||||||
|
@ -286,7 +286,7 @@ final class JavaAdapterBytecodeGenerator {
|
|||||||
superClassName = Type.getInternalName(superClass);
|
superClassName = Type.getInternalName(superClass);
|
||||||
generatedClassName = getGeneratedClassName(superClass, interfaces);
|
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(GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
|
||||||
generateField(DELEGATE_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
|
generateField(DELEGATE_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
|
||||||
|
|
||||||
@ -1031,7 +1031,9 @@ final class JavaAdapterBytecodeGenerator {
|
|||||||
if (!constructor && Modifier.isInterface(owner.getModifiers())) {
|
if (!constructor && Modifier.isInterface(owner.getModifiers())) {
|
||||||
// we should call default method on the immediate "super" type - not on (possibly)
|
// we should call default method on the immediate "super" type - not on (possibly)
|
||||||
// the indirectly inherited interface class!
|
// 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 {
|
} else {
|
||||||
mv.invokespecial(superClassName, name, methodDesc, false);
|
mv.invokespecial(superClassName, name, methodDesc, false);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user