| Index: runtime/vm/dart_entry.cc | 
| diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc | 
| index 7a5ce3207f9a44123865d2eacdcb98ed67bdac67..129b927aa0e2d38ad31e91994a3a531d27e72fe0 100644 | 
| --- a/runtime/vm/dart_entry.cc | 
| +++ b/runtime/vm/dart_entry.cc | 
| @@ -38,6 +38,32 @@ RawObject* DartEntry::InvokeFunction(const Function& function, | 
| } | 
|  | 
|  | 
| +class ScopedIsolateStackLimits : public ValueObject { | 
| + public: | 
| +  explicit ScopedIsolateStackLimits(Isolate* isolate) | 
| +      : isolate_(isolate) { | 
| +    ASSERT(isolate_ != NULL); | 
| +    ASSERT(isolate_ == Isolate::Current()); | 
| +    uword stack_base = reinterpret_cast<uword>(this); | 
| +    if (stack_base >= isolate_->stack_base()) { | 
| +      isolate_->SetStackLimitFromStackBase(stack_base); | 
| +    } | 
| +  } | 
| + | 
| +  ~ScopedIsolateStackLimits() { | 
| +    ASSERT(isolate_ == Isolate::Current()); | 
| +    uword stack_base = reinterpret_cast<uword>(this); | 
| +    if (isolate_->stack_base() == stack_base) { | 
| +      // Bottomed out. | 
| +      isolate_->ClearStackLimit(); | 
| +    } | 
| +  } | 
| + | 
| + private: | 
| +  Isolate* isolate_; | 
| +}; | 
| + | 
| + | 
| RawObject* DartEntry::InvokeFunction(const Function& function, | 
| const Array& arguments, | 
| const Array& arguments_descriptor, | 
| @@ -59,6 +85,7 @@ RawObject* DartEntry::InvokeFunction(const Function& function, | 
| const Code& code = Code::Handle(isolate, function.CurrentCode()); | 
| ASSERT(!code.IsNull()); | 
| ASSERT(Isolate::Current()->no_callback_scope_depth() == 0); | 
| +  ScopedIsolateStackLimits stack_limit(isolate); | 
| #if defined(USING_SIMULATOR) | 
| #if defined(ARCH_IS_64_BIT) | 
| // TODO(zra): Change to intptr_t so we have only one case. | 
|  |