< prev index next >

jdk/src/java.base/share/classes/valhalla/shady/ValueTypeHolder.java

Print this page




 478                 () -> MethodType.methodType(type, valueClass()),
 479                 C -> C.vload(0).getfield(valueClass(), name, fieldType).return_(fieldType));
 480     }
 481 
 482     private static <T extends MethodHandleCodeBuilder<T>> T valueHandleBuilder(Class<?> dvt, ValueHandleKey key, MethodHandleCodeBuilder<T> C) {
 483         MethodType mt = key.kind.handleType();
 484         if (mt.parameterCount() > 0) {
 485             throw new AssertionError("Non-nilary handle builders not supported yet");
 486         }
 487         Class<?> vtSupportClass = MinimalValueTypes_1_0.getIncubatorValueTypeClass();
 488         return C.vbox(MinimalValueTypes_1_0.getValueCapableClass(dvt))
 489                  .invokevirtual(Object.class, "getClass", "()Ljava/lang/Class;", false)
 490                  .invokestatic(vtSupportClass, "forClass",
 491                          MethodType.methodType(vtSupportClass, Class.class).toMethodDescriptorString(), false)
 492                  .invokevirtual(vtSupportClass, key.kind.handleName(), key.kind.handleType().toMethodDescriptorString(), false);
 493     }
 494 
 495     private MethodHandle getOrLoad(Lookup lookup, ValueHandleKey key, Supplier<MethodType> typeSupplier, Consumer<? super MethodHandleCodeBuilder<?>> codeBuilder) {
 496         MethodHandle result = handleMap.get(key);
 497         if (result == null) {
 498             String handleDebugName = sourceClass().getName() + "_" + key.kind.handleName();
 499             result = MethodHandleBuilder.loadCode(lookup, handleDebugName, typeSupplier.get(), codeBuilder);
 500             handleMap.put(key, result);
 501         }
 502         return result;
 503     }
 504 
 505     boolean isValueField(Field f) {
 506         return (f.getModifiers() & (Modifier.FINAL | Modifier.STATIC)) == Modifier.FINAL;
 507     }
 508 
 509     public Field[] valueFields() {
 510         return Stream.of(sourceClass().getDeclaredFields())
 511                 .filter(this::isValueField)
 512                 .toArray(Field[]::new);
 513     }
 514 
 515     final static class FieldInfo {
 516 
 517         private final String name;
 518         private final Class<?> type;
 519 




 478                 () -> MethodType.methodType(type, valueClass()),
 479                 C -> C.vload(0).getfield(valueClass(), name, fieldType).return_(fieldType));
 480     }
 481 
 482     private static <T extends MethodHandleCodeBuilder<T>> T valueHandleBuilder(Class<?> dvt, ValueHandleKey key, MethodHandleCodeBuilder<T> C) {
 483         MethodType mt = key.kind.handleType();
 484         if (mt.parameterCount() > 0) {
 485             throw new AssertionError("Non-nilary handle builders not supported yet");
 486         }
 487         Class<?> vtSupportClass = MinimalValueTypes_1_0.getIncubatorValueTypeClass();
 488         return C.vbox(MinimalValueTypes_1_0.getValueCapableClass(dvt))
 489                  .invokevirtual(Object.class, "getClass", "()Ljava/lang/Class;", false)
 490                  .invokestatic(vtSupportClass, "forClass",
 491                          MethodType.methodType(vtSupportClass, Class.class).toMethodDescriptorString(), false)
 492                  .invokevirtual(vtSupportClass, key.kind.handleName(), key.kind.handleType().toMethodDescriptorString(), false);
 493     }
 494 
 495     private MethodHandle getOrLoad(Lookup lookup, ValueHandleKey key, Supplier<MethodType> typeSupplier, Consumer<? super MethodHandleCodeBuilder<?>> codeBuilder) {
 496         MethodHandle result = handleMap.get(key);
 497         if (result == null) {
 498             String handleClassName = sourceClass().getName() + "_" + key.kind.handleName();
 499             result = MethodHandleBuilder.loadCode(lookup, handleClassName, key.kind.handleName(), typeSupplier.get(), codeBuilder);
 500             handleMap.put(key, result);
 501         }
 502         return result;
 503     }
 504 
 505     boolean isValueField(Field f) {
 506         return (f.getModifiers() & (Modifier.FINAL | Modifier.STATIC)) == Modifier.FINAL;
 507     }
 508 
 509     public Field[] valueFields() {
 510         return Stream.of(sourceClass().getDeclaredFields())
 511                 .filter(this::isValueField)
 512                 .toArray(Field[]::new);
 513     }
 514 
 515     final static class FieldInfo {
 516 
 517         private final String name;
 518         private final Class<?> type;
 519 


< prev index next >