Home | History | Annotate | Download | only in analysis

Lines Matching full:meth

72 static inline bool doVerboseLogging(const Method* meth) {
78 return (strcmp(meth->clazz->descriptor, cd) == 0 &&
79 dvmCompareNameDescriptorAndMethod(mn, sg, meth) == 0);
117 static bool isInitMethod(const Method* meth);
123 static bool doCodeVerification(Method* meth, InsnFlags* insnFlags,\
125 static bool verifyInstruction(Method* meth, InsnFlags* insnFlags,\
129 static void dumpRegTypes(const Method* meth, const InsnFlags* insnFlags,\
366 UninitInstanceMap* dvmCreateUninitInstanceMap(const Method* meth,
369 const int insnsSize = dvmGetMethodInsnsSize(meth);
370 const u2* insns = meth->insns;
375 if (isInitMethod(meth)) {
534 static bool isInitMethod(const Method* meth)
536 return (*meth->name == '<' && strcmp(meth->name+1, "init>") == 0);
542 static bool isClassInitMethod(const Method* meth)
544 return (*meth->name == '<' && strcmp(meth->name+1, "clinit>") == 0);
552 static ClassObject* lookupClassByDescriptor(const Method* meth,
571 clazz = dvmFindClassNoInit(pDescriptor, meth->clazz->classLoader);
603 meth->clazz->classLoader);
639 static ClassObject* lookupSignatureClass(const Method* meth, const char** pSig,
663 return lookupClassByDescriptor(meth, typeStr, pFailure);
674 static ClassObject* lookupSignatureArrayClass(const Method* meth,
703 return lookupClassByDescriptor(meth, typeStr, pFailure);
714 static bool setTypesFromSignature(const Method* meth, RegType* regTypes,
721 dexParameterIteratorInit(&iterator, &meth->prototype);
722 argStart = meth->registersSize - meth->insSize;
723 expectedArgs = meth->insSize; /* long/double count as two */
731 if (!dvmIsStaticMethod(meth)) {
737 if (isInitMethod(meth) && meth->clazz != gDvm.classJavaLangObject) {
739 meth->clazz);
743 regTypes[argStart + actualArgs] = regTypeFromClass(meth->clazz);
774 lookupClassByDescriptor(meth, descriptor, &failure);
826 const char* descriptor = dexProtoGetReturnType(&meth->prototype);
874 // LOG_VFY_METH(meth, "VFY: bad sig\n");
879 char* desc = dexProtoCopyMethodDescriptor(&meth->prototype);
881 desc, meth->clazz->descriptor, meth->name);
896 static RegType getMethodReturnType(const Method* meth)
899 const char* descriptor = dexProtoGetReturnType(&meth->prototype);
934 lookupClassByDescriptor(meth, descriptor, &failure);
1021 static Method* verifyInvocationArgs(const Method* meth, const RegType* insnRegs,
1034 meth->clazz, pDecInsn->vB);
1036 resMethod = dvmOptResolveMethod(meth->clazz, pDecInsn->vB, methodType,
1041 DexFile* pDexFile = meth->clazz->pDvmDex->pDexFile;
1054 char* dotMethClass = dvmDescriptorToDot(meth->clazz->descriptor);
1056 // dexProtoCopyMethodDescriptor(&meth->prototype);
1061 dotMethClass, meth->name/*, curMethodDesc*/);
1096 ClassObject* super = meth->clazz->super;
1100 meth->clazz->descriptor, meth->name,
1125 if (expectedArgs > meth->outsSize) {
1127 expectedArgs, meth->outsSize);
1186 ClassObject* clazz = lookupSignatureClass(meth, &sig, pFailure);
1202 lookupSignatureArrayClass(meth, &sig, pFailure);
1302 static ClassObject* getFieldClass(const Method* meth, const Field* field)
1309 meth->clazz->classLoader);
1317 field->signature, meth->clazz->descriptor, field->name);
2401 static void updateRegisters(const Method* meth, InsnFlags* insnFlags,
2405 const int insnRegCount = meth->registersSize;
2411 meth->clazz->descriptor, meth->name, meth->descriptor);
2430 //dumpRegTypes(meth, insnFlags, targetRegs, 0, "targ", NULL, 0);
2431 //dumpRegTypes(meth, insnFlags, workRegs, 0, "work", NULL, 0);
2443 //dumpRegTypes(meth, insnFlags, targetRegs, 0, "rslt", NULL, 0);
2475 static InstField* getInstField(const Method* meth,
2490 instField = dvmOptResolveInstField(meth->clazz, fieldIdx, pFailure);
2508 if (!isInitMethod(meth) || meth->clazz != objClass) {
2546 static StaticField* getStaticField(const Method* meth, int fieldIdx,
2551 staticField = dvmOptResolveStaticField(meth->clazz, fieldIdx, pFailure);
2553 DexFile* pDexFile = meth->clazz->pDvmDex->pDexFile;
2575 static void checkFinalFieldAccess(const Method* meth, const Field* field,
2582 if (meth->clazz != field->clazz) {
2583 LOG_VFY_METH(meth, "VFY: can't modify final field %s.%s\n",
2598 if (!isClassInitMethod(meth)) {
2599 LOG_VFY_METH(meth,
2604 if (!isInitMethod(meth)) {
2605 LOG_VFY_METH(meth,
2618 static void checkArrayIndexType(const Method* meth, RegType regType,
2629 LOG_VFY_METH(meth, "Invalid reg type for array index (%d)\n",
2646 static bool checkConstructorReturn(const Method* meth, const RegType* insnRegs,
2651 if (!isInitMethod(meth))
2673 static bool checkMoveException(const Method* meth, int insnIdx,
2676 assert(insnIdx >= 0 && insnIdx < (int)dvmGetMethodInsnsSize(meth));
2678 if ((meth->insns[insnIdx] & 0xff) == OP_MOVE_EXCEPTION) {
2696 static ClassObject* getCaughtExceptionType(const Method* meth, int insnIdx,
2708 pDexFile = meth->clazz->pDvmDex->pDexFile;
2709 pCode = dvmGetMethodCode(meth);
2737 clazz = dvmOptResolveClass(meth->clazz, handler->typeIdx,
2762 LOG_VFY_METH(meth,
2782 static bool initRegisterTable(const Method* meth, const InsnFlags* insnFlags,
2785 const int insnsSize = dvmGetMethodInsnsSize(meth);
2788 regTable->insnRegCountPlus = meth->registersSize + kExtraRegs;
2878 static void verifyFilledNewArrayRegs(const Method* meth,
2932 * IMPORTANT: this may replace meth->insns with a pointer to a new copy of
2937 static bool replaceFailingInstruction(Method* meth, InsnFlags* insnFlags,
2941 const u2* oldInsns = meth->insns + insnIdx;
2945 //dvmMakeCodeReadWrite(meth);
2948 u2* newInsns = (u2*) meth->insns + insnIdx;
3024 dvmDexChangeDex2(meth->clazz->pDvmDex, newInsns+2, OP_NOP);
3038 dvmDexChangeDex2(meth->clazz->pDvmDex, newInsns, newVal);
3043 //dvmMakeCodeReadOnly(meth);
3057 bool dvmVerifyCodeFlow(Method* meth, InsnFlags* insnFlags,
3061 const int insnsSize = dvmGetMethodInsnsSize(meth);
3062 const u2* insns = meth->insns;
3095 if (meth->registersSize * insnsSize > 2*1024*1024) {
3097 LOG_VFY_METH(meth,
3099 meth->registersSize, insnsSize);
3108 if (!initRegisterTable(meth, insnFlags, &regTable,
3116 if (!setTypesFromSignature(meth, regTable.addrRegs[0], uninitMap))
3122 if (!doCodeVerification(meth, insnFlags, &regTable, uninitMap))
3132 vd.method = meth;
3134 vd.insnRegCount = meth->registersSize;
3145 dvmSetRegisterMap((Method*)meth, pMap);
3211 static bool doCodeVerification(Method* meth, InsnFlags* insnFlags,
3214 const int insnsSize = dvmGetMethodInsnsSize(meth);
3215 const u2* insns = meth->insns;
3216 RegType workRegs[meth->registersSize + kExtraRegs];
3226 if (doVerboseLogging(meth)) {
3228 char* desc = dexProtoCopyMethodDescriptor(&meth->prototype);
3230 meth->clazz->descriptor, meth->name, desc,
3231 meth->insSize, meth->registersSize);
3281 copyRegisters(workRegs, insnRegs, meth->registersSize + kExtraRegs);
3284 dumpRegTypes(meth, insnFlags, workRegs, insnIdx, NULL,uninitMap,
3290 dumpRegTypes(meth, insnFlags, workRegs, insnIdx, NULL,uninitMap,
3302 meth->registersSize + kExtraRegs) != 0)
3304 char* desc = dexProtoCopyMethodDescriptor(&meth->prototype);
3306 meth->clazz->descriptor, meth->name, desc);
3308 dumpRegTypes(meth, insnFlags, workRegs, 0, "work",
3310 dumpRegTypes(meth, insnFlags, insnRegs, 0, "insn",
3317 // meth->clazz->descriptor, meth->name, meth->descriptor, insnIdx);
3318 if (!verifyInstruction(meth, insnFlags, regTable, workRegs, insnIdx,
3321 //LOGD("+++ %s bailing at %d\n", meth->name, insnIdx);
3329 OpCode opCode = *(meth->insns + insnIdx) & 0xff;
3333 int regWidth = (meth->registersSize + 7) / 8;
3340 meth->registersSize, regWidth,
3341 meth->clazz->descriptor, meth->name);
3369 if (DEAD_CODE_SCAN && !IS_METHOD_FLAG_SET(meth, METHOD_ISWRITABLE)) {
3386 int instr = meth->insns[insnIdx];
3391 (meth->insns[insnIdx+1] == kPackedSwitchSignature ||
3392 meth->insns[insnIdx+1] == kSparseSwitchSignature ||
3393 meth->insns[insnIdx+1] == kArrayDataSignature)))
3404 dexProtoCopyMethodDescriptor(&meth->prototype);
3407 meth->clazz->descriptor, meth->name, desc);
3416 char* desc = dexProtoCopyMethodDescriptor(&meth->prototype);
3419 meth->clazz->descriptor, meth->name, desc);
3443 * This may alter meth->insns if we need to replace an instruction with
3446 static bool verifyInstruction(Method* meth, InsnFlags* insnFlags,
3450 const int insnsSize = dvmGetMethodInsnsSize(meth);
3451 const u2* insns = meth->insns + insnIdx;
3474 const DexFile* pDexFile = meth->clazz->pDvmDex->pDexFile;
3475 RegType entryRegs[meth->registersSize + kExtraRegs];
3479 const int insnRegCount = meth->registersSize;
3501 copyRegisters(entryRegs, workRegs, meth->registersSize + kExtraRegs);
3505 (meth->registersSize + kExtraRegs) * sizeof(RegType));
3573 resClass = getCaughtExceptionType(meth, insnIdx, &failure);
3583 if (!checkConstructorReturn(meth, workRegs, insnRegCount)) {
3585 } else if (getMethodReturnType(meth) != kRegTypeUnknown) {
3591 if (!checkConstructorReturn(meth, workRegs, insnRegCount)) {
3595 RegType returnType = getMethodReturnType(meth);
3609 if (!checkConstructorReturn(meth, workRegs, insnRegCount)) {
3615 returnType = getMethodReturnType(meth);
3636 if (!checkConstructorReturn(meth, workRegs, insnRegCount)) {
3639 RegType returnType = getMethodReturnType(meth);
3710 resClass = dvmOptResolveClass(meth->clazz, decInsn.vB, &failure);
3713 dvmLogUnableToResolveClass(badClassDesc, meth);
3715 decInsn.vB, badClassDesc, meth->clazz->descriptor);
3743 resClass = dvmOptResolveClass(meth->clazz, decInsn.vB, &failure);
3746 dvmLogUnableToResolveClass(badClassDesc, meth);
3748 decInsn.vB, badClassDesc, meth->clazz->descriptor);
3778 resClass = dvmOptResolveClass(meth->clazz, decInsn.vC, &failure);
3781 dvmLogUnableToResolveClass(badClassDesc, meth);
3783 decInsn.vC, badClassDesc, meth->clazz->descriptor);
3807 resClass = dvmOptResolveClass(meth->clazz, decInsn.vB, &failure);
3810 dvmLogUnableToResolveClass(badClassDesc, meth);
3812 decInsn.vB, badClassDesc, meth->clazz->descriptor);
3843 resClass = dvmOptResolveClass(meth->clazz, decInsn.vC, &failure);
3846 dvmLogUnableToResolveClass(badClassDesc, meth);
3848 decInsn.vC, badClassDesc, meth->clazz->descriptor);
3864 resClass = dvmOptResolveClass(meth->clazz, decInsn.vB, &failure);
3867 dvmLogUnableToResolveClass(badClassDesc, meth);
3869 decInsn.vB, badClassDesc, meth->clazz->descriptor);
3878 verifyFilledNewArrayRegs(meth, workRegs, insnRegCount, &decInsn,
4106 checkArrayIndexType(meth, indexType, &failure);
4149 checkArrayIndexType(meth, indexType, &failure);
4203 checkArrayIndexType(meth, indexType, &failure);
4278 checkArrayIndexType(meth, indexType, &failure);
4325 checkArrayIndexType(meth, tmpType, &failure);
4370 checkArrayIndexType(meth, tmpType, &failure);
4453 instField = getInstField(meth, uninitMap, objType, decInsn.vC,
4485 instField = getInstField(meth, uninitMap, objType, decInsn.vC,
4521 instField = getInstField(meth, uninitMap, objType, decInsn.vC,
4525 fieldClass = getFieldClass(meth, &instField->field);
4583 instField = getInstField(meth, uninitMap, objType, decInsn.vC,
4587 checkFinalFieldAccess(meth, &instField->field, &failure);
4621 instField = getInstField(meth, uninitMap, objType, decInsn.vC,
4625 checkFinalFieldAccess(meth, &instField->field, &failure);
4655 instField = getInstField(meth, uninitMap, objType, decInsn.vC,
4659 checkFinalFieldAccess(meth, &instField->field, &failure);
4663 fieldClass = getFieldClass(meth, &instField->field);
4725 staticField = getStaticField(meth, decInsn.vB, &failure);
4755 staticField = getStaticField(meth, decInsn.vB, &failure);
4785 staticField = getStaticField(meth, decInsn.vB, &failure);
4788 fieldClass = getFieldClass(meth, &staticField->field);
4842 staticField = getStaticField(meth, decInsn.vB, &failure);
4845 checkFinalFieldAccess(meth, &staticField->field, &failure);
4877 staticField = getStaticField(meth, decInsn.vB, &failure);
4880 checkFinalFieldAccess(meth, &staticField->field, &failure);
4906 staticField = getStaticField(meth, decInsn.vB, &failure);
4909 checkFinalFieldAccess(meth, &staticField->field, &failure);
4913 fieldClass = getFieldClass(meth, &staticField->field);
4970 calledMethod = verifyInvocationArgs(meth, workRegs, insnRegCount,
4988 calledMethod = verifyInvocationArgs(meth, workRegs, insnRegCount,
5024 if (thisClass != meth->clazz) {
5070 calledMethod = verifyInvocationArgs(meth, workRegs, insnRegCount,
5089 absMethod = verifyInvocationArgs(meth, workRegs, insnRegCount,
5467 LOG_VFY_METH(meth, "VFY: rejecting opcode 0x%02x at 0x%04x\n",
5474 if (!replaceFailingInstruction(meth, insnFlags, insnIdx, failure)) {
5475 LOG_VFY_METH(meth, "VFY: rejecting opcode 0x%02x at 0x%04x\n",
5479 /* IMPORTANT: meth->insns may have been changed */
5480 insns = meth->insns + insnIdx;
5504 LOG_VFY_METH(meth,
5514 if (!checkMoveException(meth, insnIdx+insnWidth, "next"))
5522 updateRegisters(meth, insnFlags, regTable, insnIdx+insnWidth,
5547 if (!dvmGetBranchTarget(meth, insnFlags, insnIdx, &branchTarget,
5551 LOG_VFY_METH(meth, "VFY: bad branch at %d\n", insnIdx);
5557 if (!checkMoveException(meth, insnIdx+branchTarget, "branch"))
5561 updateRegisters(meth, insnFlags, regTable, insnIdx+branchTarget,
5597 if (!checkMoveException(meth, absOffset, "switch"))
5600 updateRegisters(meth, insnFlags, regTable, absOffset, workRegs);
5611 meth->clazz->pDvmDex->pDexFile;
5612 const DexCode* pCode = dvmGetMethodCode(meth);
5624 updateRegisters(meth, insnFlags, regTable, handler->address,
5672 static void dumpRegTypes(const Method* meth, const InsnFlags* insnFlags,
5676 int regCount = meth->registersSize;
5681 assert(addr >= 0 && addr < (int) dvmGetMethodInsnsSize(meth));
5762 dexDecodeDebugInfo(meth->clazz->pDvmDex->pDexFile,
5763 dvmGetMethodCode(meth),
5764 meth->clazz->descriptor,
5765 meth->prototype.protoIdx,
5766 meth->accessFlags,