[Git][java-team/libreflectasm-java][master] 8 commits: Updating d/watch after a change in the Github layout
Pierre Gruet (@pgt)
gitlab at salsa.debian.org
Thu Sep 22 20:19:56 BST 2022
Pierre Gruet pushed to branch master at Debian Java Maintainers / libreflectasm-java
Commits:
53c133cb by Pierre Gruet at 2022-09-21T15:00:43+02:00
Updating d/watch after a change in the Github layout
- - - - -
6dde7fcc by Pierre Gruet at 2022-09-21T15:01:04+02:00
New upstream version 1.11.9+dfsg
- - - - -
ad00901c by Pierre Gruet at 2022-09-21T15:01:07+02:00
Update upstream source from tag 'upstream/1.11.9+dfsg'
Update to upstream version '1.11.9+dfsg'
with Debian dir 51da811f1a38535e9d301d0780132530028711a6
- - - - -
e005651a by Pierre Gruet at 2022-09-22T15:56:21+02:00
Refreshing patches
- - - - -
bcf9853e by Pierre Gruet at 2022-09-22T15:57:03+02:00
Raising Standards version to 4.6.1 (no change)
- - - - -
983580db by Pierre Gruet at 2022-09-22T15:57:36+02:00
Updating changelog
- - - - -
228c2a3a by Pierre Gruet at 2022-09-22T16:23:21+02:00
Refreshing Lintian overrides
- - - - -
23667f4c by Pierre Gruet at 2022-09-22T16:23:44+02:00
Upload to unstable
- - - - -
18 changed files:
- .classpath
- + .settings/org.eclipse.jdt.core.prefs
- README.md
- debian/changelog
- debian/control
- debian/libreflectasm-java-doc.lintian-overrides
- + debian/libreflectasm-java.lintian-overrides
- debian/patches/generate_1_6_classes.patch
- debian/patches/javadoc.patch
- debian/patches/no_shading.patch
- debian/patches/series
- debian/watch
- 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:
=====================================
debian/changelog
=====================================
@@ -1,3 +1,14 @@
+libreflectasm-java (1.11.9+dfsg-1) unstable; urgency=medium
+
+ * New upstream version 1.11.9+dfsg
+ * Refreshing patches
+ * Raising Standards version to 4.6.1 (no change)
+ * Updating d/watch after a change in the Github layout
+ * Adding a Lintian override for the bad-jar-name warning
+ * Refreshing the Lintian override for the embedded Javascript
+
+ -- Pierre Gruet <pgt at debian.org> Thu, 22 Sep 2022 16:23:33 +0200
+
libreflectasm-java (1.11.6+dfsg-1) unstable; urgency=medium
* Bumping Standards version to 4.6.0 (no change)
=====================================
debian/control
=====================================
@@ -13,7 +13,7 @@ Build-Depends: debhelper-compat (= 13),
libasm-java,
libasm-java-doc,
junit4 <!nocheck>
-Standards-Version: 4.6.0
+Standards-Version: 4.6.1
Vcs-Git: https://salsa.debian.org/java-team/libreflectasm-java.git
Vcs-Browser: https://salsa.debian.org/java-team/libreflectasm-java
Homepage: https://github.com/EsotericSoftware/reflectasm
=====================================
debian/libreflectasm-java-doc.lintian-overrides
=====================================
@@ -1,4 +1,4 @@
# It would be too complicated to remove the javascript that is included in
# javadocs, see the discussion on Debian Java mailing list starting at
# https://lists.debian.org/debian-java/2018/06/msg00020.html.
-embedded-javascript-library usr/share/doc/libreflectasm-java/api/*/jquery*.*s *
+embedded-javascript-library please use * [usr/share/doc/libreflectasm-java/api/*/jquery*.*s]
=====================================
debian/libreflectasm-java.lintian-overrides
=====================================
@@ -0,0 +1,3 @@
+# The indicated file is the real jar and not a symlink, but this really does
+# not harm.
+bad-jar-name [usr/share/java/reflectasm.jar]
=====================================
debian/patches/generate_1_6_classes.patch
=====================================
@@ -7,34 +7,34 @@ Last-Update: 2021-05-18
--- a/src/com/esotericsoftware/reflectasm/ConstructorAccess.java
+++ b/src/com/esotericsoftware/reflectasm/ConstructorAccess.java
-@@ -91,7 +91,7 @@
- : "com/esotericsoftware/reflectasm/ConstructorAccess";
+@@ -89,7 +89,7 @@
+ : "com/esotericsoftware/reflectasm/ConstructorAccess";
- ClassWriter cw = new ClassWriter(0);
-- cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, superclassNameInternal, null);
-+ cw.visit(V1_6, 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);
++ cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, superclassNameInternal, null);
- insertConstructor(cw, superclassNameInternal);
- insertNewInstance(cw, classNameInternal);
+ insertConstructor(cw, superclassNameInternal);
+ insertNewInstance(cw, classNameInternal);
--- a/src/com/esotericsoftware/reflectasm/FieldAccess.java
+++ b/src/com/esotericsoftware/reflectasm/FieldAccess.java
-@@ -148,7 +148,7 @@
- String classNameInternal = className.replace('.', '/');
+@@ -147,7 +147,7 @@
+ String classNameInternal = className.replace('.', '/');
- ClassWriter cw = new ClassWriter(0);
-- cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null,
-+ cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null,
- "com/esotericsoftware/reflectasm/FieldAccess", null);
- insertConstructor(cw);
- insertGetObject(cw, classNameInternal, fields);
+ ClassWriter cw = new ClassWriter(0);
+- cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, "com/esotericsoftware/reflectasm/FieldAccess",
++ cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, "com/esotericsoftware/reflectasm/FieldAccess",
+ null);
+ insertConstructor(cw);
+ insertGetObject(cw, classNameInternal, fields);
--- a/src/com/esotericsoftware/reflectasm/MethodAccess.java
+++ b/src/com/esotericsoftware/reflectasm/MethodAccess.java
-@@ -121,7 +121,7 @@
+@@ -120,7 +120,7 @@
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- MethodVisitor mv;
-- cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null,
-+ cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null,
- "com/esotericsoftware/reflectasm/MethodAccess", null);
- {
- mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+ MethodVisitor mv;
+- cw.visit(V1_1, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, "com/esotericsoftware/reflectasm/MethodAccess",
++ cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, accessClassNameInternal, null, "com/esotericsoftware/reflectasm/MethodAccess",
+ null);
+ {
+ mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
=====================================
debian/patches/javadoc.patch
=====================================
@@ -5,7 +5,7 @@ Last-Update: 2021-05-17
--- a/pom.xml
+++ b/pom.xml
-@@ -128,6 +128,11 @@
+@@ -131,6 +131,11 @@
</instructions>
</configuration>
</plugin>
=====================================
debian/patches/no_shading.patch
=====================================
@@ -5,8 +5,8 @@ Last-Update: 2021-05-17
--- a/pom.xml
+++ b/pom.xml
-@@ -93,7 +93,7 @@
- </excludes>
+@@ -95,7 +95,7 @@
+ </archive>
</configuration>
</plugin>
- <plugin>
@@ -14,7 +14,7 @@ Last-Update: 2021-05-17
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
-@@ -103,9 +103,9 @@
+@@ -105,9 +105,9 @@
<goals>
<goal>shade</goal>
</goals>
@@ -26,7 +26,7 @@ Last-Update: 2021-05-17
<shadedArtifactAttached>false</shadedArtifactAttached>
<relocations>
<relocation>
-@@ -116,7 +116,7 @@
+@@ -118,7 +118,7 @@
</configuration>
</execution>
</executions>
=====================================
debian/patches/series
=====================================
@@ -1,4 +1,4 @@
javadoc.patch
no_shading.patch
generate_1_6_classes.patch
-ignore_test_automatic_unloading.patch
+#ignore_test_automatic_unloading.patch
=====================================
debian/watch
=====================================
@@ -1,3 +1,3 @@
version=4
opts="repack,repacksuffix=+dfsg,compression=xz,dversionmangle=s/\+dfsg//" \
- https://github.com/EsotericSoftware/reflectasm/releases/latest (?:.*/)?(?:reflectasm-)?([\d\.]+).tar.gz
+ https://github.com/EsotericSoftware/reflectasm/tags (?:.*/)?(?:reflectasm-)?([\d\.]+).tar.gz
=====================================
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/-/compare/8f3858559c3d228407f2b0228a70394aa15c82f0...23667f4ca12bb2b131bf053e3ba62eb762f4f411
--
View it on GitLab: https://salsa.debian.org/java-team/libreflectasm-java/-/compare/8f3858559c3d228407f2b0228a70394aa15c82f0...23667f4ca12bb2b131bf053e3ba62eb762f4f411
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/d652d0cc/attachment.htm>
More information about the pkg-java-commits
mailing list