diff options
| author | 2012-03-17 12:40:56 -0700 | |
|---|---|---|
| committer | 2012-03-17 12:40:56 -0700 | |
| commit | 8ed14528fb70a9ba7cc5e471317d08dc629cbc23 (patch) | |
| tree | 9661211feac5c7fb1c57d25690efdcbaefe8f092 /src/compiler/codegen/MethodCodegenDriver.cc | |
| parent | 92ba3d9871d16d1cf4dbc841f14fe6e0900c6ff0 (diff) | |
| parent | 2ed3b9536ccfd7c7321cc18650820b093b22d6c9 (diff) | |
Merge "Implement direct apk -> boot calling" into ics-mr1-plus-art
Diffstat (limited to 'src/compiler/codegen/MethodCodegenDriver.cc')
| -rw-r--r-- | src/compiler/codegen/MethodCodegenDriver.cc | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/compiler/codegen/MethodCodegenDriver.cc b/src/compiler/codegen/MethodCodegenDriver.cc index be8f1f9d5c..64f55c6b02 100644 --- a/src/compiler/codegen/MethodCodegenDriver.cc +++ b/src/compiler/codegen/MethodCodegenDriver.cc @@ -70,10 +70,13 @@ void genInvoke(CompilationUnit* cUnit, MIR* mir, InvokeType type, bool isRange) uint32_t dexMethodIdx = dInsn->vB; int vtableIdx; + uintptr_t directCode; + uintptr_t directMethod; bool skipThis; bool fastPath = cUnit->compiler->ComputeInvokeInfo(dexMethodIdx, &mUnit, type, - vtableIdx) + vtableIdx, directCode, + directMethod) && !SLOW_INVOKE_PATH; if (type == kInterface) { nextCallInsn = fastPath ? nextInterfaceCallInsn @@ -89,8 +92,9 @@ void genInvoke(CompilationUnit* cUnit, MIR* mir, InvokeType type, bool isRange) nextCallInsn = fastPath ? nextSDCallInsn : nextStaticCallInsnSP; skipThis = false; } else if (type == kSuper) { - nextCallInsn = fastPath ? nextSuperCallInsn : nextSuperCallInsnSP; - skipThis = fastPath; + DCHECK(!fastPath); // Fast path is a direct call. + nextCallInsn = nextSuperCallInsnSP; + skipThis = false; } else { DCHECK_EQ(type, kVirtual); nextCallInsn = fastPath ? nextVCallInsn : nextVCallInsnSP; @@ -99,16 +103,16 @@ void genInvoke(CompilationUnit* cUnit, MIR* mir, InvokeType type, bool isRange) if (!isRange) { callState = genDalvikArgsNoRange(cUnit, mir, dInsn, callState, pNullCk, nextCallInsn, dexMethodIdx, - vtableIdx, skipThis); + vtableIdx, directCode, directMethod, skipThis); } else { callState = genDalvikArgsRange(cUnit, mir, dInsn, callState, pNullCk, nextCallInsn, dexMethodIdx, vtableIdx, - skipThis); + directCode, directMethod, skipThis); } // Finish up any of the call sequence not interleaved in arg loading while (callState >= 0) { callState = nextCallInsn(cUnit, mir, callState, dexMethodIdx, - vtableIdx); + vtableIdx, directCode, directMethod); } if (DISPLAY_MISSING_TARGETS) { genShowTarget(cUnit); |