diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:43:57 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:43:57 -0800 |
| commit | 5d709784bbf5001012d7f25172927d46f6c1abe1 (patch) | |
| tree | a49c3dafdeed5037e5ad85aba23e5666b1faf57d /vm/analysis/DexVerify.c | |
| parent | bcd637a94f10b49d18b87a74a015f9d3453ed77a (diff) | |
| download | android_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.c | 14 |
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; |
