[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();
+    }
   }
 }