From 619b7bff1756bf9e834923cc6c789e1a4f647eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Tue, 4 Oct 2022 11:03:48 +0200 Subject: [PATCH] Add ConstantReadableJavaField caching in ConstantFieldSubstitutionProcessor Closes gh-29250 --- .../ConstantFieldSubstitutionProcessor.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/spring-core/graalvm/src/main/java/org/springframework/aot/graalvm/ConstantFieldSubstitutionProcessor.java b/spring-core/graalvm/src/main/java/org/springframework/aot/graalvm/ConstantFieldSubstitutionProcessor.java index 840044a55e..8c0fcb50e7 100644 --- a/spring-core/graalvm/src/main/java/org/springframework/aot/graalvm/ConstantFieldSubstitutionProcessor.java +++ b/spring-core/graalvm/src/main/java/org/springframework/aot/graalvm/ConstantFieldSubstitutionProcessor.java @@ -17,8 +17,8 @@ package org.springframework.aot.graalvm; import java.lang.reflect.Field; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.HashMap; +import java.util.Map; import java.util.regex.Pattern; import com.oracle.graal.pointsto.infrastructure.SubstitutionProcessor; @@ -51,7 +51,7 @@ class ConstantFieldSubstitutionProcessor extends SubstitutionProcessor { private final ThrowawayClassLoader throwawayClassLoader; - private Set seen = new LinkedHashSet<>(); + private Map cache = new HashMap<>(); ConstantFieldSubstitutionProcessor(DebugContext debug, ClassLoader applicationClassLoader) { @@ -67,21 +67,27 @@ class ConstantFieldSubstitutionProcessor extends SubstitutionProcessor { for (Pattern pattern : patterns) { if (pattern.matcher(fieldIdentifier).matches()) { try { + if (this.cache.containsKey(fieldIdentifier)) { + ConstantReadableJavaField readableJavaField = this.cache.get(fieldIdentifier); + if (readableJavaField != null) { + return readableJavaField; + } + else { + return super.lookup(field); + } + } JavaConstant constant = lookupConstant(declaringClass.toJavaName(), field.getName()); if (constant != null) { // TODO Use proper logging only when --verbose is specified when https://github.com/oracle/graal/issues/4669 will be fixed - if (!this.seen.contains(fieldIdentifier)) { - this.seen.add(fieldIdentifier); - System.out.println("Field " + fieldIdentifier + " set to " + constant.toValueString() + " at build time"); - } - return new ConstantReadableJavaField(field, constant); + ConstantReadableJavaField readableJavaField = new ConstantReadableJavaField(field, constant); + this.cache.put(fieldIdentifier, readableJavaField); + System.out.println("Field " + fieldIdentifier + " set to " + constant.toValueString() + " at build time"); + return readableJavaField; } } catch (Throwable ex) { - if (!this.seen.contains(fieldIdentifier)) { - this.seen.add(fieldIdentifier); - System.out.println("Processing of field " + fieldIdentifier + " skipped due the following error : " + ex.getMessage()); - } + System.out.println("Processing of field " + fieldIdentifier + " skipped due the following error : " + ex.getMessage()); + this.cache.put(fieldIdentifier, null); } } }