diff options
author | jeffhao <jeffhao@google.com> | 2011-02-15 14:41:45 -0800 |
---|---|---|
committer | jeffhao <jeffhao@google.com> | 2011-02-15 14:41:45 -0800 |
commit | 6b386bfb92ef6efe8f963270fc5a4b756fca225e (patch) | |
tree | d0bd0d2adf0b5b207cc466176c21292dffe6a4c1 /dx/src | |
parent | dda78f6b9b6823fb4dc4eb7aada45123e5d95b24 (diff) | |
download | android_dalvik-6b386bfb92ef6efe8f963270fc5a4b756fca225e.tar.gz android_dalvik-6b386bfb92ef6efe8f963270fc5a4b756fca225e.tar.bz2 android_dalvik-6b386bfb92ef6efe8f963270fc5a4b756fca225e.zip |
Fix for complex jsr nesting causing NullPointerException.
Happens when one jsr calls another that ultimates throws an exception.
The subroutine inliner assumes the return block of the first jsr is
reachable when it's not, causing access to a null field. Fixed by
checking the field for null before accessing it.
Change-Id: Id1fb376c9f14ffebc77cdbd253a713eb6d949c1f
Diffstat (limited to 'dx/src')
-rw-r--r-- | dx/src/com/android/dx/cf/code/BytecodeArray.java | 9 | ||||
-rw-r--r-- | dx/src/com/android/dx/cf/code/Ropper.java | 6 |
2 files changed, 12 insertions, 3 deletions
diff --git a/dx/src/com/android/dx/cf/code/BytecodeArray.java b/dx/src/com/android/dx/cf/code/BytecodeArray.java index 6ede25c87..f4ea007b9 100644 --- a/dx/src/com/android/dx/cf/code/BytecodeArray.java +++ b/dx/src/com/android/dx/cf/code/BytecodeArray.java @@ -1357,23 +1357,27 @@ public final class BytecodeArray { } /** {@inheritDoc} */ + @Override public void visitInvalid(int opcode, int offset, int length) { clear(); } /** {@inheritDoc} */ + @Override public void visitNoArgs(int opcode, int offset, int length, Type type) { clear(); } /** {@inheritDoc} */ + @Override public void visitLocal(int opcode, int offset, int length, int idx, Type type, int value) { clear(); } /** {@inheritDoc} */ + @Override public void visitConstant(int opcode, int offset, int length, Constant cst, int value) { this.cst = cst; @@ -1382,29 +1386,34 @@ public final class BytecodeArray { } /** {@inheritDoc} */ + @Override public void visitBranch(int opcode, int offset, int length, int target) { clear(); } /** {@inheritDoc} */ + @Override public void visitSwitch(int opcode, int offset, int length, SwitchList cases, int padding) { clear(); } /** {@inheritDoc} */ + @Override public void visitNewarray(int offset, int length, CstType type, ArrayList<Constant> initVals) { clear(); } /** {@inheritDoc} */ + @Override public void setPreviousOffset(int offset) { // Intentionally left empty } /** {@inheritDoc} */ + @Override public int getPreviousOffset() { // Intentionally left empty return -1; diff --git a/dx/src/com/android/dx/cf/code/Ropper.java b/dx/src/com/android/dx/cf/code/Ropper.java index 821716657..715cfd8e9 100644 --- a/dx/src/com/android/dx/cf/code/Ropper.java +++ b/dx/src/com/android/dx/cf/code/Ropper.java @@ -1427,7 +1427,7 @@ public final class Ropper { IntList.makeImmutable (newSubStartLabel), newSubStartLabel), labelToSubroutines.get(b.getLabel())); - } + } /** * Copies a basic block, mapping its successors along the way. @@ -1435,7 +1435,7 @@ public final class Ropper { * @param origLabel original block label * @param newLabel label that the new block should have */ - private void copyBlock(int origLabel, int newLabel) { + private void copyBlock(int origLabel, int newLabel) { BasicBlock origBlock = labelToBlock(origLabel); @@ -1515,7 +1515,7 @@ public final class Ropper { */ private boolean involvedInSubroutine(int label, int subroutineStart) { IntList subroutinesList = labelToSubroutines.get(label); - return (subroutinesList.size() > 0 + return (subroutinesList != null && subroutinesList.size() > 0 && subroutinesList.top() == subroutineStart); } |