diff options
author | acolyer <acolyer> | 2005-10-05 09:36:51 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2005-10-05 09:36:51 +0000 |
commit | 760ceb8deed44cdb6f0cb8624bfc5764f4a8037e (patch) | |
tree | 27990f41b1823cb1773cf577bd4820e26bbb8c3b /weaver/src | |
parent | 2b0e6755030eb378e612a00fcb80d7bdca2c55ee (diff) | |
download | aspectj-preDefaultReweavable.tar.gz aspectj-preDefaultReweavable.zip |
final part of fix for 100195 - local var debug info for inlined around advicepreDefaultReweavable
Diffstat (limited to 'weaver/src')
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java | 10 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/ShadowRange.java | 19 |
2 files changed, 28 insertions, 1 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java b/weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java index 109211329..14bb30acf 100644 --- a/weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java +++ b/weaver/src/org/aspectj/weaver/bcel/LocalVariableTag.java @@ -18,8 +18,9 @@ import org.aspectj.weaver.UnresolvedType; public final class LocalVariableTag extends Tag { private final UnresolvedType type; private final String name; - private final int slot; + private int slot; private final int startPos; + boolean remapped = false; // AMC - pr101047, two local vars with the same name can share the same slot, but must in that case // have different start positions. @@ -40,6 +41,13 @@ public final class LocalVariableTag extends Tag { return type; } + public void updateSlot(int newSlot) { + this.slot = newSlot; + this.remapped = true; + } + + public boolean isRemapped() { return this.remapped; } + // ---- from Object public String toString() { diff --git a/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java b/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java index b6381f9a7..7632c3e16 100644 --- a/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java +++ b/weaver/src/org/aspectj/weaver/bcel/ShadowRange.java @@ -175,6 +175,25 @@ final class ShadowRange extends Range { // System.err.println("JUST COPIED: " + oldIh.getInstruction().toString(freshMethod.getEnclosingClass().getConstantPoolGen().getConstantPool()) // + " INTO " + freshIh.getInstruction().toString(freshMethod.getEnclosingClass().getConstantPoolGen().getConstantPool())); } + + // now go through again and update variable slots that have been altered as a result + // of remapping... + for (InstructionHandle newIh = freshBody.getStart(); newIh != freshBody.getEnd(); newIh = newIh.getNext()) { + InstructionTargeter[] sources = newIh.getTargeters(); + if (sources != null) { + for (int i = sources.length - 1; i >= 0; i--) { + if (sources[i] instanceof LocalVariableTag) { + LocalVariableTag lvt = (LocalVariableTag) sources[i]; + if (!lvt.isRemapped() && remap.hasKey(lvt.getSlot())) { + lvt.updateSlot(remap.get(lvt.getSlot())); + } + } + } + } + } + + + // we've now copied out all the instructions. // now delete the instructions... we've already taken care of the damn |