summaryrefslogtreecommitdiffstats
path: root/vm/analysis/DexVerify.c
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-02-10 15:43:57 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-02-10 15:43:57 -0800
commit5d709784bbf5001012d7f25172927d46f6c1abe1 (patch)
treea49c3dafdeed5037e5ad85aba23e5666b1faf57d /vm/analysis/DexVerify.c
parentbcd637a94f10b49d18b87a74a015f9d3453ed77a (diff)
downloadandroid_dalvik-5d709784bbf5001012d7f25172927d46f6c1abe1.tar.gz
android_dalvik-5d709784bbf5001012d7f25172927d46f6c1abe1.tar.bz2
android_dalvik-5d709784bbf5001012d7f25172927d46f6c1abe1.zip
auto import from //branches/cupcake/...@130745
Diffstat (limited to 'vm/analysis/DexVerify.c')
-rw-r--r--vm/analysis/DexVerify.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/vm/analysis/DexVerify.c b/vm/analysis/DexVerify.c
index 5a3e8bdad..354d68f11 100644
--- a/vm/analysis/DexVerify.c
+++ b/vm/analysis/DexVerify.c
@@ -527,15 +527,23 @@ static bool verifyInstructions(const Method* meth, InsnFlags* insnFlags,
{
const int insnCount = dvmGetMethodInsnsSize(meth);
const u2* insns = meth->insns;
- int i, width, offset, absOffset;
+ int i;
/* the start of the method is a "branch target" */
dvmInsnSetBranchTarget(insnFlags, 0, true);
for (i = 0; i < insnCount; /**/) {
- width = dvmInsnGetWidth(insnFlags, i);
+ static int gcMask = kInstrCanBranch | kInstrCanSwitch |
+ kInstrCanThrow | kInstrCanReturn;
+ int width = dvmInsnGetWidth(insnFlags, i);
+ OpCode opcode = *insns & 0xff;
+ InstructionFlags opFlags = dexGetInstrFlags(gDvm.instrFlags, opcode);
+ int offset, absOffset;
+
+ if ((opFlags & gcMask) != 0)
+ dvmInsnSetGcPoint(insnFlags, i, true);
- switch (*insns & 0xff) {
+ switch (opcode) {
case OP_NOP:
/* plain no-op or switch table data; nothing to do here */
break;