@Specialization(replaces = "doCached") void doUncached(SingleFieldDesc field, JavaObject object, Object rawValue) { Object val = toJava.execute(rawValue, field.getType(), field.getGenericType(), object.languageContext); field.set(object.obj, val); } }
@Specialization(replaces = "doCached") static Object doUncached(SingleFieldDesc field, JavaObject object) { Object val = field.get(object.obj); return JavaInterop.toGuestValue(val, object.languageContext); } }
private static void collectPublicInstanceFields(Class<?> type, Map<String, JavaFieldDesc> fieldMap, boolean mayHaveInaccessibleFields) { Set<String> fieldNames = new HashSet<>(); for (Class<?> superclass = type; superclass != null && superclass != Object.class; superclass = superclass.getSuperclass()) { boolean inheritedPublicInstanceFields = false; for (Field f : superclass.getFields()) { if (Modifier.isStatic(f.getModifiers())) { continue; } if (f.getDeclaringClass() != superclass) { if (Modifier.isPublic(f.getDeclaringClass().getModifiers())) { inheritedPublicInstanceFields = true; } continue; } // a public field in a non-public class hides fields further up the hierarchy if (mayHaveInaccessibleFields && !fieldNames.add(f.getName())) { continue; } if (Modifier.isPublic(f.getDeclaringClass().getModifiers())) { fieldMap.putIfAbsent(f.getName(), SingleFieldDesc.unreflect(f)); } else { assert mayHaveInaccessibleFields; } } if (!inheritedPublicInstanceFields) { break; } } }
static JavaFieldDesc unreflect(Field reflectionField) { assert isAccessible(reflectionField); if (TruffleOptions.AOT) { return new ReflectImpl(reflectionField); } else { return new MHImpl(reflectionField); } }
@SuppressWarnings("unused") @Specialization(guards = {"field == cachedField"}, limit = "LIMIT") static Object doCached(SingleFieldDesc field, JavaObject object, @Cached("field") SingleFieldDesc cachedField) { Object val = cachedField.get(object.obj); return JavaInterop.toGuestValue(val, object.languageContext); }
@SuppressWarnings("unused") @Specialization(guards = {"field == cachedField"}, limit = "LIMIT") void doCached(SingleFieldDesc field, JavaObject object, Object rawValue, @Cached("field") SingleFieldDesc cachedField) { Object val = toJava.execute(rawValue, cachedField.getType(), cachedField.getGenericType(), object.languageContext); cachedField.set(object.obj, val); }