[vm] Account for Out Of Memory during isolate message deserialization.
TEST=run test harness with low heap limit
Change-Id: I75d3b2e8461bcf99cc41eb3ad76173bc1976bbd9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/213538
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/longjump.h b/runtime/vm/longjump.h
index c551584..60f514b 100644
--- a/runtime/vm/longjump.h
+++ b/runtime/vm/longjump.h
@@ -16,11 +16,9 @@
class LongJumpScope : public StackResource {
public:
- LongJumpScope()
- : StackResource(ThreadState::Current()),
- top_(nullptr),
- base_(thread()->long_jump_base()) {
- thread()->set_long_jump_base(this);
+ explicit LongJumpScope(ThreadState* thread = ThreadState::Current())
+ : StackResource(thread), top_(nullptr), base_(thread->long_jump_base()) {
+ thread->set_long_jump_base(this);
}
~LongJumpScope() {
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index a110b89..ac2eef3 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -3745,7 +3745,7 @@
volatile bool has_exception = false;
{
- LongJumpScope jump;
+ LongJumpScope jump(thread);
if (setjmp(*jump.Set()) == 0) {
serializer.Serialize(obj);
} else {
@@ -3820,8 +3820,13 @@
return ReadObjectGraphCopyMessage(thread, message->persistent_handle());
} else {
RELEASE_ASSERT(message->IsSnapshot());
- MessageDeserializer deserializer(thread, message);
- return deserializer.Deserialize();
+ LongJumpScope jump(thread);
+ if (setjmp(*jump.Set()) == 0) {
+ MessageDeserializer deserializer(thread, message);
+ return deserializer.Deserialize();
+ } else {
+ return thread->StealStickyError();
+ }
}
}