Skip to content
This repository was archived by the owner on Feb 23, 2023. It is now read-only.

Commit e26b9e4

Browse files
committed
Add support for primitive types in @MethodHint parameterTypes
See gh-1636
1 parent 6c19b3f commit e26b9e4

File tree

3 files changed

+72
-22
lines changed

3 files changed

+72
-22
lines changed

spring-aot/src/main/java/org/springframework/nativex/type/Type.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@
1616

1717
package org.springframework.nativex.type;
1818

19-
import java.io.ByteArrayInputStream;
20-
import java.io.IOException;
2119
import java.lang.reflect.Modifier;
2220
import java.util.AbstractMap;
2321
import java.util.ArrayList;
2422
import java.util.Arrays;
25-
import java.util.Collection;
2623
import java.util.Collections;
2724
import java.util.HashMap;
2825
import java.util.HashSet;
@@ -35,7 +32,6 @@
3532
import java.util.Optional;
3633
import java.util.Queue;
3734
import java.util.Set;
38-
import java.util.Stack;
3935
import java.util.TreeSet;
4036
import java.util.function.Consumer;
4137
import java.util.function.Predicate;
@@ -60,22 +56,21 @@
6056
import org.springframework.nativex.hint.AccessBits;
6157
import org.springframework.nativex.hint.AotProxyHint;
6258
import org.springframework.nativex.hint.AotProxyHints;
63-
import org.springframework.nativex.hint.TypeAccess;
6459
import org.springframework.nativex.hint.InitializationHint;
6560
import org.springframework.nativex.hint.InitializationHints;
6661
import org.springframework.nativex.hint.InitializationTime;
62+
import org.springframework.nativex.hint.JdkProxyHint;
63+
import org.springframework.nativex.hint.JdkProxyHints;
6764
import org.springframework.nativex.hint.NativeHint;
6865
import org.springframework.nativex.hint.NativeHints;
6966
import org.springframework.nativex.hint.ProxyBits;
70-
import org.springframework.nativex.hint.JdkProxyHint;
71-
import org.springframework.nativex.hint.JdkProxyHints;
7267
import org.springframework.nativex.hint.ResourceHint;
7368
import org.springframework.nativex.hint.ResourcesHints;
7469
import org.springframework.nativex.hint.SerializationHint;
7570
import org.springframework.nativex.hint.SerializationHints;
71+
import org.springframework.nativex.hint.TypeAccess;
7672
import org.springframework.nativex.hint.TypeHint;
7773
import org.springframework.nativex.hint.TypeHints;
78-
import org.springframework.util.ClassUtils;
7974
import org.springframework.util.ObjectUtils;
8075
import org.springframework.util.StringUtils;
8176

@@ -1808,11 +1803,17 @@ private void unpackMethodInfo(AnnotationNode methodInfo, List<MethodDescriptor>
18081803
List<String> resolvedParameterTypes = new ArrayList<>();
18091804
for (org.objectweb.asm.Type ptype : parameterTypes) {
18101805
String typeName = ptype.getClassName();
1811-
Type resolvedType = typeSystem.resolveName(typeName, true);
1812-
if (resolvedType != null) {
1806+
if (typeSystem.isPrimitive(ptype) || typeSystem.isPrimitiveArray(ptype)) {
18131807
resolvedParameterTypes.add(typeName);
1814-
} else {
1815-
unresolvable = true;
1808+
}
1809+
else {
1810+
Type resolvedType = typeSystem.resolveName(typeName, true);
1811+
if (resolvedType != null) {
1812+
resolvedParameterTypes.add(typeName);
1813+
}
1814+
else {
1815+
unresolvable = true;
1816+
}
18161817
}
18171818
}
18181819
if (unresolvable) {

spring-aot/src/main/java/org/springframework/nativex/type/TypeSystem.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import java.util.Map.Entry;
4848
import java.util.Objects;
4949
import java.util.Optional;
50-
import java.util.Properties;
5150
import java.util.Set;
5251
import java.util.function.Function;
5352
import java.util.function.Predicate;
@@ -61,15 +60,13 @@
6160
import org.objectweb.asm.ClassReader;
6261
import org.objectweb.asm.tree.AnnotationNode;
6362
import org.objectweb.asm.tree.ClassNode;
63+
6464
import org.springframework.aot.context.bootstrap.generator.infrastructure.nativex.BeanFactoryNativeConfigurationProcessor;
6565
import org.springframework.aot.context.bootstrap.generator.infrastructure.nativex.BeanNativeConfigurationProcessor;
6666
import org.springframework.aot.context.bootstrap.generator.infrastructure.nativex.NativeConfigurationRegistry;
6767
import org.springframework.boot.loader.tools.MainClassFinder;
6868
import org.springframework.lang.Nullable;
6969
import org.springframework.nativex.AotOptions;
70-
import org.springframework.nativex.domain.reflect.JsonMarshaller;
71-
import org.springframework.nativex.domain.reflect.ReflectionDescriptor;
72-
import org.springframework.nativex.domain.resources.ResourcesDescriptor;
7370
import org.springframework.util.Assert;
7471

7572
/**
@@ -1474,14 +1471,36 @@ public Type resolve(Class<?> clazz) {
14741471
}
14751472

14761473
public Type resolve(Class<?> clazz, boolean silent) {
1477-
return resolve(clazz.getName().replace(".","/"), silent);
1474+
return resolve(clazz.getName().replace(".", "/"), silent);
14781475
}
14791476

14801477
public boolean exists(TypeName typename) {
14811478
Type resolvedType = resolve(typename);
14821479
return resolvedType != null;
14831480
}
14841481

1482+
public boolean isPrimitive(org.objectweb.asm.Type type) {
1483+
return
1484+
type.equals(org.objectweb.asm.Type.BOOLEAN_TYPE) ||
1485+
type.equals(org.objectweb.asm.Type.CHAR_TYPE) ||
1486+
type.equals(org.objectweb.asm.Type.BYTE_TYPE) ||
1487+
type.equals(org.objectweb.asm.Type.SHORT_TYPE) ||
1488+
type.equals(org.objectweb.asm.Type.INT_TYPE) ||
1489+
type.equals(org.objectweb.asm.Type.FLOAT_TYPE) ||
1490+
type.equals(org.objectweb.asm.Type.LONG_TYPE) ||
1491+
type.equals(org.objectweb.asm.Type.DOUBLE_TYPE);
1492+
}
1493+
1494+
public boolean isPrimitiveArray(org.objectweb.asm.Type type) {
1495+
if (!type.getInternalName().startsWith("[")) {
1496+
// That's no array
1497+
return false;
1498+
}
1499+
// Strip the array prefix and see if its now primitive
1500+
org.objectweb.asm.Type typeNoArray = org.objectweb.asm.Type.getType(type.getInternalName().substring(1));
1501+
return isPrimitive(typeNoArray);
1502+
}
1503+
14851504
/**
14861505
* From [J to long[] and java.lang.String to java.lang.String
14871506
* @param typename the type name
@@ -1490,7 +1509,9 @@ public boolean exists(TypeName typename) {
14901509
public static String decodeName(String typename) {
14911510
StringBuilder s = new StringBuilder();
14921511
int dims = 0;
1493-
while (typename.charAt(dims)=='[') { dims++; }
1512+
while (typename.charAt(dims) == '[') {
1513+
dims++;
1514+
}
14941515
if (dims>0) {
14951516
if (typename.endsWith(";")) {
14961517
s.append(typename.substring(dims+1,typename.length()-1).replace("/", "."));

spring-aot/src/test/java/org/springframework/nativex/TypeSystemTests.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.nativex.type.TypeSystem;
2727

2828
import static org.junit.jupiter.api.Assertions.assertEquals;
29+
import static org.junit.jupiter.api.Assertions.assertFalse;
2930
import static org.junit.jupiter.api.Assertions.assertNotNull;
3031
import static org.junit.jupiter.api.Assertions.assertTrue;
3132

@@ -58,11 +59,38 @@ public void testArray() throws Exception {
5859
assertEquals("Ljava/lang/String;", s.getDescriptor());
5960
Type t = typeSystem.resolveName("java.lang.String[]");
6061
assertNotNull(t);
61-
assertEquals(1,t.getDimensions());
62+
assertEquals(1, t.getDimensions());
6263
assertTrue(t.isArray());
63-
assertEquals("[Ljava/lang/String;",t.getDescriptor());
64-
assertEquals("java/lang/String[]",t.getName());
65-
assertEquals("java.lang.String[]",t.getDottedName());
64+
assertEquals("[Ljava/lang/String;", t.getDescriptor());
65+
assertEquals("java/lang/String[]", t.getName());
66+
assertEquals("java.lang.String[]", t.getDottedName());
6667
}
6768

69+
@Test
70+
void testPrimitives() {
71+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(byte.class)));
72+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(short.class)));
73+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(int.class)));
74+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(long.class)));
75+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(float.class)));
76+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(double.class)));
77+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(char.class)));
78+
assertTrue(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(boolean.class)));
79+
assertFalse(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(Object.class)));
80+
assertFalse(typeSystem.isPrimitive(org.objectweb.asm.Type.getType(String.class)));
81+
}
82+
83+
@Test
84+
void testPrimitivesArray() {
85+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(byte[].class)));
86+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(short[].class)));
87+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(int[].class)));
88+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(long[].class)));
89+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(float[].class)));
90+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(double[].class)));
91+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(char[].class)));
92+
assertTrue(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(boolean[].class)));
93+
assertFalse(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(Object[].class)));
94+
assertFalse(typeSystem.isPrimitiveArray(org.objectweb.asm.Type.getType(String[].class)));
95+
}
6896
}

0 commit comments

Comments
 (0)