Lines Matching refs:method

30  * Virtual/direct calls to "method" are replaced with an execute-inline
34 Method* method;
40 static void optimizeMethod(Method* method, bool essentialOnly);
41 static void rewriteInstField(Method* method, u2* insns, Opcode quickOpc,
43 static void rewriteStaticField(Method* method, u2* insns, Opcode volatileOpc);
44 static void rewriteVirtualInvoke(Method* method, u2* insns, Opcode newOpc);
45 static bool rewriteInvokeObjectInit(Method* method, u2* insns);
46 static bool rewriteExecuteInline(Method* method, u2* insns,
48 static bool rewriteExecuteInlineRange(Method* method, u2* insns,
50 static void rewriteReturnVoid(Method* method, u2* insns);
51 static bool needsReturnBarrier(Method* method);
76 Method* method = dvmFindInlinableMethod(ops[i].classDescriptor,
78 if (method == NULL) {
83 ALOGE("Unable to find method for inlining: %s.%s:%s",
89 table[tableIndex].method = method;
95 table[tableIndex].method = NULL;
133 * Optimize instructions in a method.
146 static void optimizeMethod(Method* method, bool essentialOnly)
152 if (dvmIsNativeMethod(method) || dvmIsAbstractMethod(method))
156 needRetBar = needsReturnBarrier(method);
158 insns = (u2*) method->insns;
160 insnsSize = dvmGetMethodInsnsSize(method);
241 rewriteInstField(method, insns, quickOpc, volatileOpc);
276 rewriteStaticField(method, insns, volatileOpc);
281 if (!rewriteInvokeObjectInit(method, insns)) {
288 rewriteReturnVoid(method, insns);
304 if (!rewriteExecuteInline(method, insns, METHOD_VIRTUAL)) {
305 rewriteVirtualInvoke(method, insns,
310 if (!rewriteExecuteInlineRange(method, insns, METHOD_VIRTUAL)) {
311 rewriteVirtualInvoke(method, insns,
316 rewriteVirtualInvoke(method, insns, OP_INVOKE_SUPER_QUICK);
319 rewriteVirtualInvoke(method, insns, OP_INVOKE_SUPER_QUICK_RANGE);
322 rewriteExecuteInline(method, insns, METHOD_DIRECT);
325 rewriteExecuteInlineRange(method, insns, METHOD_DIRECT);
328 rewriteExecuteInline(method, insns, METHOD_STATIC);
331 rewriteExecuteInlineRange(method, insns, METHOD_STATIC);
675 * "method" is the referring method.
677 static void rewriteInstField(Method* method, u2* insns, Opcode quickOpc,
680 ClassObject* clazz = method->clazz;
688 fieldIdx, (int) (insns - method->insns), clazz->descriptor,
689 method->name);
694 updateOpcode(method, insns, volatileOpc);
698 updateOpcode(method, insns, quickOpc);
699 dvmUpdateCodeUnit(method, insns+1, (u2) instField->byteOffset);
715 * "method" is the referring method.
717 static void rewriteStaticField0(Method* method, u2* insns, Opcode volatileOpc,
720 ClassObject* clazz = method->clazz;
729 fieldIdx, (int) (insns - method->insns), clazz->descriptor,
730 method->name);
735 updateOpcode(method, insns, volatileOpc);
741 static void rewriteStaticField(Method* method, u2* insns, Opcode volatileOpc)
744 rewriteStaticField0(method, insns, volatileOpc, fieldIdx);
764 LOGVV("--- resolving method %u (referrer=%s)", methodIdx,
777 * Can't find the class that the method is a part of, or don't
780 ALOGV("DexOpt: can't find called method's class (?.%s)",
786 /* method is part of an interface; this is wrong method for that */
787 ALOGW("DexOpt: method is in an interface");
811 ALOGV("DexOpt: couldn't find method '%s'",
819 ALOGD("DexOpt: wanted static, got instance for method %s.%s",
827 ALOGD("DexOpt: wanted instance, got static for method %s.%s",
835 /* see if this is a pure-abstract method */
837 ALOGW("DexOpt: pure-abstract method '%s' in %s",
857 LOGVV("--- found method %d (%s.%s)",
867 ALOGI("DexOpt: illegal method access (call %s.%s %s from %s)",
885 * We want to replace the method constant pool index BBBB with the
888 static void rewriteVirtualInvoke(Method* method, u2* insns, Opcode newOpc)
890 ClassObject* clazz = method->clazz;
898 (int) (insns - method->insns), clazz->descriptor,
899 method->name);
912 updateOpcode(method, insns, newOpc);
913 dvmUpdateCodeUnit(method, insns+1, baseMethod->methodIndex);
916 // method->clazz->descriptor, method->name,
926 * instantiation will cause us to call a method that does nothing.
933 static bool rewriteInvokeObjectInit(Method* method, u2* insns)
935 ClassObject* clazz = method->clazz;
942 methodIdx, (int) (insns - method->insns),
943 clazz->descriptor, method->name);
960 dvmUpdateCodeUnit(method, insns,
965 updateOpcode(method, insns, OP_INVOKE_OBJECT_INIT_RANGE);
969 method->clazz->descriptor, method->name);
976 * Resolve an interface method reference.
978 * No method access check here -- interface methods are always public.
980 * Returns NULL if the method was not found. Does not throw an exception.
987 LOGVV("--- resolving interface method %d (referrer=%s)",
999 /* can't find the class that the method is a part of */
1005 ALOGI("Interface method not part of interface class");
1024 ALOGW("Found non-abstract interface method %s.%s %s",
1036 LOGVV("--- found interface method %d (%s.%s)",
1050 static bool rewriteExecuteInline(Method* method, u2* insns,
1054 ClassObject* clazz = method->clazz;
1066 while (inlineSubs->method != NULL) {
1070 inlineSubs->method, calledMethod,
1071 inlineSubs->method->clazz->descriptor,
1072 inlineSubs->method->name,
1073 inlineSubs->method->signature);
1076 if (inlineSubs->method == calledMethod) {
1080 updateOpcode(method, insns, OP_EXECUTE_INLINE);
1081 dvmUpdateCodeUnit(method, insns+1, (u2) inlineSubs->inlineIdx);
1084 // method->clazz->descriptor, method->name,
1101 static bool rewriteExecuteInlineRange(Method* method, u2* insns,
1105 ClassObject* clazz = method->clazz;
1115 while (inlineSubs->method != NULL) {
1116 if (inlineSubs->method == calledMethod) {
1120 updateOpcode(method, insns, OP_EXECUTE_INLINE_RANGE);
1121 dvmUpdateCodeUnit(method, insns+1, (u2) inlineSubs->inlineIdx);
1124 // method->clazz->descriptor, method->name,
1136 * Returns "true" if the return-void instructions in this method should
1144 static bool needsReturnBarrier(Method* method)
1148 if (strcmp(method->name, "<init>") != 0)
1155 const ClassObject* clazz = method->clazz;
1163 * In theory, we only need to do this if the method actually modifies
1183 static void rewriteReturnVoid(Method* method, u2* insns)
1186 updateOpcode(method, insns, OP_RETURN_VOID_BARRIER);