提交 109ea97b 编写于 作者: A attila

8014953: Have NativeJavaPackage throw a ClassNotFoundException when invoked

Reviewed-by: jlaskey, sundar
上级 33c73961
......@@ -25,10 +25,16 @@
package jdk.nashorn.internal.runtime;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import jdk.internal.dynalink.CallSiteDescriptor;
import jdk.internal.dynalink.beans.StaticClass;
import jdk.internal.dynalink.linker.GuardedInvocation;
import jdk.internal.dynalink.linker.LinkRequest;
import jdk.internal.dynalink.support.Guards;
import jdk.nashorn.internal.lookup.MethodHandleFactory;
import jdk.nashorn.internal.lookup.MethodHandleFunctionality;
import jdk.nashorn.internal.objects.NativeJava;
import jdk.nashorn.internal.objects.annotations.Attribute;
import jdk.nashorn.internal.objects.annotations.Function;
......@@ -65,6 +71,10 @@ import jdk.nashorn.internal.objects.annotations.Function;
* </pre>
*/
public final class NativeJavaPackage extends ScriptObject {
private static final MethodHandleFunctionality MH = MethodHandleFactory.getFunctionality();
private static final MethodHandle CLASS_NOT_FOUND = findOwnMH("classNotFound", Void.TYPE, NativeJavaPackage.class);
private static final MethodHandle TYPE_GUARD = Guards.getClassGuard(NativeJavaPackage.class);
/** Full name of package (includes path.) */
private final String name;
......@@ -123,6 +133,30 @@ public final class NativeJavaPackage extends ScriptObject {
return super.getDefaultValue(hint);
}
@Override
protected GuardedInvocation findNewMethod(CallSiteDescriptor desc) {
return createClassNotFoundInvocation(desc);
}
@Override
protected GuardedInvocation findCallMethod(CallSiteDescriptor desc, LinkRequest request) {
return createClassNotFoundInvocation(desc);
}
private static GuardedInvocation createClassNotFoundInvocation(final CallSiteDescriptor desc) {
// If NativeJavaPackage is invoked either as a constructor or as a function, throw a ClassNotFoundException as
// we can assume the user attempted to instantiate a non-existent class.
final MethodType type = desc.getMethodType();
return new GuardedInvocation(
MH.dropArguments(CLASS_NOT_FOUND, 1, type.parameterList().subList(1, type.parameterCount())),
type.parameterType(0) == NativeJavaPackage.class ? null : TYPE_GUARD);
}
@SuppressWarnings("unused")
private static void classNotFound(final NativeJavaPackage pkg) throws ClassNotFoundException {
throw new ClassNotFoundException(pkg.name);
}
/**
* "No such property" call placeholder.
*
......@@ -188,4 +222,7 @@ public final class NativeJavaPackage extends ScriptObject {
return noSuchProperty(desc, request);
}
private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types));
}
}
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* JDK-8014953: Have NativeJavaPackage throw a ClassNotFoundException when invoked with "new"
*
* @test
* @run
*/
try {
new java.util.ArrrayList(16)
} catch(e) {
print("Invoked as constructor");
print("e.class=" + e.class)
print("e.message=" + e.message);
}
try {
java.util.ArrrayList(16)
} catch(e) {
print("Invoked as method");
print("e.class=" + e.class)
print("e.message=" + e.message);
}
Invoked as constructor
e.class=class java.lang.ClassNotFoundException
e.message=java.util.ArrrayList
Invoked as method
e.class=class java.lang.ClassNotFoundException
e.message=java.util.ArrrayList
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册