Tracking ASM 5.0.4 development: Fix for ASM issue 317545
Issue: SPR-12470
This commit is contained in:
parent
a6e7044523
commit
ab5856b6a8
|
@ -1173,7 +1173,14 @@ public class ClassReader {
|
||||||
if (labels[label] == null) {
|
if (labels[label] == null) {
|
||||||
readLabel(label, labels).status |= Label.DEBUG;
|
readLabel(label, labels).status |= Label.DEBUG;
|
||||||
}
|
}
|
||||||
labels[label].line = readUnsignedShort(v + 12);
|
Label l = labels[label];
|
||||||
|
while (l.line > 0) {
|
||||||
|
if (l.next == null) {
|
||||||
|
l.next = new Label();
|
||||||
|
}
|
||||||
|
l = l.next;
|
||||||
|
}
|
||||||
|
l.line = readUnsignedShort(v + 12);
|
||||||
v += 4;
|
v += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1288,9 +1295,15 @@ public class ClassReader {
|
||||||
// visits the label and line number for this offset, if any
|
// visits the label and line number for this offset, if any
|
||||||
Label l = labels[offset];
|
Label l = labels[offset];
|
||||||
if (l != null) {
|
if (l != null) {
|
||||||
|
Label next = l.next;
|
||||||
|
l.next = null;
|
||||||
mv.visitLabel(l);
|
mv.visitLabel(l);
|
||||||
if ((context.flags & SKIP_DEBUG) == 0 && l.line > 0) {
|
if ((context.flags & SKIP_DEBUG) == 0 && l.line > 0) {
|
||||||
mv.visitLineNumber(l.line, l);
|
mv.visitLineNumber(l.line, l);
|
||||||
|
while (next != null) {
|
||||||
|
mv.visitLineNumber(next.line, l);
|
||||||
|
next = next.next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,11 @@ public class Label {
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The line number corresponding to this label, if known.
|
* The line number corresponding to this label, if known. If there are
|
||||||
|
* several lines, each line is stored in a separate label, all linked via
|
||||||
|
* their next field (these links are created in ClassReader and removed just
|
||||||
|
* before visitLabel is called, so that this does not impact the rest of the
|
||||||
|
* code).
|
||||||
*/
|
*/
|
||||||
int line;
|
int line;
|
||||||
|
|
||||||
|
@ -154,7 +158,7 @@ public class Label {
|
||||||
* indicates if this reference uses 2 or 4 bytes, and its absolute value
|
* indicates if this reference uses 2 or 4 bytes, and its absolute value
|
||||||
* gives the position of the bytecode instruction. This array is also used
|
* gives the position of the bytecode instruction. This array is also used
|
||||||
* as a bitset to store the subroutines to which a basic block belongs. This
|
* as a bitset to store the subroutines to which a basic block belongs. This
|
||||||
* information is needed in {@linked MethodWriter#visitMaxs}, after all
|
* information is needed in {@link MethodWriter#visitMaxs}, after all
|
||||||
* forward references have been resolved. Hence the same array can be used
|
* forward references have been resolved. Hence the same array can be used
|
||||||
* for both purposes without problems.
|
* for both purposes without problems.
|
||||||
*/
|
*/
|
||||||
|
@ -239,7 +243,8 @@ public class Label {
|
||||||
* The next basic block in the basic block stack. This stack is used in the
|
* The next basic block in the basic block stack. This stack is used in the
|
||||||
* main loop of the fix point algorithm used in the second step of the
|
* main loop of the fix point algorithm used in the second step of the
|
||||||
* control flow analysis algorithms. It is also used in
|
* control flow analysis algorithms. It is also used in
|
||||||
* {@link #visitSubroutine} to avoid using a recursive method.
|
* {@link #visitSubroutine} to avoid using a recursive method, and in
|
||||||
|
* ClassReader to temporarily store multiple source lines for a label.
|
||||||
*
|
*
|
||||||
* @see MethodWriter#visitMaxs
|
* @see MethodWriter#visitMaxs
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue