Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(841)

Unified Diff: runtime/vm/isolate.cc

Issue 506933002: Keep track of stack base whenever Dart code is invoked. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/profiler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/isolate.cc
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index dbe55885bca64729180e091184ca9963a83c2fd1..a90137d56724e31b06c859c90c39b4e2f7367487 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -416,6 +416,7 @@ Isolate::Isolate()
mutex_(new Mutex()),
stack_limit_(0),
saved_stack_limit_(0),
+ stack_base_(0),
stack_overflow_flags_(0),
stack_overflow_count_(0),
message_handler_(NULL),
@@ -601,7 +602,7 @@ Isolate* Isolate::Init(const char* name_prefix) {
// main thread.
// TODO(5411455): Need to figure out how to set the stack limit for the
// main thread.
- result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result));
+ result->SetStackLimitFromStackBase(reinterpret_cast<uword>(&result));
result->set_main_port(PortMap::CreatePort(result->message_handler()));
result->set_pause_capability(result->random()->NextUInt64());
result->set_terminate_capability(result->random()->NextUInt64());
@@ -642,15 +643,18 @@ uword Isolate::GetSpecifiedStackSize() {
}
-void Isolate::SetStackLimitFromCurrentTOS(uword stack_top_value) {
+void Isolate::SetStackLimitFromStackBase(uword stack_base) {
#if defined(USING_SIMULATOR)
// Ignore passed-in native stack top and use Simulator stack top.
Simulator* sim = Simulator::Current(); // May allocate a simulator.
ASSERT(simulator() == sim); // This isolate's simulator is the current one.
- stack_top_value = sim->StackTop();
+ stack_base = sim->StackTop();
// The overflow area is accounted for by the simulator.
#endif
- SetStackLimit(stack_top_value - GetSpecifiedStackSize());
+ // Set stack base.
+ stack_base_ = stack_base;
+ // Set stack limit.
+ SetStackLimit(stack_base_ - GetSpecifiedStackSize());
}
@@ -666,7 +670,13 @@ void Isolate::SetStackLimit(uword limit) {
}
-bool Isolate::GetStackBounds(uword* lower, uword* upper) {
+void Isolate::ClearStackLimit() {
+ SetStackLimit(~static_cast<uword>(0));
+ stack_base_ = 0;
+}
+
+
+bool Isolate::GetProfilerStackBounds(uword* lower, uword* upper) const {
uword stack_lower = stack_limit();
if (stack_lower == kUwordMax) {
stack_lower = saved_stack_limit();
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698