aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorasaha <none@none>2014-04-10 15:28:48 -0700
committerasaha <none@none>2014-04-10 15:28:48 -0700
commit671d0f4c19637358d3bb3353ed889614804aad07 (patch)
tree10f41e21b3d3c9c0aef32046058e7c734f7f8ddc /src
parent137ee30375d609cb6ee7e09404c0cc02ccd0b4ec (diff)
parent3bfe542822f677fdeec20c2e45836e975242d6f7 (diff)
downloadnashorn-671d0f4c19637358d3bb3353ed889614804aad07.tar.gz
Diffstat (limited to 'src')
-rw-r--r--src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java11
-rw-r--r--src/jdk/internal/dynalink/beans/FacetIntrospector.java8
-rw-r--r--src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java35
-rw-r--r--src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java7
-rw-r--r--src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java2
-rw-r--r--src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java20
-rw-r--r--src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java22
7 files changed, 72 insertions, 33 deletions
diff --git a/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java b/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java
index c82e334a..72beadfe 100644
--- a/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java
+++ b/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java
@@ -211,7 +211,8 @@ class AccessibleMembersLookup {
if(!CheckRestrictedPackage.isRestrictedClass(clazz)) {
searchSuperTypes = false;
for(Method method: clazz.getMethods()) {
- if(instance != Modifier.isStatic(method.getModifiers())) {
+ final boolean isStatic = Modifier.isStatic(method.getModifiers());
+ if(instance != isStatic) {
final MethodSignature sig = new MethodSignature(method);
if(!methods.containsKey(sig)) {
final Class<?> declaringClass = method.getDeclaringClass();
@@ -228,7 +229,10 @@ class AccessibleMembersLookup {
//generate the said synthetic delegators.
searchSuperTypes = true;
} else {
- methods.put(sig, method);
+ // don't allow inherited static
+ if (!isStatic || clazz == declaringClass) {
+ methods.put(sig, method);
+ }
}
}
}
@@ -245,7 +249,8 @@ class AccessibleMembersLookup {
searchSuperTypes = true;
}
- if(searchSuperTypes) {
+ // don't need to search super types for static methods
+ if(instance && searchSuperTypes) {
// If we reach here, the class is either not public, or it is in a restricted package. Alternatively, it is
// public, but some of its methods claim that their declaring class is non-public. We'll try superclasses
// and implemented interfaces then looking for public ones.
diff --git a/src/jdk/internal/dynalink/beans/FacetIntrospector.java b/src/jdk/internal/dynalink/beans/FacetIntrospector.java
index f8f1db8f..4ac5deaa 100644
--- a/src/jdk/internal/dynalink/beans/FacetIntrospector.java
+++ b/src/jdk/internal/dynalink/beans/FacetIntrospector.java
@@ -136,7 +136,13 @@ abstract class FacetIntrospector {
final Field[] fields = clazz.getFields();
final Collection<Field> cfields = new ArrayList<>(fields.length);
for(Field field: fields) {
- if(instance != Modifier.isStatic(field.getModifiers()) && isAccessible(field)) {
+ final boolean isStatic = Modifier.isStatic(field.getModifiers());
+ if(isStatic && clazz != field.getDeclaringClass()) {
+ // ignore inherited static fields
+ continue;
+ }
+
+ if(instance != isStatic && isAccessible(field)) {
cfields.add(field);
}
}
diff --git a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
index 36882e20..286c09bf 100644
--- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
+++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
@@ -64,7 +64,6 @@ import jdk.internal.org.objectweb.asm.Label;
import jdk.internal.org.objectweb.asm.Opcodes;
import jdk.internal.org.objectweb.asm.Type;
import jdk.internal.org.objectweb.asm.commons.InstructionAdapter;
-import jdk.nashorn.internal.objects.Global;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
@@ -132,23 +131,17 @@ import sun.reflect.CallerSensitive;
* implemented securely.
*/
final class JavaAdapterBytecodeGenerator {
- static final Type CONTEXT_TYPE = Type.getType(Context.class);
static final Type OBJECT_TYPE = Type.getType(Object.class);
- static final Type SCRIPT_OBJECT_TYPE = Type.getType(ScriptObject.class);
- static final Type GLOBAL_TYPE = Type.getType(Global.class);
- static final String CONTEXT_TYPE_NAME = CONTEXT_TYPE.getInternalName();
static final String OBJECT_TYPE_NAME = OBJECT_TYPE.getInternalName();
static final String INIT = "<init>";
static final String GLOBAL_FIELD_NAME = "global";
- static final String SCRIPT_OBJECT_TYPE_DESCRIPTOR = SCRIPT_OBJECT_TYPE.getDescriptor();
- static final String GLOBAL_TYPE_DESCRIPTOR = GLOBAL_TYPE.getDescriptor();
+ static final String GLOBAL_TYPE_DESCRIPTOR = OBJECT_TYPE.getDescriptor();
-
- static final String SET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE, GLOBAL_TYPE);
+ static final String SET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE, OBJECT_TYPE);
static final String VOID_NOARG_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE);
private static final Type SCRIPT_FUNCTION_TYPE = Type.getType(ScriptFunction.class);
@@ -159,7 +152,7 @@ final class JavaAdapterBytecodeGenerator {
OBJECT_TYPE, STRING_TYPE, METHOD_TYPE_TYPE);
private static final String GET_HANDLE_FUNCTION_DESCRIPTOR = Type.getMethodDescriptor(METHOD_HANDLE_TYPE,
SCRIPT_FUNCTION_TYPE, METHOD_TYPE_TYPE);
- private static final String GET_CLASS_INITIALIZER_DESCRIPTOR = Type.getMethodDescriptor(SCRIPT_OBJECT_TYPE);
+ private static final String GET_CLASS_INITIALIZER_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE);
private static final Type RUNTIME_EXCEPTION_TYPE = Type.getType(RuntimeException.class);
private static final Type THROWABLE_TYPE = Type.getType(Throwable.class);
private static final Type UNSUPPORTED_OPERATION_TYPE = Type.getType(UnsupportedOperationException.class);
@@ -171,7 +164,7 @@ final class JavaAdapterBytecodeGenerator {
private static final String UNSUPPORTED_OPERATION_TYPE_NAME = UNSUPPORTED_OPERATION_TYPE.getInternalName();
private static final String METHOD_HANDLE_TYPE_DESCRIPTOR = METHOD_HANDLE_TYPE.getDescriptor();
- private static final String GET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(GLOBAL_TYPE);
+ private static final String GET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE);
private static final String GET_CLASS_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.getType(Class.class));
// Package used when the adapter can't be defined in the adaptee's package (either because it's sealed, or because
@@ -528,11 +521,11 @@ final class JavaAdapterBytecodeGenerator {
}
private static void invokeGetGlobal(final InstructionAdapter mv) {
- mv.invokestatic(CONTEXT_TYPE_NAME, "getGlobal", GET_GLOBAL_METHOD_DESCRIPTOR, false);
+ mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getGlobal", GET_GLOBAL_METHOD_DESCRIPTOR, false);
}
private static void invokeSetGlobal(final InstructionAdapter mv) {
- mv.invokestatic(CONTEXT_TYPE_NAME, "setGlobal", SET_GLOBAL_METHOD_DESCRIPTOR, false);
+ mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "setGlobal", SET_GLOBAL_METHOD_DESCRIPTOR, false);
}
/**
@@ -649,7 +642,7 @@ final class JavaAdapterBytecodeGenerator {
mv.athrow();
} else {
// If the super method is not abstract, delegate to it.
- emitSuperCall(mv, method.getDeclaringClass(), name, methodDesc);
+ emitSuperCall(mv, name, methodDesc);
}
mv.visitLabel(handleDefined);
@@ -678,7 +671,7 @@ final class JavaAdapterBytecodeGenerator {
// stack: [creatingGlobal, creatingGlobal, handle]
// Emit code for switching to the creating global
- // Global currentGlobal = Context.getGlobal();
+ // ScriptObject currentGlobal = Context.getGlobal();
invokeGetGlobal(mv);
mv.dup();
@@ -821,12 +814,12 @@ final class JavaAdapterBytecodeGenerator {
SUPER_PREFIX + name, methodDesc, null, getExceptionNames(method.getExceptionTypes())));
mv.visitCode();
- emitSuperCall(mv, method.getDeclaringClass(), name, methodDesc);
+ emitSuperCall(mv, name, methodDesc);
endMethod(mv);
}
- private void emitSuperCall(final InstructionAdapter mv, final Class owner, final String name, final String methodDesc) {
+ private void emitSuperCall(final InstructionAdapter mv, final String name, final String methodDesc) {
mv.visitVarInsn(ALOAD, 0);
int nextParam = 1;
final Type methodType = Type.getMethodType(methodDesc);
@@ -834,13 +827,7 @@ final class JavaAdapterBytecodeGenerator {
mv.load(nextParam, t);
nextParam += t.getSize();
}
-
- // default method - non-abstract, interface method
- if (Modifier.isInterface(owner.getModifiers())) {
- mv.invokespecial(Type.getInternalName(owner), name, methodDesc, false);
- } else {
- mv.invokespecial(superClassName, name, methodDesc, false);
- }
+ mv.invokespecial(superClassName, name, methodDesc, false);
mv.areturn(methodType.getReturnType());
}
diff --git a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java
index fa162d88..879d908c 100644
--- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java
+++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java
@@ -31,6 +31,8 @@ import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.security.SecureClassLoader;
import jdk.internal.dynalink.beans.StaticClass;
+import jdk.nashorn.internal.runtime.Context;
+import jdk.nashorn.internal.runtime.ScriptFunction;
/**
* This class encapsulates the bytecode of the adapter class and can be used to load it into the JVM as an actual Class.
@@ -85,13 +87,14 @@ final class JavaAdapterClassLoader {
@Override
public Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
try {
+ Context.checkPackageAccess(name);
return super.loadClass(name, resolve);
} catch (final SecurityException se) {
// we may be implementing an interface or extending a class that was
// loaded by a loader that prevents package.access. If so, it'd throw
// SecurityException for nashorn's classes!. For adapter's to work, we
- // should be able to refer to nashorn classes.
- if (name.startsWith("jdk.nashorn.internal.")) {
+ // should be able to refer to the few classes it needs in its implementation.
+ if(ScriptFunction.class.getName().equals(name) || JavaAdapterServices.class.getName().equals(name)) {
return myLoader.loadClass(name);
}
throw se;
diff --git a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
index 475ab08c..1b5345b0 100644
--- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
+++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
@@ -247,7 +247,7 @@ public final class JavaAdapterFactory {
}
private static class AdapterInfo {
- private static final ClassAndLoader SCRIPT_OBJECT_LOADER = new ClassAndLoader(ScriptObject.class, true);
+ private static final ClassAndLoader SCRIPT_OBJECT_LOADER = new ClassAndLoader(ScriptFunction.class, true);
private final ClassLoader commonLoader;
// TODO: soft reference the JavaAdapterClassLoader objects. They can be recreated when needed.
diff --git a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java
index 1188c6b6..4cb8cfa7 100644
--- a/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java
+++ b/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java
@@ -116,8 +116,8 @@ public final class JavaAdapterServices {
* static initializers.
* @return the thread-local JS object used to define methods for the class being initialized.
*/
- public static ScriptObject getClassOverrides() {
- final ScriptObject overrides = classOverrides.get();
+ public static Object getClassOverrides() {
+ final Object overrides = classOverrides.get();
assert overrides != null;
return overrides;
}
@@ -134,6 +134,22 @@ public final class JavaAdapterServices {
NO_PERMISSIONS_INVOKER.invokeExact(method, arg);
}
+ /**
+ * Set the current global scope
+ * @param global the global scope
+ */
+ public static void setGlobal(final Object global) {
+ Context.setGlobal((ScriptObject)global);
+ }
+
+ /**
+ * Get the current global scope
+ * @return the current global scope
+ */
+ public static Object getGlobal() {
+ return Context.getGlobal();
+ }
+
static void setClassOverrides(ScriptObject overrides) {
classOverrides.set(overrides);
}
diff --git a/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java b/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java
index 8fc76c19..66720c23 100644
--- a/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java
+++ b/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java
@@ -39,16 +39,38 @@ import jdk.nashorn.internal.runtime.Context;
* Check java reflection permission for java reflective and java.lang.invoke access from scripts
*/
final class ReflectionCheckLinker implements TypeBasedGuardingDynamicLinker{
+ private static final Class<?> STATEMENT_CLASS = getBeanClass("Statement");
+ private static final Class<?> XMLENCODER_CLASS = getBeanClass("XMLEncoder");
+ private static final Class<?> XMLDECODER_CLASS = getBeanClass("XMLDecoder");
+
+ private static Class<?> getBeanClass(final String name) {
+ try {
+ return Class.forName("java.beans." + name);
+ } catch (final ClassNotFoundException cnfe) {
+ // Possible to miss this class in other profiles.
+ return null;
+ }
+ }
+
@Override
public boolean canLinkType(final Class<?> type) {
return isReflectionClass(type);
}
private static boolean isReflectionClass(final Class<?> type) {
+ // Class or ClassLoader subclasses
if (type == Class.class || ClassLoader.class.isAssignableFrom(type)) {
return true;
}
+ // check for bean reflection
+ if ((STATEMENT_CLASS != null && STATEMENT_CLASS.isAssignableFrom(type)) ||
+ (XMLENCODER_CLASS != null && XMLENCODER_CLASS.isAssignableFrom(type)) ||
+ (XMLDECODER_CLASS != null && XMLDECODER_CLASS.isAssignableFrom(type))) {
+ return true;
+ }
+
+ // package name check
final String name = type.getName();
return name.startsWith("java.lang.reflect.") || name.startsWith("java.lang.invoke.");
}