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;