diff options
author | Stephan Herrmann | 2014-09-09 19:07:12 +0000 |
---|---|---|
committer | Stephan Herrmann | 2014-09-09 19:07:12 +0000 |
commit | 62c97a87c2f975a85b07ac7fd89d1a9f6044b124 (patch) | |
tree | 3194ec8df4e0a46a0b57648f7c84ac90bfe71ec7 | |
parent | 3037f2d92d5a64a072acc1bf789bc8a387498614 (diff) | |
download | org.eclipse.objectteams-62c97a87c2f975a85b07ac7fd89d1a9f6044b124.tar.gz org.eclipse.objectteams-62c97a87c2f975a85b07ac7fd89d1a9f6044b124.tar.xz org.eclipse.objectteams-62c97a87c2f975a85b07ac7fd89d1a9f6044b124.zip |
Bug 443642 - [otdre] Failure to detect all base classes during class
scanning
2 files changed, 27 insertions, 0 deletions
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java index 01875403f..10e74bd72 100644 --- a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java +++ b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java @@ -21,6 +21,7 @@ import java.util.HashSet; import org.eclipse.objectteams.otredyn.bytecode.Binding;
import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.CallinBindingsAttribute;
import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.OTClassFlagsAttribute;
+import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.RoleBaseBindingsAttribute;
import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.CallinBindingsAttribute.MultiBinding;
import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.CallinPrecedenceAttribute;
import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.OTSpecialAccessAttribute;
@@ -122,6 +123,9 @@ class AsmClassVisitor extends ClassVisitor { clazz.setOTClassFlags(((OTClassFlagsAttribute)attribute).flags);
} else if (attribute.type.equals(Attributes.ATTRIBUTE_OT_SPECIAL_ACCESS)) {
((OTSpecialAccessAttribute)attribute).registerAt(clazz);
+ } else if (attribute.type.equals(Attributes.ATTRIBUTE_ROLE_BASE_BINDINGS)) {
+ for (String base : ((RoleBaseBindingsAttribute) attribute).bases)
+ clazz.boundBaseClasses.add(base.replace('/', '.'));
}
}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/Attributes.java b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/Attributes.java index 35ea8bb68..031df641f 100644 --- a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/Attributes.java +++ b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/Attributes.java @@ -35,6 +35,7 @@ import org.objectweb.asm.Label; */
abstract class Attributes {
protected final static String ATTRIBUTE_OT_DYN_CALLIN_BINDINGS="OTDynCallinBindings";
+ protected final static String ATTRIBUTE_ROLE_BASE_BINDINGS = "CallinRoleBaseBindings";
protected final static String ATTRIBUTE_CALLIN_PRECEDENCE = "CallinPrecedence";
protected final static String ATTRIBUTE_OT_CLASS_FLAGS = "OTClassFlags";
protected final static String ATTRIBUTE_OT_SPECIAL_ACCESS = "OTSpecialAccess";
@@ -44,6 +45,7 @@ abstract class Attributes { protected final static Attribute[] attributes = {
new CallinBindingsAttribute(0),
+ new RoleBaseBindingsAttribute(0),
new CallinPrecedenceAttribute(0),
new OTClassFlagsAttribute(0),
new OTSpecialAccessAttribute(),
@@ -216,6 +218,27 @@ abstract class Attributes { return buf.toString();
}
}
+ protected static class RoleBaseBindingsAttribute extends Attribute {
+ String[] roles;
+ String[] bases;
+ protected RoleBaseBindingsAttribute(int elementCount) {
+ super(ATTRIBUTE_ROLE_BASE_BINDINGS);
+ roles = new String[elementCount];
+ bases = new String[elementCount];
+ }
+ @Override
+ protected Attribute read(ClassReader cr, int off, int len,
+ char[] buf, int codeOff, Label[] labels)
+ {
+ int elementCount = cr.readShort(off); off += 2;
+ RoleBaseBindingsAttribute attr = new RoleBaseBindingsAttribute(elementCount);
+ for (int i = 0; i < elementCount; i++) {
+ attr.roles[i] = cr.readUTF8(off, buf); off += 2;
+ attr.bases[i] = cr.readUTF8(off, buf); off += 2;
+ }
+ return attr;
+ }
+ }
protected static class CallinPrecedenceAttribute extends Attribute {
String[] labels;
public CallinPrecedenceAttribute(int elementCount) {
|