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;