[Git][java-team/libreflectasm-java][upstream] New upstream version 1.11.9+dfsg

Pierre Gruet (@pgt) gitlab at salsa.debian.org
Thu Sep 22 20:23:47 BST 2022



Pierre Gruet pushed to branch upstream at Debian Java Maintainers / libreflectasm-java


Commits:
6dde7fcc by Pierre Gruet at 2022-09-21T15:01:04+02:00
New upstream version 1.11.9+dfsg
- - - - -


9 changed files:

- .classpath
- + .settings/org.eclipse.jdt.core.prefs
- README.md
- pom.xml
- src/com/esotericsoftware/reflectasm/AccessClassLoader.java
- src/com/esotericsoftware/reflectasm/ConstructorAccess.java
- src/com/esotericsoftware/reflectasm/FieldAccess.java
- src/com/esotericsoftware/reflectasm/MethodAccess.java
- test/com/esotericsoftware/reflectasm/ClassLoaderTest.java


Changes:

=====================================
.classpath
=====================================
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry excluding="**/.svn/*" kind="src" path="src"/>
 	<classpathentry excluding="**/.svn/*" kind="src" path="test"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
 	<classpathentry kind="lib" path="build/junit-4.6.jar"/>
 	<classpathentry kind="lib" path="lib/asm-5.1.jar"/>
 	<classpathentry kind="output" path="bin"/>


=====================================
.settings/org.eclipse.jdt.core.prefs
=====================================
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7


=====================================
README.md
=====================================
@@ -27,27 +27,10 @@ To use reflectasm with maven, please use the following snippet in your pom.xml
     <dependency>
         <groupId>com.esotericsoftware</groupId>
         <artifactId>reflectasm</artifactId>
-        <version>1.11.3</version>
+        <version>1.11.7</version>
     </dependency>
 ```
 
-If you already have asm in a different version (than the one pulled in by reflectasm - see pom.xml) in your classpath, you should use the shaded reflectasm (contains relocated asm classes):
-
-```xml
-<dependency>
-  <groupId>com.esotericsoftware</groupId>
-  <artifactId>reflectasm</artifactId>
-  <version>1.11.3</version>
-  <classifier>shaded</classifier>
-  <exclusions>
-    <exclusion>
-      <groupId>org.ow2.asm</groupId>
-      <artifactId>asm</artifactId>
-    </exclusion>
-  </exclusions>
-</dependency>
-```
-
 ## Usage
 
 Method reflection with ReflectASM:


=====================================
pom.xml
=====================================
@@ -7,7 +7,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>com.esotericsoftware</groupId>
 	<artifactId>reflectasm</artifactId>
-	<version>1.11.6</version>
+	<version>1.11.9</version>
 	<packaging>bundle</packaging>
 	<name>ReflectASM</name>
 	<description>High performance Java reflection using code generation</description>
@@ -88,9 +88,11 @@
 				<artifactId>maven-jar-plugin</artifactId>
 				<version>2.4</version>
 				<configuration>
-					<excludes>
-						<exclude>**/.svn/*</exclude>
-					</excludes>
+					<archive>
+						<manifestEntries>
+							<Automatic-Module-Name>com.esotericsoftware.reflectasm</Automatic-Module-Name>
+						</manifestEntries>
+					</archive>
 				</configuration>
 			</plugin>
 			<plugin>
@@ -125,6 +127,7 @@
 				<configuration>
 					<instructions>
 						<Export-Package>com.esotericsoftware.reflectasm*</Export-Package>
+						<Import-Package>!org.objectweb.asm.*</Import-Package>
 					</instructions>
 				</configuration>
 			</plugin>


=====================================
src/com/esotericsoftware/reflectasm/AccessClassLoader.java
=====================================
@@ -102,14 +102,15 @@ class AccessClassLoader extends ClassLoader {
 	}
 
 	static private Method getDefineClassMethod () throws Exception {
-		// DCL on volatile
 		if (defineClassMethod == null) {
 			synchronized (accessClassLoaders) {
-				defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass",
-					new Class[] {String.class, byte[].class, int.class, int.class, ProtectionDomain.class});
-				try {
-					defineClassMethod.setAccessible(true);
-				} catch (Exception ignored) {
+				if (defineClassMethod == null) {
+					defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass",
+						new Class[] {String.class, byte[].class, int.class, int.class, ProtectionDomain.class});
+					try {
+						defineClassMethod.setAccessible(true);
+					} catch (Exception ignored) {
+					}
 				}
 			}
 		}


=====================================
src/com/esotericsoftware/reflectasm/ConstructorAccess.java
=====================================
@@ -49,57 +49,54 @@ abstract public class ConstructorAccess<T> {
 		String accessClassName = className + "ConstructorAccess";
 		if (accessClassName.startsWith("java.")) accessClassName = "reflectasm." + accessClassName;
 
+		Class accessClass;
 		AccessClassLoader loader = AccessClassLoader.get(type);
-		Class accessClass = loader.loadAccessClass(accessClassName);
-		if (accessClass == null) {
-			synchronized (loader) {
-				accessClass = loader.loadAccessClass(accessClassName);
-				if (accessClass == null) {
-					String accessClassNameInternal = accessClassName.replace('.', '/');
-					String classNameInternal = className.replace('.', '/');
-					String enclosingClassNameInternal;
-					Constructor<T> constructor = null;
-					int modifiers = 0;
-					if (!isNonStaticMemberClass) {
-						enclosingClassNameInternal = null;
-						try {
-							constructor = type.getDeclaredConstructor((Class[])null);
-							modifiers = constructor.getModifiers();
-						} catch (Exception ex) {
-							throw new RuntimeException("Class cannot be created (missing no-arg constructor): " + type.getName(), ex);
-						}
-						if (Modifier.isPrivate(modifiers)) {
-							throw new RuntimeException("Class cannot be created (the no-arg constructor is private): " + type.getName());
-						}
-					} else {
-						enclosingClassNameInternal = enclosingType.getName().replace('.', '/');
-						try {
-							constructor = type.getDeclaredConstructor(enclosingType); // Inner classes should have this.
-							modifiers = constructor.getModifiers();
-						} catch (Exception ex) {
-							throw new RuntimeException(
-								"Non-static member class cannot be created (missing enclosing class constructor): " + type.getName(), ex);
-						}
-						if (Modifier.isPrivate(modifiers)) {
-							throw new RuntimeException(
-								"Non-static member class cannot be created (the enclosing class constructor is private): "
-									+ type.getName());
-						}
+		synchronized (loader) {
+			accessClass = loader.loadAccessClass(accessClassName);
+			if (accessClass == null) {
+				String accessClassNameInternal = accessClassName.replace('.', '/');
+				String classNameInternal = className.replace('.', '/');
+				String enclosingClassNameInternal;
+				Constructor<T> constructor = null;
+				int modifiers = 0;
+				if (!isNonStaticMemberClass) {
+					enclosingClassNameInternal = null;
+					try {
+						constructor = type.getDeclaredConstructor((Class[])null);
+						modifiers = constructor.getModifiers();
+					} catch (Exception ex) {
+						throw new RuntimeException("Class cannot be created (missing no-arg constructor): " + type.getName(), ex);
 					}
-					String superclassNameInternal = Modifier.isPublic(modifiers)
-						? "com/esotericsoftware/reflectasm/PublicConstructorAccess"
-						: "com/esotericsoftware/reflectasm/ConstructorAccess";
+					if (Modifier.isPrivate(modifiers)) {
+						throw new RuntimeException("Class cannot be created (the no-arg constructor is private): " + type.getName());
+					}
+				} else {
+					enclosingClassNameInternal = enclosingType.getName().replace('.', '/');
+					try {
+						constructor = type.getDeclaredConstructor(enclosingType); // Inner classes should have this.
+						modifiers = constructor.getModifiers();
+					} catch (Exception ex) {
+						throw new RuntimeException(
+							"Non-static member class cannot be created (missing enclosing class constructor): " + type.getName(), ex);
+					}
+					if (Modifier.isPrivate(modifiers)) {
+						throw new RuntimeException(
+							"Non-static member class cannot be created (the enclosing class constructor is private): " + type.getName());
+					}
+				}
+				String superclassNameInternal = Modifier.isPublic(modifiers)
+					? "com/esotericsoftware/reflectasm/PublicConstructorAccess"
+					: "com/esotericsoftware/reflectasm/ConstructorAccess";
 
-					ClassWriter cw = new ClassWriter(0);
-					cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, superclassNameInternal, null);
+				ClassWriter cw = new ClassWriter(0);
+				cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, superclassNameInternal, null);
 
-					insertConstructor(cw, superclassNameInternal);
-					insertNewInstance(cw, classNameInternal);
-					insertNewInstanceInner(cw, classNameInternal, enclosingClassNameInternal);
+				insertConstructor(cw, superclassNameInternal);
+				insertNewInstance(cw, classNameInternal);
+				insertNewInstanceInner(cw, classNameInternal, enclosingClassNameInternal);
 
-					cw.visitEnd();
-					accessClass = loader.defineAccessClass(accessClassName, cw.toByteArray());
-				}
+				cw.visitEnd();
+				accessClass = loader.defineAccessClass(accessClassName, cw.toByteArray());
 			}
 		}
 		ConstructorAccess<T> access;


=====================================
src/com/esotericsoftware/reflectasm/FieldAccess.java
=====================================
@@ -138,41 +138,39 @@ public abstract class FieldAccess {
 		String accessClassName = className + "FieldAccess";
 		if (accessClassName.startsWith("java.")) accessClassName = "reflectasm." + accessClassName;
 
+		Class accessClass;
 		AccessClassLoader loader = AccessClassLoader.get(type);
-		Class accessClass = loader.loadAccessClass(accessClassName);
-		if (accessClass == null) {
-			synchronized (loader) {
-				accessClass = loader.loadAccessClass(accessClassName);
-				if (accessClass == null) {
-					String accessClassNameInternal = accessClassName.replace('.', '/');
-					String classNameInternal = className.replace('.', '/');
-
-					ClassWriter cw = new ClassWriter(0);
-					cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null,
-						"com/esotericsoftware/reflectasm/FieldAccess", null);
-					insertConstructor(cw);
-					insertGetObject(cw, classNameInternal, fields);
-					insertSetObject(cw, classNameInternal, fields);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.BOOLEAN_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.BOOLEAN_TYPE);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.BYTE_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.BYTE_TYPE);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.SHORT_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.SHORT_TYPE);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.INT_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.INT_TYPE);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.LONG_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.LONG_TYPE);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.DOUBLE_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.DOUBLE_TYPE);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.FLOAT_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.FLOAT_TYPE);
-					insertGetPrimitive(cw, classNameInternal, fields, Type.CHAR_TYPE);
-					insertSetPrimitive(cw, classNameInternal, fields, Type.CHAR_TYPE);
-					insertGetString(cw, classNameInternal, fields);
-					cw.visitEnd();
-					accessClass = loader.defineAccessClass(accessClassName, cw.toByteArray());
-				}
+		synchronized (loader) {
+			accessClass = loader.loadAccessClass(accessClassName);
+			if (accessClass == null) {
+				String accessClassNameInternal = accessClassName.replace('.', '/');
+				String classNameInternal = className.replace('.', '/');
+
+				ClassWriter cw = new ClassWriter(0);
+				cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, "com/esotericsoftware/reflectasm/FieldAccess",
+					null);
+				insertConstructor(cw);
+				insertGetObject(cw, classNameInternal, fields);
+				insertSetObject(cw, classNameInternal, fields);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.BOOLEAN_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.BOOLEAN_TYPE);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.BYTE_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.BYTE_TYPE);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.SHORT_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.SHORT_TYPE);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.INT_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.INT_TYPE);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.LONG_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.LONG_TYPE);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.DOUBLE_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.DOUBLE_TYPE);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.FLOAT_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.FLOAT_TYPE);
+				insertGetPrimitive(cw, classNameInternal, fields, Type.CHAR_TYPE);
+				insertSetPrimitive(cw, classNameInternal, fields, Type.CHAR_TYPE);
+				insertGetString(cw, classNameInternal, fields);
+				cw.visitEnd();
+				accessClass = loader.defineAccessClass(accessClassName, cw.toByteArray());
 			}
 		}
 		try {


=====================================
src/com/esotericsoftware/reflectasm/MethodAccess.java
=====================================
@@ -79,11 +79,11 @@ public abstract class MethodAccess {
 	}
 
 	/** Creates a new MethodAccess for the specified type.
-	 * @param type Must not be the Object class, a primitive type, or void. */
+	 * @param type Must not be a primitive type, or void. */
 	static public MethodAccess get (Class type) {
 		boolean isInterface = type.isInterface();
-		if (!isInterface && type.getSuperclass() == null)
-			throw new IllegalArgumentException("The type must not be the Object class, an interface, a primitive type, or void.");
+		if (!isInterface && type.getSuperclass() == null && type != Object.class)
+			throw new IllegalArgumentException("The type must not be an interface, a primitive type, or void.");
 
 		ArrayList<Method> methods = new ArrayList<Method>();
 		if (!isInterface) {
@@ -110,172 +110,170 @@ public abstract class MethodAccess {
 		String accessClassName = className + "MethodAccess";
 		if (accessClassName.startsWith("java.")) accessClassName = "reflectasm." + accessClassName;
 
+		Class accessClass;
 		AccessClassLoader loader = AccessClassLoader.get(type);
-		Class accessClass = loader.loadAccessClass(accessClassName);
-		if (accessClass == null) {
-			synchronized (loader) {
-				accessClass = loader.loadAccessClass(accessClassName);
-				if (accessClass == null) {
-					String accessClassNameInternal = accessClassName.replace('.', '/');
-					String classNameInternal = className.replace('.', '/');
+		synchronized (loader) {
+			accessClass = loader.loadAccessClass(accessClassName);
+			if (accessClass == null) {
+				String accessClassNameInternal = accessClassName.replace('.', '/');
+				String classNameInternal = className.replace('.', '/');
 
-					ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-					MethodVisitor mv;
-					cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null,
-						"com/esotericsoftware/reflectasm/MethodAccess", null);
-					{
-						mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
-						mv.visitCode();
-						mv.visitVarInsn(ALOAD, 0);
-						mv.visitMethodInsn(INVOKESPECIAL, "com/esotericsoftware/reflectasm/MethodAccess", "<init>", "()V");
-						mv.visitInsn(RETURN);
-						mv.visitMaxs(0, 0);
-						mv.visitEnd();
-					}
-					{
-						mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "invoke",
-							"(Ljava/lang/Object;I[Ljava/lang/Object;)Ljava/lang/Object;", null, null);
-						mv.visitCode();
-
-						if (!methods.isEmpty()) {
-							mv.visitVarInsn(ALOAD, 1);
-							mv.visitTypeInsn(CHECKCAST, classNameInternal);
-							mv.visitVarInsn(ASTORE, 4);
-
-							mv.visitVarInsn(ILOAD, 2);
-							Label[] labels = new Label[n];
-							for (int i = 0; i < n; i++)
-								labels[i] = new Label();
-							Label defaultLabel = new Label();
-							mv.visitTableSwitchInsn(0, labels.length - 1, defaultLabel, labels);
+				ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+				MethodVisitor mv;
+				cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, "com/esotericsoftware/reflectasm/MethodAccess",
+					null);
+				{
+					mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+					mv.visitCode();
+					mv.visitVarInsn(ALOAD, 0);
+					mv.visitMethodInsn(INVOKESPECIAL, "com/esotericsoftware/reflectasm/MethodAccess", "<init>", "()V");
+					mv.visitInsn(RETURN);
+					mv.visitMaxs(0, 0);
+					mv.visitEnd();
+				}
+				{
+					mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "invoke",
+						"(Ljava/lang/Object;I[Ljava/lang/Object;)Ljava/lang/Object;", null, null);
+					mv.visitCode();
 
-							StringBuilder buffer = new StringBuilder(128);
-							for (int i = 0; i < n; i++) {
-								mv.visitLabel(labels[i]);
-								if (i == 0)
-									mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] {classNameInternal}, 0, null);
-								else
-									mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-								mv.visitVarInsn(ALOAD, 4);
+					if (!methods.isEmpty()) {
+						mv.visitVarInsn(ALOAD, 1);
+						mv.visitTypeInsn(CHECKCAST, classNameInternal);
+						mv.visitVarInsn(ASTORE, 4);
 
-								buffer.setLength(0);
-								buffer.append('(');
+						mv.visitVarInsn(ILOAD, 2);
+						Label[] labels = new Label[n];
+						for (int i = 0; i < n; i++)
+							labels[i] = new Label();
+						Label defaultLabel = new Label();
+						mv.visitTableSwitchInsn(0, labels.length - 1, defaultLabel, labels);
 
-								Class[] paramTypes = parameterTypes[i];
-								Class returnType = returnTypes[i];
-								for (int paramIndex = 0; paramIndex < paramTypes.length; paramIndex++) {
-									mv.visitVarInsn(ALOAD, 3);
-									mv.visitIntInsn(BIPUSH, paramIndex);
-									mv.visitInsn(AALOAD);
-									Type paramType = Type.getType(paramTypes[paramIndex]);
-									switch (paramType.getSort()) {
-									case Type.BOOLEAN:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z");
-										break;
-									case Type.BYTE:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Byte");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B");
-										break;
-									case Type.CHAR:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Character");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C");
-										break;
-									case Type.SHORT:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Short");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S");
-										break;
-									case Type.INT:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I");
-										break;
-									case Type.FLOAT:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Float");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F");
-										break;
-									case Type.LONG:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J");
-										break;
-									case Type.DOUBLE:
-										mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
-										mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D");
-										break;
-									case Type.ARRAY:
-										mv.visitTypeInsn(CHECKCAST, paramType.getDescriptor());
-										break;
-									case Type.OBJECT:
-										mv.visitTypeInsn(CHECKCAST, paramType.getInternalName());
-										break;
-									}
-									buffer.append(paramType.getDescriptor());
-								}
+						StringBuilder buffer = new StringBuilder(128);
+						for (int i = 0; i < n; i++) {
+							mv.visitLabel(labels[i]);
+							if (i == 0)
+								mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] {classNameInternal}, 0, null);
+							else
+								mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+							mv.visitVarInsn(ALOAD, 4);
 
-								buffer.append(')');
-								buffer.append(Type.getDescriptor(returnType));
-								int invoke;
-								if (isInterface)
-									invoke = INVOKEINTERFACE;
-								else if (Modifier.isStatic(methods.get(i).getModifiers()))
-									invoke = INVOKESTATIC;
-								else
-									invoke = INVOKEVIRTUAL;
-								mv.visitMethodInsn(invoke, classNameInternal, methodNames[i], buffer.toString());
+							buffer.setLength(0);
+							buffer.append('(');
 
-								switch (Type.getType(returnType).getSort()) {
-								case Type.VOID:
-									mv.visitInsn(ACONST_NULL);
-									break;
+							Class[] paramTypes = parameterTypes[i];
+							Class returnType = returnTypes[i];
+							for (int paramIndex = 0; paramIndex < paramTypes.length; paramIndex++) {
+								mv.visitVarInsn(ALOAD, 3);
+								mv.visitIntInsn(BIPUSH, paramIndex);
+								mv.visitInsn(AALOAD);
+								Type paramType = Type.getType(paramTypes[paramIndex]);
+								switch (paramType.getSort()) {
 								case Type.BOOLEAN:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z");
 									break;
 								case Type.BYTE:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Byte");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B");
 									break;
 								case Type.CHAR:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Character");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C");
 									break;
 								case Type.SHORT:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Short");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S");
 									break;
 								case Type.INT:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I");
 									break;
 								case Type.FLOAT:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Float");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F");
 									break;
 								case Type.LONG:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J");
 									break;
 								case Type.DOUBLE:
-									mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
+									mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
+									mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D");
+									break;
+								case Type.ARRAY:
+									mv.visitTypeInsn(CHECKCAST, paramType.getDescriptor());
+									break;
+								case Type.OBJECT:
+									mv.visitTypeInsn(CHECKCAST, paramType.getInternalName());
 									break;
 								}
+								buffer.append(paramType.getDescriptor());
+							}
 
-								mv.visitInsn(ARETURN);
+							buffer.append(')');
+							buffer.append(Type.getDescriptor(returnType));
+							int invoke;
+							if (isInterface)
+								invoke = INVOKEINTERFACE;
+							else if (Modifier.isStatic(methods.get(i).getModifiers()))
+								invoke = INVOKESTATIC;
+							else
+								invoke = INVOKEVIRTUAL;
+							mv.visitMethodInsn(invoke, classNameInternal, methodNames[i], buffer.toString());
+
+							switch (Type.getType(returnType).getSort()) {
+							case Type.VOID:
+								mv.visitInsn(ACONST_NULL);
+								break;
+							case Type.BOOLEAN:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
+								break;
+							case Type.BYTE:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
+								break;
+							case Type.CHAR:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
+								break;
+							case Type.SHORT:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
+								break;
+							case Type.INT:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
+								break;
+							case Type.FLOAT:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
+								break;
+							case Type.LONG:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
+								break;
+							case Type.DOUBLE:
+								mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
+								break;
 							}
 
-							mv.visitLabel(defaultLabel);
-							mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+							mv.visitInsn(ARETURN);
 						}
-						mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
-						mv.visitInsn(DUP);
-						mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
-						mv.visitInsn(DUP);
-						mv.visitLdcInsn("Method not found: ");
-						mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V");
-						mv.visitVarInsn(ILOAD, 2);
-						mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;");
-						mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
-						mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V");
-						mv.visitInsn(ATHROW);
-						mv.visitMaxs(0, 0);
-						mv.visitEnd();
+
+						mv.visitLabel(defaultLabel);
+						mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
 					}
-					cw.visitEnd();
-					byte[] data = cw.toByteArray();
-					accessClass = loader.defineAccessClass(accessClassName, data);
+					mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
+					mv.visitInsn(DUP);
+					mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
+					mv.visitInsn(DUP);
+					mv.visitLdcInsn("Method not found: ");
+					mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V");
+					mv.visitVarInsn(ILOAD, 2);
+					mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;");
+					mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
+					mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V");
+					mv.visitInsn(ATHROW);
+					mv.visitMaxs(0, 0);
+					mv.visitEnd();
 				}
+				cw.visitEnd();
+				byte[] data = cw.toByteArray();
+				accessClass = loader.defineAccessClass(accessClassName, data);
 			}
 		}
 		try {


=====================================
test/com/esotericsoftware/reflectasm/ClassLoaderTest.java
=====================================
@@ -36,8 +36,9 @@ public class ClassLoaderTest extends TestCase {
 		assertEquals("first", testObject.toString());
 		assertEquals("first", access.get(testObject, "name"));
 	}
-	
+
 	public void testAutoUnloadClassloaders () throws Exception {
+		reclaimLoaders();
 		int initialCount = AccessClassLoader.activeAccessClassLoaders();
 
 		ClassLoader testClassLoader1 = new TestClassLoader1();
@@ -55,12 +56,12 @@ public class ClassLoaderTest extends TestCase {
 		access2.set(testObject2, "name", "second");
 		assertEquals("second", testObject2.toString());
 		assertEquals("second", access2.get(testObject2, "name"));
-		
+
 		assertEquals(access1.getClass().toString(), access2.getClass().toString()); // Same class names
 		assertFalse(access1.getClass().equals(access2.getClass())); // But different classes
-		
-		assertEquals(initialCount+2, AccessClassLoader.activeAccessClassLoaders());
-		
+
+		assertEquals(initialCount + 2, AccessClassLoader.activeAccessClassLoaders());
+
 		testClassLoader1 = null;
 		testClass1 = null;
 		testObject1 = null;
@@ -69,24 +70,28 @@ public class ClassLoaderTest extends TestCase {
 		testClass2 = null;
 		testObject2 = null;
 		access2 = null;
-		
+
+		reclaimLoaders();
+
+		// Yeah, reclaimed!
+		assertEquals(initialCount, AccessClassLoader.activeAccessClassLoaders());
+	}
+
+	private void reclaimLoaders () throws Exception {
 		// Force GC to reclaim unreachable (or only weak-reachable) objects
 		System.gc();
 		try {
-			Object[] array = new Object[(int) Runtime.getRuntime().maxMemory()];
+			Object[] array = new Object[(int)Runtime.getRuntime().maxMemory()];
 			System.out.println(array.length);
 		} catch (Throwable e) {
 			// Ignore OME
 		}
 		System.gc();
 		int times = 0;
-		while (AccessClassLoader.activeAccessClassLoaders()>1 && times < 50) { // max 5 seconds, should be instant
+		while (AccessClassLoader.activeAccessClassLoaders() > 1 && times < 50) { // max 5 seconds, should be instant
 			Thread.sleep(100); // test again
 			times++;
 		}
-
-		// Yeah, both reclaimed!
-		assertEquals(Math.min(initialCount, 1), AccessClassLoader.activeAccessClassLoaders());
 	}
 
 	public void testRemoveClassloaders () throws Exception {
@@ -107,18 +112,18 @@ public class ClassLoaderTest extends TestCase {
 		access2.set(testObject2, "name", "second");
 		assertEquals("second", testObject2.toString());
 		assertEquals("second", access2.get(testObject2, "name"));
-		
+
 		assertEquals(access1.getClass().toString(), access2.getClass().toString()); // Same class names
 		assertFalse(access1.getClass().equals(access2.getClass())); // But different classes
-		
-		assertEquals(initialCount+2, AccessClassLoader.activeAccessClassLoaders());
-		
+
+		assertEquals(initialCount + 2, AccessClassLoader.activeAccessClassLoaders());
+
 		AccessClassLoader.remove(testObject1.getClass().getClassLoader());
-		assertEquals(initialCount+1, AccessClassLoader.activeAccessClassLoaders());
+		assertEquals(initialCount + 1, AccessClassLoader.activeAccessClassLoaders());
 		AccessClassLoader.remove(testObject2.getClass().getClassLoader());
-		assertEquals(initialCount+0, AccessClassLoader.activeAccessClassLoaders());
+		assertEquals(initialCount + 0, AccessClassLoader.activeAccessClassLoaders());
 		AccessClassLoader.remove(this.getClass().getClassLoader());
-		assertEquals(initialCount-1, AccessClassLoader.activeAccessClassLoaders());
+		assertEquals(initialCount - 1, AccessClassLoader.activeAccessClassLoaders());
 	}
 
 	static public class Test {
@@ -128,7 +133,7 @@ public class ClassLoaderTest extends TestCase {
 			return name;
 		}
 	}
-	
+
 	static public class TestClassLoader1 extends ClassLoader {
 		protected synchronized Class<?> loadClass (String name, boolean resolve) throws ClassNotFoundException {
 			Class c = findLoadedClass(name);



View it on GitLab: https://salsa.debian.org/java-team/libreflectasm-java/-/commit/6dde7fccffc4d0b0956879d45059938907729b51

-- 
View it on GitLab: https://salsa.debian.org/java-team/libreflectasm-java/-/commit/6dde7fccffc4d0b0956879d45059938907729b51
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20220922/3cb18ce0/attachment.htm>


More information about the pkg-java-commits mailing list