Complete direct, static & virtual invoke

Reworked direct/static invoke to use code_and_method_ structure.  Removed
slow/fast path distinction for direct/static (because there is only
a single path).  Added fast and reworked slow path for virtual invokes.

Change-Id: I037aee26b63244d03ac2bd8720d8c55e256b9b4d
diff --git a/src/dex_cache.h b/src/dex_cache.h
index 137f267..804f680 100644
--- a/src/dex_cache.h
+++ b/src/dex_cache.h
@@ -39,9 +39,21 @@
     Set(method_idx * kMax + kMethod, reinterpret_cast<int32_t>(method));
   }
 
- static size_t LengthAsArray(size_t elements) {
-   return kMax * elements;
- }
+  static size_t LengthAsArray(size_t elements) {
+    return kMax * elements;
+  }
+
+  // Offset of resolved method entry from start of code_and_direct_methods_
+  static size_t MethodOffsetInBytes(uint32_t method_idx) {
+    return ((method_idx * kMax + kMethod) * sizeof(ElementType) +
+             Array::DataOffset().Int32Value());
+  }
+
+  // Offset of resolved method's code_ from start of code_and_direct_methods_
+  static size_t CodeOffsetInBytes(uint32_t method_idx) {
+    return ((method_idx * kMax + kCode) * sizeof(ElementType) +
+             Array::DataOffset().Int32Value());
+  }
 
  size_t NumCodeAndDirectMethods() const {
    return GetLength() / kMax;