public Object access(JavaObject object, String name) {
if (TruffleOptions.AOT || object.isNull()) {
throw UnsupportedMessageException.raise(Message.READ);
}
boolean isStatic = object.isStaticClass();
Class<?> lookupClass = object.getLookupClass();
JavaFieldDesc foundField = lookupField().execute(lookupClass, name, isStatic);
if (foundField != null) {
return readField().execute(foundField, object);
}
JavaMethodDesc foundMethod = lookupMethod().execute(lookupClass, name, isStatic);
if (foundMethod != null) {
return new JavaFunctionObject(foundMethod, object.obj, object.languageContext);
}
if (isStatic) {
LookupInnerClassNode lookupInnerClassNode = lookupInnerClass();
if ("class".equals(name)) {
return JavaObject.forClass(lookupClass, object.languageContext);
}
Class<?> innerclass = lookupInnerClassNode.execute(lookupClass, name);
if (innerclass != null) {
return JavaObject.forStaticClass(innerclass, object.languageContext);
}
}
throw UnknownIdentifierException.raise(name);
}