diff options
Diffstat (limited to 'libdex/InstrUtils.c')
-rw-r--r-- | libdex/InstrUtils.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/libdex/InstrUtils.c b/libdex/InstrUtils.c index 33c7e7ddc..b58e647e3 100644 --- a/libdex/InstrUtils.c +++ b/libdex/InstrUtils.c @@ -539,16 +539,6 @@ InstructionFlags* dexCreateInstrFlagsTable(void) case OP_SPUT_SHORT: case OP_SPUT_WIDE: case OP_SPUT_OBJECT: - case OP_INVOKE_VIRTUAL: - case OP_INVOKE_VIRTUAL_RANGE: - case OP_INVOKE_SUPER: - case OP_INVOKE_SUPER_RANGE: - case OP_INVOKE_DIRECT: - case OP_INVOKE_DIRECT_RANGE: - case OP_INVOKE_STATIC: - case OP_INVOKE_STATIC_RANGE: - case OP_INVOKE_INTERFACE: - case OP_INVOKE_INTERFACE_RANGE: case OP_DIV_INT: case OP_REM_INT: case OP_DIV_LONG: @@ -564,6 +554,19 @@ InstructionFlags* dexCreateInstrFlagsTable(void) flags = kInstrCanContinue | kInstrCanThrow; break; + case OP_INVOKE_VIRTUAL: + case OP_INVOKE_VIRTUAL_RANGE: + case OP_INVOKE_SUPER: + case OP_INVOKE_SUPER_RANGE: + case OP_INVOKE_DIRECT: + case OP_INVOKE_DIRECT_RANGE: + case OP_INVOKE_STATIC: + case OP_INVOKE_STATIC_RANGE: + case OP_INVOKE_INTERFACE: + case OP_INVOKE_INTERFACE_RANGE: + flags = kInstrCanContinue | kInstrCanThrow | kInstrInvoke; + break; + case OP_RETURN_VOID: case OP_RETURN: case OP_RETURN_WIDE: @@ -579,7 +582,7 @@ InstructionFlags* dexCreateInstrFlagsTable(void) case OP_GOTO: case OP_GOTO_16: case OP_GOTO_32: - flags = kInstrCanBranch; + flags = kInstrCanBranch | kInstrUnconditional; break; /* conditional branches */ @@ -617,12 +620,15 @@ InstructionFlags* dexCreateInstrFlagsTable(void) case OP_IPUT_QUICK: case OP_IPUT_WIDE_QUICK: case OP_IPUT_OBJECT_QUICK: + flags = kInstrCanContinue | kInstrCanThrow; + break; + case OP_INVOKE_VIRTUAL_QUICK: case OP_INVOKE_VIRTUAL_QUICK_RANGE: case OP_INVOKE_SUPER_QUICK: case OP_INVOKE_SUPER_QUICK_RANGE: case OP_INVOKE_DIRECT_EMPTY: - flags = kInstrCanContinue | kInstrCanThrow; + flags = kInstrCanContinue | kInstrCanThrow | kInstrInvoke; break; /* these should never appear */ @@ -651,6 +657,7 @@ InstructionFlags* dexCreateInstrFlagsTable(void) case OP_UNUSED_FD: case OP_UNUSED_FE: case OP_UNUSED_FF: + flags = kInstrNoJit; break; /* @@ -1238,4 +1245,3 @@ int dexGetInstrOrTableWidthAbs(const InstructionWidth* widths, const u2* insns) } return width; } - |