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 |