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

Side by Side Diff: runtime/vm/snapshot.cc

Issue 14273021: Report OOM errors instead of asserting on allocation failures when sending (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/snapshot.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/snapshot.h" 5 #include "vm/snapshot.h"
6 6
7 #include "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/bigint_operations.h" 8 #include "vm/bigint_operations.h"
9 #include "vm/bootstrap.h" 9 #include "vm/bootstrap.h"
10 #include "vm/class_finalizer.h" 10 #include "vm/class_finalizer.h"
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 SnapshotWriter::SnapshotWriter(Snapshot::Kind kind, 853 SnapshotWriter::SnapshotWriter(Snapshot::Kind kind,
854 uint8_t** buffer, 854 uint8_t** buffer,
855 ReAlloc alloc, 855 ReAlloc alloc,
856 intptr_t initial_size) 856 intptr_t initial_size)
857 : BaseWriter(buffer, alloc, initial_size), 857 : BaseWriter(buffer, alloc, initial_size),
858 kind_(kind), 858 kind_(kind),
859 object_store_(Isolate::Current()->object_store()), 859 object_store_(Isolate::Current()->object_store()),
860 class_table_(Isolate::Current()->class_table()), 860 class_table_(Isolate::Current()->class_table()),
861 forward_list_(), 861 forward_list_(),
862 exception_type_(Exceptions::kNone), 862 exception_type_(Exceptions::kNone),
863 exception_msg_(NULL), 863 exception_msg_(NULL) {
864 error_(LanguageError::Handle()) {
865 } 864 }
866 865
867 866
868 void SnapshotWriter::WriteObject(RawObject* rawobj) { 867 void SnapshotWriter::WriteObject(RawObject* rawobj) {
869 WriteObjectImpl(rawobj); 868 WriteObjectImpl(rawobj);
870 WriteForwardedObjects(); 869 WriteForwardedObjects();
871 } 870 }
872 871
873 872
874 void SnapshotWriter::HandleVMIsolateObject(RawObject* rawobj) { 873 void SnapshotWriter::HandleVMIsolateObject(RawObject* rawobj) {
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 ASSERT(isolate != NULL); 1028 ASSERT(isolate != NULL);
1030 ObjectStore* object_store = isolate->object_store(); 1029 ObjectStore* object_store = isolate->object_store();
1031 ASSERT(object_store != NULL); 1030 ASSERT(object_store != NULL);
1032 ASSERT(ClassFinalizer::AllClassesFinalized()); 1031 ASSERT(ClassFinalizer::AllClassesFinalized());
1033 1032
1034 // Setup for long jump in case there is an exception while writing 1033 // Setup for long jump in case there is an exception while writing
1035 // the snapshot. 1034 // the snapshot.
1036 LongJump* base = isolate->long_jump_base(); 1035 LongJump* base = isolate->long_jump_base();
1037 LongJump jump; 1036 LongJump jump;
1038 isolate->set_long_jump_base(&jump); 1037 isolate->set_long_jump_base(&jump);
1039 // TODO(6726): Allocate these constant strings once in the VM isolate.
1040 *ErrorHandle() = LanguageError::New(
1041 String::Handle(String::New("Error while writing full snapshot")));
1042 if (setjmp(*jump.Set()) == 0) { 1038 if (setjmp(*jump.Set()) == 0) {
1043 NoGCScope no_gc; 1039 NoGCScope no_gc;
1044 1040
1045 // Reserve space in the output buffer for a snapshot header. 1041 // Reserve space in the output buffer for a snapshot header.
1046 ReserveHeader(); 1042 ReserveHeader();
1047 1043
1048 // Write out all the objects in the object store of the isolate which 1044 // Write out all the objects in the object store of the isolate which
1049 // is the root set for all dart allocated objects at this point. 1045 // is the root set for all dart allocated objects at this point.
1050 SnapshotWriterVisitor visitor(this, false); 1046 SnapshotWriterVisitor visitor(this, false);
1051 object_store->VisitObjectPointers(&visitor); 1047 object_store->VisitObjectPointers(&visitor);
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 SetWriteException(Exceptions::kArgument, 1323 SetWriteException(Exceptions::kArgument,
1328 "Illegal argument in isolate message" 1324 "Illegal argument in isolate message"
1329 " : (object extends NativeWrapper)"); 1325 " : (object extends NativeWrapper)");
1330 } 1326 }
1331 } 1327 }
1332 1328
1333 1329
1334 void SnapshotWriter::SetWriteException(Exceptions::ExceptionType type, 1330 void SnapshotWriter::SetWriteException(Exceptions::ExceptionType type,
1335 const char* msg) { 1331 const char* msg) {
1336 set_exception_type(type); 1332 set_exception_type(type);
1337 // TODO(6726): Allocate these constant strings once in the VM isolate.
1338 set_exception_msg(msg); 1333 set_exception_msg(msg);
1339 Isolate::Current()->long_jump_base()->Jump(1, *ErrorHandle()); 1334 // The more specific error is set up in SnapshotWriter::ThrowException().
1335 Isolate::Current()->long_jump_base()->
1336 Jump(1, Object::snapshot_writer_error());
1340 } 1337 }
1341 1338
1342 1339
1343 void SnapshotWriter::WriteInstance(intptr_t object_id, 1340 void SnapshotWriter::WriteInstance(intptr_t object_id,
1344 RawObject* raw, 1341 RawObject* raw,
1345 RawClass* cls, 1342 RawClass* cls,
1346 intptr_t tags) { 1343 intptr_t tags) {
1347 // First check if object is a closure or has native fields. 1344 // First check if object is a closure or has native fields.
1348 CheckIfSerializable(cls); 1345 CheckIfSerializable(cls);
1349 1346
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 1390
1394 // Write out the class information for this object. 1391 // Write out the class information for this object.
1395 WriteObjectImpl(cls); 1392 WriteObjectImpl(cls);
1396 } 1393 }
1397 1394
1398 1395
1399 void SnapshotWriter::ThrowException(Exceptions::ExceptionType type, 1396 void SnapshotWriter::ThrowException(Exceptions::ExceptionType type,
1400 const char* msg) { 1397 const char* msg) {
1401 Isolate::Current()->object_store()->clear_sticky_error(); 1398 Isolate::Current()->object_store()->clear_sticky_error();
1402 UnmarkAll(); 1399 UnmarkAll();
1403 const String& msg_obj = String::Handle(String::New(msg)); 1400 if (msg != NULL) {
1404 const Array& args = Array::Handle(Array::New(1)); 1401 const String& msg_obj = String::Handle(String::New(msg));
1405 args.SetAt(0, msg_obj); 1402 const Array& args = Array::Handle(Array::New(1));
1406 Exceptions::ThrowByType(type, args); 1403 args.SetAt(0, msg_obj);
1404 Exceptions::ThrowByType(type, args);
1405 } else {
1406 Exceptions::ThrowByType(type, Object::empty_array());
1407 }
1407 UNREACHABLE(); 1408 UNREACHABLE();
1408 } 1409 }
1409 1410
1410 1411
1411 void ScriptSnapshotWriter::WriteScriptSnapshot(const Library& lib) { 1412 void ScriptSnapshotWriter::WriteScriptSnapshot(const Library& lib) {
1412 ASSERT(kind() == Snapshot::kScript); 1413 ASSERT(kind() == Snapshot::kScript);
1413 Isolate* isolate = Isolate::Current(); 1414 Isolate* isolate = Isolate::Current();
1414 ASSERT(isolate != NULL); 1415 ASSERT(isolate != NULL);
1415 ASSERT(ClassFinalizer::AllClassesFinalized()); 1416 ASSERT(ClassFinalizer::AllClassesFinalized());
1416 1417
1417 // Setup for long jump in case there is an exception while writing 1418 // Setup for long jump in case there is an exception while writing
1418 // the snapshot. 1419 // the snapshot.
1419 LongJump* base = isolate->long_jump_base(); 1420 LongJump* base = isolate->long_jump_base();
1420 LongJump jump; 1421 LongJump jump;
1421 isolate->set_long_jump_base(&jump); 1422 isolate->set_long_jump_base(&jump);
1422 *ErrorHandle() = LanguageError::New(
1423 String::Handle(String::New("Error while writing script snapshot")));
1424 if (setjmp(*jump.Set()) == 0) { 1423 if (setjmp(*jump.Set()) == 0) {
1425 // Write out the library object. 1424 // Write out the library object.
1426 NoGCScope no_gc; 1425 NoGCScope no_gc;
1427 ReserveHeader(); 1426 ReserveHeader();
1428 WriteObject(lib.raw()); 1427 WriteObject(lib.raw());
1429 FillHeader(kind()); 1428 FillHeader(kind());
1430 UnmarkAll(); 1429 UnmarkAll();
1431 isolate->set_long_jump_base(base); 1430 isolate->set_long_jump_base(base);
1432 } else { 1431 } else {
1433 isolate->set_long_jump_base(base); 1432 isolate->set_long_jump_base(base);
(...skipping 17 matching lines...) Expand all
1451 void MessageWriter::WriteMessage(const Object& obj) { 1450 void MessageWriter::WriteMessage(const Object& obj) {
1452 ASSERT(kind() == Snapshot::kMessage); 1451 ASSERT(kind() == Snapshot::kMessage);
1453 Isolate* isolate = Isolate::Current(); 1452 Isolate* isolate = Isolate::Current();
1454 ASSERT(isolate != NULL); 1453 ASSERT(isolate != NULL);
1455 1454
1456 // Setup for long jump in case there is an exception while writing 1455 // Setup for long jump in case there is an exception while writing
1457 // the message. 1456 // the message.
1458 LongJump* base = isolate->long_jump_base(); 1457 LongJump* base = isolate->long_jump_base();
1459 LongJump jump; 1458 LongJump jump;
1460 isolate->set_long_jump_base(&jump); 1459 isolate->set_long_jump_base(&jump);
1461 *ErrorHandle() = LanguageError::New(
1462 String::Handle(String::New("Error while writing message")));
1463 if (setjmp(*jump.Set()) == 0) { 1460 if (setjmp(*jump.Set()) == 0) {
1464 NoGCScope no_gc; 1461 NoGCScope no_gc;
1465 WriteObject(obj.raw()); 1462 WriteObject(obj.raw());
1466 UnmarkAll(); 1463 UnmarkAll();
1467 isolate->set_long_jump_base(base); 1464 isolate->set_long_jump_base(base);
1468 } else { 1465 } else {
1469 isolate->set_long_jump_base(base); 1466 isolate->set_long_jump_base(base);
1470 ThrowException(exception_type(), exception_msg()); 1467 ThrowException(exception_type(), exception_msg());
1471 } 1468 }
1472 } 1469 }
1473 1470
1474 1471
1475 } // namespace dart 1472 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/snapshot.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698