Home | History | Annotate | Download | only in analysis

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 rewriteJumboInstField(Method* method, u2* insns,
45 static void rewriteStaticField(Method* method, u2* insns, Opcode volatileOpc);
46 static void rewriteJumboStaticField(Method* method, u2* insns,
48 static void rewriteVirtualInvoke(Method* method, u2* insns, Opcode newOpc);
49 static bool rewriteInvokeObjectInit(Method* method, u2* insns);
50 static bool rewriteJumboInvokeObjectInit(Method* method, u2* insns);
51 static bool rewriteExecuteInline(Method* method, u2* insns,
53 static bool rewriteExecuteInlineRange(Method* method, u2* insns,
55 static void rewriteReturnVoid(Method* method, u2* insns);
56 static bool needsReturnBarrier(Method* method);
81 Method* method = dvmFindInlinableMethod(ops[i].classDescriptor,
83 if (method == NULL) {
88 LOGE("Unable to find method for inlining: %s.%s:%s",
94 table[tableIndex].method = method;
100 table[tableIndex].method = NULL;
138 * Optimize instructions in a method.
151 static void optimizeMethod(Method* method, bool essentialOnly)
157 if (dvmIsNativeMethod(method) || dvmIsAbstractMethod(method))
161 needRetBar = needsReturnBarrier(method);
163 insns = (u2*) method->insns;
165 insnsSize = dvmGetMethodInsnsSize(method);
246 rewriteInstField(method, insns, quickOpc, volatileOpc);
281 rewriteJumboInstField(method, insns, volatileOpc);
316 rewriteStaticField(method, insns, volatileOpc);
351 rewriteJumboStaticField(method, insns, volatileOpc);
356 if (!rewriteInvokeObjectInit(method, insns)) {
362 rewriteJumboInvokeObjectInit(method, insns);
366 rewriteReturnVoid(method, insns);
382 if (!rewriteExecuteInline(method, insns, METHOD_VIRTUAL)) {
383 rewriteVirtualInvoke(method, insns,
388 if (!rewriteExecuteInlineRange(method, insns, METHOD_VIRTUAL)) {
389 rewriteVirtualInvoke(method, insns,
394 rewriteVirtualInvoke(method, insns, OP_INVOKE_SUPER_QUICK);
397 rewriteVirtualInvoke(method, insns, OP_INVOKE_SUPER_QUICK_RANGE);
400 rewriteExecuteInline(method, insns, METHOD_DIRECT);
403 rewriteExecuteInlineRange(method, insns, METHOD_DIRECT);
406 rewriteExecuteInline(method, insns, METHOD_STATIC);
409 rewriteExecuteInlineRange(method, insns, METHOD_STATIC);
435 void dvmUpdateCodeUnit(const Method* meth, u2* ptr, u2 newVal)
455 static inline void updateOpcode(const Method* meth, u2* ptr, Opcode opcode)
753 * "method" is the referring method.
755 static void rewriteInstField(Method* method, u2* insns, Opcode quickOpc,
758 ClassObject* clazz = method->clazz;
766 fieldIdx, (int) (insns - method->insns), clazz->descriptor,
767 method->name);
772 updateOpcode(method, insns, volatileOpc);
776 updateOpcode(method, insns, quickOpc);
777 dvmUpdateCodeUnit(method, insns+1, (u2) instField->byteOffset);
793 * "method" is the referring method.
795 static void rewriteJumboInstField(Method* method, u2* insns, Opcode volatileOpc)
797 ClassObject* clazz = method->clazz;
807 fieldIdx, (int) (insns - method->insns), clazz->descriptor,
808 method->name);
813 updateOpcode(method, insns, volatileOpc);
826 * "method" is the referring method.
828 static void rewriteStaticField0(Method* method, u2* insns, Opcode volatileOpc,
831 ClassObject* clazz = method->clazz;
840 fieldIdx, (int) (insns - method->insns), clazz->descriptor,
841 method->name);
846 updateOpcode(method, insns, volatileOpc);
852 static void rewriteStaticField(Method* method, u2* insns, Opcode volatileOpc)
855 rewriteStaticField0(method, insns, volatileOpc, fieldIdx);
857 static void rewriteJumboStaticField(Method* method, u2* insns,
861 rewriteStaticField0(method, insns, volatileOpc, fieldIdx);
872 Method* dvmOptResolveMethod(ClassObject* referrer, u4 methodIdx,
876 Method* resMethod;
882 LOGVV("--- resolving method %u (referrer=%s)", methodIdx,
895 * Can't find the class that the method is a part of, or don't
898 LOGV("DexOpt: can't find called method's class (?.%s)",
904 /* method is part of an interface; this is wrong method for that */
905 LOGW("DexOpt: method is in an interface");
929 LOGV("DexOpt: couldn't find method '%s'",
937 LOGD("DexOpt: wanted static, got instance for method %s.%s",
945 LOGD("DexOpt: wanted instance, got static for method %s.%s",
953 /* see if this is a pure-abstract method */
955 LOGW("DexOpt: pure-abstract method '%s' in %s",
975 LOGVV("--- found method %d (%s.%s)",
985 LOGI("DexOpt: illegal method access (call %s.%s %s from %s)",
1003 * We want to replace the method constant pool index BBBB with the
1006 static void rewriteVirtualInvoke(Method* method, u2* insns, Opcode newOpc)
1008 ClassObject* clazz = method->clazz;
1009 Method* baseMethod;
1016 (int) (insns - method->insns), clazz->descriptor,
1017 method->name);
1027 * Note: Method->methodIndex is a u2 and is range checked during the
1030 updateOpcode(method, insns, newOpc);
1031 dvmUpdateCodeUnit(method, insns+1, baseMethod->methodIndex);
1034 // method->clazz->descriptor, method->name,
1044 * instantiation will cause us to call a method that does nothing.
1051 static bool rewriteInvokeObjectInit(Method* method, u2* insns)
1053 ClassObject* clazz = method->clazz;
1054 Method* calledMethod;
1060 methodIdx, (int) (insns - method->insns),
1061 clazz->descriptor, method->name);
1078 dvmUpdateCodeUnit(method, insns,
1083 updateOpcode(method, insns, OP_INVOKE_OBJECT_INIT_RANGE);
1087 method->clazz->descriptor, method->name);
1096 static bool rewriteJumboInvokeObjectInit(Method* method, u2* insns)
1098 ClassObject* clazz = method->clazz;
1099 Method* calledMethod;
1105 methodIdx, (int) (insns - method->insns),
1106 clazz->descriptor, method->name);
1114 updateOpcode(method, insns, OP_INVOKE_OBJECT_INIT_JUMBO);
1117 method->clazz->descriptor, method->name);
1124 * Resolve an interface method reference.
1126 * No method access check here -- interface methods are always public.
1128 * Returns NULL if the method was not found. Does not throw an exception.
1130 Method* dvmOptResolveInterfaceMethod(ClassObject* referrer, u4 methodIdx)
1133 Method* resMethod;
1135 LOGVV("--- resolving interface method %d (referrer=%s)",
1147 /* can't find the class that the method is a part of */
1153 LOGI("Interface method not part of interface class");
1172 LOGW("Found non-abstract interface method %s.%s %s",
1184 LOGVV("--- found interface method %d (%s.%s)",
1198 static bool rewriteExecuteInline(Method* method, u2* insns,
1202 ClassObject* clazz = method->clazz;
1203 Method* calledMethod;
1214 while (inlineSubs->method != NULL) {
1218 inlineSubs->method, calledMethod,
1219 inlineSubs->method->clazz->descriptor,
1220 inlineSubs->method->name,
1221 inlineSubs->method->signature);
1224 if (inlineSubs->method == calledMethod) {
1228 updateOpcode(method, insns, OP_EXECUTE_INLINE);
1229 dvmUpdateCodeUnit(method, insns+1, (u2) inlineSubs->inlineIdx);
1232 // method->clazz->descriptor, method->name,
1249 static bool rewriteExecuteInlineRange(Method* method, u2* insns,
1253 ClassObject* clazz = method->clazz;
1254 Method* calledMethod;
1263 while (inlineSubs->method != NULL) {
1264 if (inlineSubs->method == calledMethod) {
1268 updateOpcode(method, insns, OP_EXECUTE_INLINE_RANGE);
1269 dvmUpdateCodeUnit(method, insns+1, (u2) inlineSubs->inlineIdx);
1272 // method->clazz->descriptor, method->name,
1284 * Returns "true" if the return-void instructions in this method should
1292 static bool needsReturnBarrier(Method* method)
1296 if (strcmp(method->name, "<init>") != 0)
1303 const ClassObject* clazz = method->clazz;
1311 * In theory, we only need to do this if the method actually modifies
1331 static void rewriteReturnVoid(Method* method, u2* insns)
1334 updateOpcode(method, insns, OP_RETURN_VOID_BARRIER);