Save/restore local table state on down calls.
Also add unit test.
Change-Id: Ia1dc54eaac20c4bbb1ca3d9ac2933d6ab0241261
diff --git a/src/calling_convention.cc b/src/calling_convention.cc
index 49b4348..c0556c5 100644
--- a/src/calling_convention.cc
+++ b/src/calling_convention.cc
@@ -77,17 +77,22 @@
}
}
-size_t JniCallingConvention::ReferenceCount() {
+size_t JniCallingConvention::ReferenceCount() const {
const Method* method = GetMethod();
return method->NumReferenceArgs() + (method->IsStatic() ? 1 : 0);
}
-FrameOffset JniCallingConvention::ReturnValueSaveLocation() {
+FrameOffset JniCallingConvention::LocalReferenceTable_SegmentStatesOffset() const {
size_t start_of_sirt = SirtLinkOffset().Int32Value() + kPointerSize;
size_t references_size = kPointerSize * ReferenceCount(); // size excluding header
return FrameOffset(start_of_sirt + references_size);
}
+FrameOffset JniCallingConvention::ReturnValueSaveLocation() const {
+ // Segment state is 4 bytes long
+ return FrameOffset(LocalReferenceTable_SegmentStatesOffset().Int32Value() + 4);
+}
+
bool JniCallingConvention::HasNext() {
if (itr_args_ <= kObjectOrClass) {
return true;