Start moving stack-related stuff out of thread.h.
This was in preparation for implementing "SmartFrame", which is back on hold
while I finish finalization.
Change-Id: I006c9cfbc34520b9b0a72972611036d908a1d84b
diff --git a/src/stack.cc b/src/stack.cc
new file mode 100644
index 0000000..9f01dab
--- /dev/null
+++ b/src/stack.cc
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "stack.h"
+
+#include "compiler.h"
+#include "object.h"
+
+namespace art {
+
+bool Frame::HasMethod() const {
+ return GetMethod() != NULL && (!GetMethod()->IsPhony());
+}
+
+void Frame::Next() {
+ size_t frame_size = GetMethod()->GetFrameSizeInBytes();
+ DCHECK_NE(frame_size, 0u);
+ DCHECK_LT(frame_size, 1024u);
+ byte* next_sp = reinterpret_cast<byte*>(sp_) + frame_size;
+ sp_ = reinterpret_cast<Method**>(next_sp);
+ if (*sp_ != NULL) {
+ DCHECK((*sp_)->GetClass() == Method::GetMethodClass() ||
+ (*sp_)->GetClass() == Method::GetConstructorClass());
+ }
+}
+
+uintptr_t Frame::GetReturnPC() const {
+ byte* pc_addr = reinterpret_cast<byte*>(sp_) + GetMethod()->GetReturnPcOffsetInBytes();
+ return *reinterpret_cast<uintptr_t*>(pc_addr);
+}
+
+uintptr_t Frame::GetVReg(Method* method, int vreg) const {
+ DCHECK(method == GetMethod());
+ int offset = oatVRegOffsetFromMethod(method, vreg);
+ byte* vreg_addr = reinterpret_cast<byte*>(sp_) + offset;
+ return *reinterpret_cast<uintptr_t*>(vreg_addr);
+}
+
+uintptr_t Frame::LoadCalleeSave(int num) const {
+ // Callee saves are held at the top of the frame
+ Method* method = GetMethod();
+ DCHECK(method != NULL);
+ size_t frame_size = method->GetFrameSizeInBytes();
+ byte* save_addr = reinterpret_cast<byte*>(sp_) + frame_size - ((num + 1) * kPointerSize);
+#if defined(__i386__)
+ save_addr -= kPointerSize; // account for return address
+#endif
+ return *reinterpret_cast<uintptr_t*>(save_addr);
+}
+
+Method* Frame::NextMethod() const {
+ byte* next_sp = reinterpret_cast<byte*>(sp_) + GetMethod()->GetFrameSizeInBytes();
+ return *reinterpret_cast<Method**>(next_sp);
+}
+
+} // namespace art