Polishing

This commit is contained in:
Sam Brannen 2023-09-29 12:33:59 +02:00
parent 6030e62766
commit 0cb4043aac
4 changed files with 23 additions and 7 deletions

View File

@ -515,9 +515,9 @@ public class CodeFlow implements Opcodes {
}
/**
* Determine whether the descriptor is for a primitive type.
* Determine whether the descriptor is for a primitive type or {@code void}.
* @param descriptor type descriptor
* @return {@code true} if a primitive type
* @return {@code true} if a primitive type or {@code void}
*/
public static boolean isPrimitive(@Nullable String descriptor) {
return (descriptor != null && descriptor.length() == 1);

View File

@ -60,7 +60,7 @@ public class MethodReference extends SpelNodeImpl {
private final String name;
@Nullable
private String originalPrimitiveExitTypeDescriptor;
private Character originalPrimitiveExitTypeDescriptor;
@Nullable
private volatile CachedMethodExecutor cachedExecutor;
@ -260,7 +260,7 @@ public class MethodReference extends SpelNodeImpl {
Method method = reflectiveMethodExecutor.getMethod();
String descriptor = CodeFlow.toDescriptor(method.getReturnType());
if (this.nullSafe && CodeFlow.isPrimitive(descriptor)) {
this.originalPrimitiveExitTypeDescriptor = descriptor;
this.originalPrimitiveExitTypeDescriptor = descriptor.charAt(0);
this.exitTypeDescriptor = CodeFlow.toBoxedDescriptor(descriptor);
}
else {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -184,8 +184,9 @@ public final class SpelCompiler implements Opcodes {
cf.finish();
byte[] data = cw.toByteArray();
// TODO need to make this conditionally occur based on a debug flag
// dump(expressionToCompile.toStringAST(), clazzName, data);
// TODO Save generated class files conditionally based on a debug flag.
// Source code for the following method resides in SpelCompilationCoverageTests.
// saveGeneratedClassFile(expressionToCompile.toStringAST(), className, data);
return loadClass(StringUtils.replace(className, "/", "."), data);
}

View File

@ -6255,4 +6255,19 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
}
}
// NOTE: saveGeneratedClassFile() can be copied to SpelCompiler and uncommented
// at the end of createExpressionClass(SpelNodeImpl) in order to review generated
// byte code for debugging purposes.
//
// private static void saveGeneratedClassFile(String stringAST, String className, byte[] data) {
// Path path = Path.of("build", StringUtils.replace(className, "/", ".") + ".class");
// System.out.println("Writing compiled SpEL expression [%s] to [%s]".formatted(stringAST, path.toAbsolutePath()));
// try {
// Files.copy(new ByteArrayInputStream(data), path);
// }
// catch (IOException ex) {
// throw new UncheckedIOException(ex);
// }
// }
}