use of com.oracle.truffle.espresso.impl.Klass in project graal by oracle.
the class JniEnv method FindClass.
/**
* <h3>jclass FindClass(JNIEnv *env, const char *name);</h3>
*
* <p>
* FindClass locates the class loader associated with the current native method; that is, the
* class loader of the class that declared the native method. If the native method belongs to a
* system class, no class loader will be involved. Otherwise, the proper class loader will be
* invoked to load and link the named class. Since Java 2 SDK release 1.2, when FindClass is
* called through the Invocation Interface, there is no current native method or its associated
* class loader. In that case, the result of {@link ClassLoader#getSystemClassLoader} is used.
* This is the class loader the virtual machine creates for applications, and is able to locate
* classes listed in the java.class.path property. The name argument is a fully-qualified class
* name or an array type signature .
* <p>
* For example, the fully-qualified class name for the {@code java.lang.String} class is:
*
* <pre>
* "java/lang/String"}
* </pre>
*
* <p>
* The array type signature of the array class {@code java.lang.Object[]} is:
*
* <pre>
* "[Ljava/lang/Object;"
* </pre>
*
* @param namePtr a fully-qualified class name (that is, a package name, delimited by "/",
* followed by the class name). If the name begins with "[" (the array signature
* character), it returns an array class. The string is encoded in modified UTF-8.
* @return Returns a class object from a fully-qualified name, or NULL if the class cannot be
* found.
* @throws ClassFormatError if the class data does not specify a valid class.
* @throws ClassCircularityError if a class or interface would be its own superclass or
* superinterface.
* @throws NoClassDefFoundError if no definition for a requested class or interface can be
* found.
* @throws OutOfMemoryError if the system runs out of memory.
*/
@TruffleBoundary
@JniImpl
@JavaType(Class.class)
public StaticObject FindClass(@Pointer TruffleObject namePtr, @Inject SubstitutionProfiler profiler) {
String name = NativeUtils.interopPointerToString(namePtr);
Meta meta = getMeta();
if (name == null || (name.indexOf('.') > -1)) {
profiler.profile(7);
throw meta.throwExceptionWithMessage(meta.java_lang_NoClassDefFoundError, name);
}
String internalName = name;
if (!name.startsWith("[")) {
// Force 'L' type.
internalName = "L" + name + ";";
}
if (!Validation.validTypeDescriptor(ByteSequence.create(internalName), true)) {
profiler.profile(6);
throw meta.throwExceptionWithMessage(meta.java_lang_NoClassDefFoundError, name);
}
StaticObject protectionDomain = StaticObject.NULL;
StaticObject loader = StaticObject.NULL;
// security stack walk
StaticObject caller = getVM().JVM_GetCallerClass(0, profiler);
if (StaticObject.notNull(caller)) {
Klass callerKlass = caller.getMirrorKlass();
loader = callerKlass.getDefiningClassLoader();
if (StaticObject.isNull(loader) && Type.java_lang_ClassLoader$NativeLibrary.equals(callerKlass.getType())) {
StaticObject result = (StaticObject) getMeta().java_lang_ClassLoader$NativeLibrary_getFromClass.invokeDirect(null);
loader = result.getMirrorKlass().getDefiningClassLoader();
protectionDomain = getVM().JVM_GetProtectionDomain(result);
}
} else {
loader = (StaticObject) getMeta().java_lang_ClassLoader_getSystemClassLoader.invokeDirect(null);
}
StaticObject guestClass = StaticObject.NULL;
try {
String dotName = name.replace('/', '.');
guestClass = (StaticObject) getMeta().java_lang_Class_forName_String_boolean_ClassLoader.invokeDirect(null, meta.toGuestString(dotName), false, loader);
EspressoError.guarantee(StaticObject.notNull(guestClass), "Class.forName returned null");
} catch (EspressoException e) {
profiler.profile(5);
if (InterpreterToVM.instanceOf(e.getGuestException(), meta.java_lang_ClassNotFoundException)) {
profiler.profile(4);
throw meta.throwExceptionWithMessage(meta.java_lang_NoClassDefFoundError, name);
}
throw e;
}
meta.HIDDEN_PROTECTION_DOMAIN.setHiddenObject(guestClass, protectionDomain);
// FindClass should initialize the class.
guestClass.getMirrorKlass().safeInitialize();
return guestClass;
}
use of com.oracle.truffle.espresso.impl.Klass in project graal by oracle.
the class JniEnv method NewObjectVarargs.
@JniImpl
@JavaType(Object.class)
public StaticObject NewObjectVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
Method method = methodIds.getObject(methodId);
assert method.isConstructor();
Klass klass = clazz.getMirrorKlass();
if (klass.isInterface() || klass.isAbstract()) {
Meta meta = getMeta();
throw meta.throwException(meta.java_lang_InstantiationException);
}
klass.initialize();
StaticObject instance;
if (CompilerDirectives.isPartialEvaluationConstant(klass)) {
instance = klass.allocateInstance();
} else {
instance = allocateBoundary(klass);
}
method.invokeDirect(instance, popVarArgs(varargsPtr, method.getParsedSignature()));
return instance;
}
use of com.oracle.truffle.espresso.impl.Klass in project graal by oracle.
the class JniEnv method GetFieldID.
// Checkstyle: stop method name check
// region Get*ID
/**
* <h3>jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);</h3>
* <p>
* Returns the field ID for an instance (nonstatic) field of a class. The field is specified by
* its name and signature. The Get<type>Field and Set<type>Field families of accessor functions
* use field IDs to retrieve object fields. GetFieldID() causes an uninitialized class to be
* initialized. GetFieldID() cannot be used to obtain the length field of an array. Use
* GetArrayLength() instead.
*
* @param clazz a Java class object.
* @param namePtr the field name in a 0-terminated modified UTF-8 string.
* @param typePtr the field signature in a 0-terminated modified UTF-8 string.
* @return a field ID, or NULL if the operation fails.
* @throws NoSuchFieldError: if the specified field cannot be found.
* @throws ExceptionInInitializerError: if the class initializer fails due to an exception.
* @throws OutOfMemoryError: if the system runs out of memory.
*/
@JniImpl
@Handle(Field.class)
public long GetFieldID(@JavaType(Class.class) StaticObject clazz, @Pointer TruffleObject namePtr, @Pointer TruffleObject typePtr) {
String name = NativeUtils.interopPointerToString(namePtr);
String type = NativeUtils.interopPointerToString(typePtr);
assert name != null && type != null;
Klass klass = clazz.getMirrorKlass();
Field field = null;
Symbol<Name> fieldName = getNames().lookup(name);
if (fieldName != null) {
Symbol<Type> fieldType = getTypes().lookup(type);
if (fieldType != null) {
// Lookup only if name and type are known symbols.
klass.safeInitialize();
field = klass.lookupField(fieldName, fieldType);
assert field == null || field.getType().equals(fieldType);
}
}
if (field == null || field.isStatic()) {
Meta meta = getMeta();
throw meta.throwExceptionWithMessage(meta.java_lang_NoSuchFieldError, name);
}
assert !field.isStatic();
return fieldIds.handlify(field);
}
use of com.oracle.truffle.espresso.impl.Klass in project graal by oracle.
the class VM method createDummyACC.
@JavaType(AccessControlContext.class)
private StaticObject createDummyACC() {
Klass pdKlass = getMeta().java_security_ProtectionDomain;
StaticObject pd = pdKlass.allocateInstance();
getMeta().java_security_ProtectionDomain_init_CodeSource_PermissionCollection.invokeDirect(pd, StaticObject.NULL, StaticObject.NULL);
StaticObject context = StaticObject.wrap(new StaticObject[] { pd }, getMeta());
return createACC(context, false, StaticObject.NULL);
}
use of com.oracle.truffle.espresso.impl.Klass in project graal by oracle.
the class VM method JVM_GetClassName.
@VmImpl(isJni = true)
@JavaType(String.class)
public StaticObject JVM_GetClassName(@JavaType(Class.class) StaticObject self) {
Klass klass = self.getMirrorKlass();
// Conversion from internal form.
String externalName = klass.getExternalName();
// Class names must be interned.
StaticObject guestString = getMeta().toGuestString(externalName);
return getStrings().intern(guestString);
}
Aggregations