Skip to content

Commit f08ce56

Browse files
committed
Fix *asm4 + asm3 to match *.asmx (due to recent SPI refactoring)
1 parent 5360770 commit f08ce56

20 files changed

+556
-276
lines changed

net.tascalate.javaflow.providers.asm3/src/main/java/org/apache/commons/javaflow/providers/asm3/Asm3ResourceTransformationFactory.java

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,61 @@
1515
*/
1616
package org.apache.commons.javaflow.providers.asm3;
1717

18-
import java.util.Map;
19-
import java.util.WeakHashMap;
18+
import java.io.IOException;
2019

20+
import org.apache.commons.javaflow.spi.Cache;
21+
import org.apache.commons.javaflow.spi.ClassMatcher;
22+
import org.apache.commons.javaflow.spi.ClassMatchers;
2123
import org.apache.commons.javaflow.spi.ContinuableClassInfoResolver;
2224
import org.apache.commons.javaflow.spi.ResourceLoader;
2325
import org.apache.commons.javaflow.spi.ResourceTransformationFactory;
2426
import org.apache.commons.javaflow.spi.ResourceTransformer;
27+
import org.apache.commons.javaflow.spi.VetoableResourceLoader;
28+
29+
import org.objectweb.asm.ClassReader;
2530

2631
public class Asm3ResourceTransformationFactory implements ResourceTransformationFactory {
2732

28-
public ResourceTransformer createTransformer(ContinuableClassInfoResolver cciResolver) {
29-
return new Asm3ClassTransformer(getOrCreateClassHierarchy(cciResolver), cciResolver);
33+
public ResourceTransformer createTransformer(ResourceLoader resourceLoader) {
34+
SharedContinuableClassInfos cciShared = CACHED_SHARED_CCI.get(resourceLoader);
35+
return new ContinuableClassTransformer(
36+
// Actualize ClassHierarchy per resource loader
37+
cciShared.hierarchy().shareWith(resourceLoader),
38+
new IContinuableClassInfoResolver(resourceLoader, cciShared)
39+
);
3040
}
3141

3242
public ContinuableClassInfoResolver createResolver(ResourceLoader resourceLoader) {
33-
return new Asm3ContinuableClassInfoResolver(resourceLoader);
43+
return new IContinuableClassInfoResolver(
44+
resourceLoader,
45+
CACHED_SHARED_CCI.get(resourceLoader)
46+
);
3447
}
3548

36-
private static ClassHierarchy getOrCreateClassHierarchy(ContinuableClassInfoResolver cciResolver) {
37-
ClassHierarchy result;
38-
ResourceLoader loader = cciResolver.resourceLoader();
39-
synchronized (CACHED_CLASS_HIERARCHY) {
40-
result = CACHED_CLASS_HIERARCHY.get(loader);
41-
if (null == result) {
42-
result = new ClassHierarchy(loader);
43-
CACHED_CLASS_HIERARCHY.put(loader, result);
49+
public String readClassName(byte[] classBytes) {
50+
return new ClassReader(classBytes).getClassName();
51+
}
52+
53+
static ClassMatcher createVeto(ResourceLoader resourceLoader) {
54+
if (resourceLoader instanceof VetoableResourceLoader) {
55+
try {
56+
return ((VetoableResourceLoader)resourceLoader).createVeto();
57+
} catch (IOException ex) {
58+
throw new RuntimeException(ex);
4459
}
60+
} else {
61+
return ClassMatchers.MATCH_NONE;
4562
}
46-
return result;
4763
}
4864

49-
private static final Map<ResourceLoader, ClassHierarchy> CACHED_CLASS_HIERARCHY =
50-
new WeakHashMap<ResourceLoader, ClassHierarchy>();
65+
private static final Cache<ResourceLoader, SharedContinuableClassInfos> CACHED_SHARED_CCI =
66+
new Cache<ResourceLoader, SharedContinuableClassInfos>() {
67+
@Override
68+
protected SharedContinuableClassInfos createValue(ResourceLoader loader) {
69+
return new SharedContinuableClassInfos(
70+
new ClassHierarchy(loader), createVeto(loader)
71+
);
72+
}
73+
};
5174

5275
}

net.tascalate.javaflow.providers.asm3/src/main/java/org/apache/commons/javaflow/providers/asm3/ClassHierarchy.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,34 @@
4747
public class ClassHierarchy {
4848

4949
private final ResourceLoader loader;
50-
private final Map<Key, String> lookupCache = new HashMap<Key, String>();
51-
private final Map<TypeInfo, Reference<TypeInfo>> typesCache
52-
= new WeakHashMap<TypeInfo, Reference<TypeInfo>>();
50+
private final Map<Key, String> lookupCache;
51+
private final Map<TypeInfo, Reference<TypeInfo>> typesCache;
5352

5453
public ClassHierarchy(ResourceLoader loader) {
5554
this.loader = loader;
55+
this.lookupCache = new HashMap<Key, String>();
56+
this.typesCache = new WeakHashMap<TypeInfo, Reference<TypeInfo>>();
5657
// Next will never be removed from the cache
5758
// while there is a hard-reference
5859
for (TypeInfo ti : SPECIAL_CLASSES) {
5960
typesCache.put(ti, new SoftReference<TypeInfo>(ti));
6061
}
6162
}
63+
64+
private ClassHierarchy(ResourceLoader loader,
65+
Map<Key, String> lookupCache,
66+
Map<TypeInfo, Reference<TypeInfo>> typesCache) {
67+
this.loader = loader;
68+
this.lookupCache = lookupCache;
69+
this.typesCache = typesCache;
70+
}
71+
72+
public ClassHierarchy shareWith(ResourceLoader resourceLoader) {
73+
if (resourceLoader == this.loader) {
74+
return this;
75+
}
76+
return new ClassHierarchy(resourceLoader, lookupCache, typesCache);
77+
}
6278

6379
public boolean isSubClass(String type1, String type2) {
6480
String commonSuperClass = getCommonSuperClass(type1, type2);
Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,35 +23,36 @@
2323
*/
2424
package org.apache.commons.javaflow.providers.asm3;
2525

26-
import org.objectweb.asm.ClassReader;
27-
import org.objectweb.asm.ClassWriter;
26+
import java.util.Collection;
2827

29-
import org.apache.commons.javaflow.spi.ContinuableClassInfoResolver;
30-
import org.apache.commons.javaflow.spi.ResourceTransformer;
28+
import org.apache.commons.javaflow.spi.AbstractResourceTransformer;
3129
import org.apache.commons.javaflow.spi.StopException;
3230

31+
import org.objectweb.asm.ClassReader;
32+
import org.objectweb.asm.ClassWriter;
3333
/**
3434
* AsmClassTransformer
3535
*
3636
* @author Eugene Kuleshov
3737
*/
38-
class Asm3ClassTransformer implements ResourceTransformer {
38+
class ContinuableClassTransformer extends AbstractResourceTransformer {
3939

4040
private final ClassHierarchy classHierarchy;
41-
private final ContinuableClassInfoResolver cciResolver;
41+
private final IContinuableClassInfoResolver cciResolver;
4242

43-
Asm3ClassTransformer(ClassHierarchy classHierarchy, ContinuableClassInfoResolver cciResolver) {
43+
ContinuableClassTransformer(ClassHierarchy classHierarchy, IContinuableClassInfoResolver cciResolver) {
4444
this.classHierarchy = classHierarchy;
4545
this.cciResolver = cciResolver;
4646
}
4747

48-
public byte[] transform(byte[] original) {
48+
public byte[] transform(byte[] original, Collection<String> retransformClasses) {
4949
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES) {
5050
@Override
5151
protected String getCommonSuperClass(final String type1, final String type2) {
5252
return classHierarchy.getCommonSuperClass(type1, type2);
5353
}
5454
};
55+
cciResolver.reset(retransformClasses);
5556
ContinuableClassVisitor visitor = new ContinuableClassVisitor(
5657
cw /* BytecodeDebugUtils.decorateClassVisitor(cw, true, * System.err) -- DUMP*/,
5758
classHierarchy,
@@ -73,4 +74,8 @@ protected String getCommonSuperClass(final String type1, final String type2) {
7374
// BytecodeDebugUtils.dumpClass(bytecode);
7475
return bytecode;
7576
}
77+
78+
public void release() {
79+
cciResolver.release();
80+
}
7681
}

net.tascalate.javaflow.providers.asm3/src/main/java/org/apache/commons/javaflow/providers/asm3/ContinuableClassVisitor.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
import org.objectweb.asm.MethodVisitor;
3030
import org.objectweb.asm.Opcodes;
3131

32-
import org.apache.commons.javaflow.spi.ContinuableClassInfo;
33-
import org.apache.commons.javaflow.spi.ContinuableClassInfoResolver;
3432
import org.apache.commons.javaflow.spi.StopException;
3533

3634
/**
@@ -41,16 +39,16 @@
4139
class ContinuableClassVisitor extends ClassAdapter {
4240

4341
private final ClassHierarchy classHierarchy;
44-
private final ContinuableClassInfoResolver cciResolver;
42+
private final IContinuableClassInfoResolver cciResolver;
4543
private final byte[] originalBytes;
4644

4745
private String className;
48-
private ContinuableClassInfo classInfo;
46+
private IContinuableClassInfo classInfo;
4947
private boolean skipEnchancing = false;
5048

5149
ContinuableClassVisitor(ClassVisitor cv,
5250
ClassHierarchy classHierarchy,
53-
ContinuableClassInfoResolver cciResolver,
51+
IContinuableClassInfoResolver cciResolver,
5452
byte[] originalBytes) {
5553
super(cv);
5654
this.classHierarchy = classHierarchy;
@@ -67,7 +65,7 @@ public void visit(int version, int access, String name, String signature, String
6765
className = name;
6866
classInfo = cciResolver.resolve(name, originalBytes);
6967

70-
if (null == classInfo ||
68+
if (null == classInfo ||
7169
classInfo.isClassProcessed() ||
7270
cciResolver.veto().matches(name, signature, superName, interfaces)) {
7371
skipEnchancing = true;

net.tascalate.javaflow.providers.asm3/src/main/java/org/apache/commons/javaflow/providers/asm3/ContinuableMethodNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class ContinuableMethodNode extends MethodNode implements Opcodes {
7171
ClassHierarchy classHierarchy,
7272
ContinuableClassInfoResolver cciResolver,
7373
MethodVisitor mv) {
74+
7475
super(access, name, desc, signature, exceptions);
7576
this.className = className;
7677
this.classHierarchy = classHierarchy;
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@
1919

2020
import org.apache.commons.javaflow.spi.ContinuableClassInfo;
2121

22-
class ContinuableClassInfoInternal implements ContinuableClassInfo {
22+
class IContinuableClassInfo implements ContinuableClassInfo {
2323
private boolean processed;
2424
private final Set<String> methods;
2525

26-
ContinuableClassInfoInternal(boolean defaultProcessed, Set<String> methods) {
26+
IContinuableClassInfo(boolean defaultProcessed, Set<String> methods) {
2727
this.processed = defaultProcessed;
2828
this.methods = methods;
2929
}
30+
31+
public boolean isContinuableMethod(int access, String name, String desc, String signature) {
32+
return methods.contains(name + desc);
33+
}
3034

31-
public boolean isClassProcessed() {
35+
boolean isClassProcessed() {
3236
return processed;
3337
}
3438

35-
public void markClassProcessed() {
39+
void markClassProcessed() {
3640
processed = true;
3741
}
3842

39-
public boolean isContinuableMethod(int access, String name, String desc, String signature) {
40-
return methods.contains(name + desc);
41-
}
42-
4343
Set<String> continuableMethods() {
4444
return methods;
4545
}

0 commit comments

Comments
 (0)