You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2021/11/27 10:36:17 UTC
[ws-axiom] branch master updated: Add API for the weaver to provide more information to code generators
This is an automated email from the ASF dual-hosted git repository.
veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git
The following commit(s) were added to refs/heads/master by this push:
new aa2743d Add API for the weaver to provide more information to code generators
aa2743d is described below
commit aa2743d724d531963cd5717cf718dab0fbbf3fa9
Author: Andreas Veithen <an...@gmail.com>
AuthorDate: Sat Nov 27 10:35:52 2021 +0000
Add API for the weaver to provide more information to code generators
---
.../weaver/ImplementationClassDefinition.java | 13 +++++++----
.../apache/axiom/weaver/ImplementationNode.java | 10 ++++----
.../MethodBody.java => TargetContextImpl.java} | 27 +++++++++++++++-------
.../main/java/org/apache/axiom/weaver/Weaver.java | 5 ++--
.../MethodBody.java => WeavingContextImpl.java} | 21 ++++++++++-------
.../{MethodBody.java => DummyTargetContext.java} | 18 +++++++++------
...xinInnerClass.java => DummyWeavingContext.java} | 11 +++++++--
.../org/apache/axiom/weaver/mixin/MethodBody.java | 4 ++--
.../java/org/apache/axiom/weaver/mixin/Mixin.java | 8 ++++---
.../apache/axiom/weaver/mixin/MixinInnerClass.java | 2 +-
.../org/apache/axiom/weaver/mixin/MixinMethod.java | 4 ++--
.../{MixinInnerClass.java => TargetContext.java} | 6 +++--
.../{MixinInnerClass.java => WeavingContext.java} | 4 ++--
.../weaver/mixin/clazz/MixinClassVisitor.java | 11 +++++----
14 files changed, 92 insertions(+), 52 deletions(-)
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java
index b8236b7..a9823bb 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationClassDefinition.java
@@ -28,12 +28,14 @@ import org.apache.axiom.weaver.mixin.InitializerMethod;
import org.apache.axiom.weaver.mixin.Mixin;
import org.apache.axiom.weaver.mixin.MixinMethod;
import org.apache.axiom.weaver.mixin.StaticInitializerMethod;
+import org.apache.axiom.weaver.mixin.TargetContext;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
final class ImplementationClassDefinition extends ClassDefinition {
+ private final TargetContext targetContext;
private final int version;
private final int access;
private final String superName;
@@ -44,13 +46,14 @@ final class ImplementationClassDefinition extends ClassDefinition {
private final List<Named<StaticInitializerMethod>> staticInitializerMethods = new ArrayList<>();
ImplementationClassDefinition(
+ TargetContext targetContext,
int version,
int access,
- String className,
String superName,
String[] ifaceNames,
Mixin[] mixins) {
- super(className);
+ super(targetContext.getTargetClassName());
+ this.targetContext = targetContext;
this.version = version;
this.access = access;
this.superName = superName != null ? superName : Type.getInternalName(Object.class);
@@ -135,7 +138,7 @@ final class ImplementationClassDefinition extends ClassDefinition {
MethodVisitor mv =
cv.visitMethod(Opcodes.ACC_PRIVATE, method.getName(), "()V", null, null);
if (mv != null) {
- method.get().getBody().apply(className, mv);
+ method.get().getBody().apply(targetContext, mv);
}
}
for (Named<StaticInitializerMethod> method : staticInitializerMethods) {
@@ -147,11 +150,11 @@ final class ImplementationClassDefinition extends ClassDefinition {
null,
null);
if (mv != null) {
- method.get().getBody().apply(className, mv);
+ method.get().getBody().apply(targetContext, mv);
}
}
for (MixinMethod method : methods) {
- method.apply(className, cv);
+ method.apply(targetContext, cv);
}
cv.visitEnd();
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java
index 7f918c2..2b95690 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/ImplementationNode.java
@@ -27,6 +27,8 @@ import java.util.function.Supplier;
import org.apache.axiom.weaver.mixin.ClassDefinition;
import org.apache.axiom.weaver.mixin.Mixin;
+import org.apache.axiom.weaver.mixin.TargetContext;
+import org.apache.axiom.weaver.mixin.WeavingContext;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
@@ -322,9 +324,9 @@ final class ImplementationNode {
return builder.toString();
}
- List<ClassDefinition> toClassDefinitions() {
+ List<ClassDefinition> toClassDefinitions(WeavingContext weavingContext) {
List<ClassDefinition> classDefinitions = new ArrayList<>();
- String className = getClassName();
+ TargetContext targetContext = new TargetContextImpl(weavingContext, getClassName());
int version = 0;
List<Mixin> mixins = new ArrayList<>();
for (MixinNode mixinNode : this.mixins) {
@@ -334,7 +336,7 @@ final class ImplementationNode {
} else if (mixin.getBytecodeVersion() != version) {
throw new WeaverException("Inconsistent bytecode versions");
}
- classDefinitions.addAll(mixin.createInnerClassDefinitions(className));
+ classDefinitions.addAll(mixin.createInnerClassDefinitions(targetContext));
mixins.add(mixin);
}
if (version == 0) {
@@ -353,9 +355,9 @@ final class ImplementationNode {
}
classDefinitions.add(
new ImplementationClassDefinition(
+ targetContext,
version,
access,
- className,
parents.isEmpty() ? null : parents.iterator().next().getClassName(),
ifaceNames.toArray(new String[ifaceNames.size()]),
mixins.toArray(new Mixin[mixins.size()])));
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/TargetContextImpl.java
similarity index 55%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/TargetContextImpl.java
index 0f11bdd..00dddef 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/TargetContextImpl.java
@@ -16,16 +16,27 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.axiom.weaver.mixin;
+package org.apache.axiom.weaver;
-import org.objectweb.asm.MethodVisitor;
+import org.apache.axiom.weaver.mixin.TargetContext;
+import org.apache.axiom.weaver.mixin.WeavingContext;
-public abstract class MethodBody {
- public abstract void apply(String targetClassName, MethodVisitor mv);
+final class TargetContextImpl implements TargetContext {
+ private final WeavingContext weavingContext;
+ private final String targetClassName;
- public final int getWeight() {
- Counter counter = new Counter();
- apply("Dummy", new WeighingMethodVisitor(counter));
- return counter.get();
+ TargetContextImpl(WeavingContext weavingContext, String targetClassName) {
+ this.weavingContext = weavingContext;
+ this.targetClassName = targetClassName;
+ }
+
+ @Override
+ public WeavingContext getWeavingContext() {
+ return weavingContext;
+ }
+
+ @Override
+ public String getTargetClassName() {
+ return targetClassName;
}
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java
index 622806f..f9e293b 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/Weaver.java
@@ -27,6 +27,7 @@ import java.util.Set;
import org.apache.axiom.weaver.mixin.ClassDefinition;
import org.apache.axiom.weaver.mixin.Mixin;
+import org.apache.axiom.weaver.mixin.WeavingContext;
import org.apache.axiom.weaver.mixin.clazz.MixinFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -187,11 +188,11 @@ public final class Weaver {
implementationNodes.iterator().next().getClassName());
}
});
- log.debug(implementationClassNames);
+ WeavingContext context = new WeavingContextImpl(implementationClassNames);
List<ClassDefinition> result = new ArrayList<>();
for (ImplementationNode node : nodes) {
- result.addAll(node.toClassDefinitions());
+ result.addAll(node.toClassDefinitions(context));
}
return result.toArray(new ClassDefinition[result.size()]);
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/WeavingContextImpl.java
similarity index 61%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/WeavingContextImpl.java
index 0f11bdd..cc7352e 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/WeavingContextImpl.java
@@ -16,16 +16,21 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.axiom.weaver.mixin;
+package org.apache.axiom.weaver;
-import org.objectweb.asm.MethodVisitor;
+import java.util.Map;
-public abstract class MethodBody {
- public abstract void apply(String targetClassName, MethodVisitor mv);
+import org.apache.axiom.weaver.mixin.WeavingContext;
- public final int getWeight() {
- Counter counter = new Counter();
- apply("Dummy", new WeighingMethodVisitor(counter));
- return counter.get();
+final class WeavingContextImpl implements WeavingContext {
+ private final Map<Class<?>, String> implementationClassNames;
+
+ WeavingContextImpl(Map<Class<?>, String> implementationClassNames) {
+ this.implementationClassNames = implementationClassNames;
+ }
+
+ @Override
+ public String getImplementationClassName(Class<?> iface) {
+ return implementationClassNames.get(iface);
}
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyTargetContext.java
similarity index 70%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyTargetContext.java
index 0f11bdd..6d63ddb 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyTargetContext.java
@@ -18,14 +18,18 @@
*/
package org.apache.axiom.weaver.mixin;
-import org.objectweb.asm.MethodVisitor;
+final class DummyTargetContext implements TargetContext {
+ static final DummyTargetContext INSTANCE = new DummyTargetContext();
-public abstract class MethodBody {
- public abstract void apply(String targetClassName, MethodVisitor mv);
+ private DummyTargetContext() {}
- public final int getWeight() {
- Counter counter = new Counter();
- apply("Dummy", new WeighingMethodVisitor(counter));
- return counter.get();
+ @Override
+ public WeavingContext getWeavingContext() {
+ return DummyWeavingContext.INSTANCE;
+ }
+
+ @Override
+ public String getTargetClassName() {
+ return "Dummy";
}
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyWeavingContext.java
similarity index 75%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyWeavingContext.java
index 0a36ecf..bc0ac2d 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/DummyWeavingContext.java
@@ -18,6 +18,13 @@
*/
package org.apache.axiom.weaver.mixin;
-public abstract class MixinInnerClass {
- public abstract ClassDefinition createClassDefinition(String targetClassName);
+final class DummyWeavingContext implements WeavingContext {
+ static final DummyWeavingContext INSTANCE = new DummyWeavingContext();
+
+ private DummyWeavingContext() {}
+
+ @Override
+ public String getImplementationClassName(Class<?> iface) {
+ return "Dummy";
+ }
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
index 0f11bdd..5f23c0d 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MethodBody.java
@@ -21,11 +21,11 @@ package org.apache.axiom.weaver.mixin;
import org.objectweb.asm.MethodVisitor;
public abstract class MethodBody {
- public abstract void apply(String targetClassName, MethodVisitor mv);
+ public abstract void apply(TargetContext context, MethodVisitor mv);
public final int getWeight() {
Counter counter = new Counter();
- apply("Dummy", new WeighingMethodVisitor(counter));
+ apply(DummyTargetContext.INSTANCE, new WeighingMethodVisitor(counter));
return counter.get();
}
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java
index b051813..2e5432f 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/Mixin.java
@@ -67,7 +67,9 @@ public final class Mixin {
}
for (MixinInnerClass innerClass : innerClasses) {
Counter counter = new Counter();
- innerClass.createClassDefinition("Dummy").accept(new WeighingClassVisitor(counter));
+ innerClass
+ .createClassDefinition(DummyTargetContext.INSTANCE)
+ .accept(new WeighingClassVisitor(counter));
weight += counter.get();
}
this.weight = weight;
@@ -111,10 +113,10 @@ public final class Mixin {
return staticInitializerMethod;
}
- public List<ClassDefinition> createInnerClassDefinitions(String targetClassName) {
+ public List<ClassDefinition> createInnerClassDefinitions(TargetContext targetContext) {
List<ClassDefinition> classDefinitions = new ArrayList<>();
for (MixinInnerClass innerClass : innerClasses) {
- classDefinitions.add(innerClass.createClassDefinition(targetClassName));
+ classDefinitions.add(innerClass.createClassDefinition(targetContext));
}
return classDefinitions;
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
index 0a36ecf..994ec95 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
@@ -19,5 +19,5 @@
package org.apache.axiom.weaver.mixin;
public abstract class MixinInnerClass {
- public abstract ClassDefinition createClassDefinition(String targetClassName);
+ public abstract ClassDefinition createClassDefinition(TargetContext context);
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java
index 0495824..d67c7d3 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinMethod.java
@@ -60,10 +60,10 @@ public final class MixinMethod {
return body;
}
- public void apply(String targetClassName, ClassVisitor cv) {
+ public void apply(TargetContext context, ClassVisitor cv) {
MethodVisitor mv = cv.visitMethod(access, name, descriptor, signature, exceptions);
if (mv != null) {
- body.apply(targetClassName, mv);
+ body.apply(context, mv);
}
}
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/TargetContext.java
similarity index 87%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/TargetContext.java
index 0a36ecf..82f477c 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/TargetContext.java
@@ -18,6 +18,8 @@
*/
package org.apache.axiom.weaver.mixin;
-public abstract class MixinInnerClass {
- public abstract ClassDefinition createClassDefinition(String targetClassName);
+public interface TargetContext {
+ WeavingContext getWeavingContext();
+
+ String getTargetClassName();
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/WeavingContext.java
similarity index 87%
copy from axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
copy to axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/WeavingContext.java
index 0a36ecf..5daaeb5 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/MixinInnerClass.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/WeavingContext.java
@@ -18,6 +18,6 @@
*/
package org.apache.axiom.weaver.mixin;
-public abstract class MixinInnerClass {
- public abstract ClassDefinition createClassDefinition(String targetClassName);
+public interface WeavingContext {
+ String getImplementationClassName(Class<?> iface);
}
diff --git a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
index a608928..419741f 100644
--- a/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
+++ b/axiom-weaver/src/main/java/org/apache/axiom/weaver/mixin/clazz/MixinClassVisitor.java
@@ -30,6 +30,7 @@ import org.apache.axiom.weaver.mixin.Mixin;
import org.apache.axiom.weaver.mixin.MixinInnerClass;
import org.apache.axiom.weaver.mixin.MixinMethod;
import org.apache.axiom.weaver.mixin.StaticInitializerMethod;
+import org.apache.axiom.weaver.mixin.TargetContext;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
@@ -123,9 +124,10 @@ final class MixinClassVisitor extends ClassVisitor {
MethodBody body =
new MethodBody() {
@Override
- public void apply(String targetClassName, MethodVisitor mv) {
+ public void apply(TargetContext context, MethodVisitor mv) {
method.accept(
- new MethodRemapper(mv, remapperFactory.apply(targetClassName)));
+ new MethodRemapper(
+ mv, remapperFactory.apply(context.getTargetClassName())));
}
};
if (name.equals("<init>")) {
@@ -155,8 +157,9 @@ final class MixinClassVisitor extends ClassVisitor {
innerClasses.add(
new MixinInnerClass() {
@Override
- public ClassDefinition createClassDefinition(String targetClassName) {
- Remapper remapper = remapperFactory.apply(targetClassName);
+ public ClassDefinition createClassDefinition(TargetContext targetContext) {
+ Remapper remapper =
+ remapperFactory.apply(targetContext.getTargetClassName());
return new ClassDefinition(remapper.map(innerClass.name)) {
@Override
public void accept(ClassVisitor cv) {