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

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

Issue 8918028: If an unhandled exception occurs in Dart_RunLoop, pass it out to the caller. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years 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
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart.h" 10 #include "vm/dart.h"
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
671 Dart_ClosePortCallback close_port_callback) { 671 Dart_ClosePortCallback close_port_callback) {
672 Isolate* isolate = Isolate::Current(); 672 Isolate* isolate = Isolate::Current();
673 CHECK_ISOLATE(isolate); 673 CHECK_ISOLATE(isolate);
674 ASSERT(post_message_callback != NULL); 674 ASSERT(post_message_callback != NULL);
675 ASSERT(close_port_callback != NULL); 675 ASSERT(close_port_callback != NULL);
676 isolate->set_post_message_callback(post_message_callback); 676 isolate->set_post_message_callback(post_message_callback);
677 isolate->set_close_port_callback(close_port_callback); 677 isolate->set_close_port_callback(close_port_callback);
678 } 678 }
679 679
680 680
681 DART_EXPORT Dart_Handle Dart_RunLoop() {
682 Isolate* isolate = Isolate::Current();
683 DARTSCOPE(isolate);
684
685 LongJump* base = isolate->long_jump_base();
686 LongJump jump;
687 Dart_Handle result;
688 isolate->set_long_jump_base(&jump);
689 if (setjmp(*jump.Set()) == 0) {
690 const Object& obj = Object::Handle(isolate->StandardRunLoop());
691 if (obj.IsUnhandledException()) {
692 result = Api::ErrorFromException(obj);
693 } else {
694 ASSERT(obj.IsNull());
695 result = Api::Success();
696 }
697 } else {
698 SetupErrorResult(&result);
699 }
700 isolate->set_long_jump_base(base);
701 return result;
702 }
703
704
681 static RawInstance* DeserializeMessage(void* data) { 705 static RawInstance* DeserializeMessage(void* data) {
682 // Create a snapshot object using the buffer. 706 // Create a snapshot object using the buffer.
683 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data); 707 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data);
684 ASSERT(snapshot->IsMessageSnapshot()); 708 ASSERT(snapshot->IsMessageSnapshot());
685 709
686 // Read object back from the snapshot. 710 // Read object back from the snapshot.
687 Isolate* isolate = Isolate::Current(); 711 Isolate* isolate = Isolate::Current();
688 SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); 712 SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store());
689 Instance& instance = Instance::Handle(); 713 Instance& instance = Instance::Handle();
690 instance ^= reader.ReadObject(); 714 instance ^= reader.ReadObject();
691 return instance.raw(); 715 return instance.raw();
692 } 716 }
693 717
694 718
695 DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port_id, 719 DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port_id,
696 Dart_Port reply_port_id, 720 Dart_Port reply_port_id,
697 Dart_Message dart_message) { 721 Dart_Message dart_message) {
698 DARTSCOPE(Isolate::Current()); 722 DARTSCOPE(Isolate::Current());
699
700 const Instance& msg = Instance::Handle(DeserializeMessage(dart_message)); 723 const Instance& msg = Instance::Handle(DeserializeMessage(dart_message));
701 const String& class_name = 724 // TODO(turnidge): Should this call should be wrapped in a longjmp?
tobyr 2011/12/14 17:48:32 s/should be/be
turnidge 2011/12/14 18:26:55 Done.
702 String::Handle(String::NewSymbol("ReceivePortImpl")); 725 const Object& result =
703 const String& function_name = 726 Object::Handle(DartLibraryCalls::HandleMessage(dest_port_id,
704 String::Handle(String::NewSymbol("_handleMessage")); 727 reply_port_id,
705 const int kNumArguments = 3; 728 msg));
706 const Array& kNoArgumentNames = Array::Handle();
707 const Function& function = Function::Handle(
708 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()),
709 class_name,
710 function_name,
711 kNumArguments,
712 kNoArgumentNames,
713 Resolver::kIsQualified));
714 GrowableArray<const Object*> arguments(kNumArguments);
715 arguments.Add(&Integer::Handle(Integer::New(dest_port_id)));
716 arguments.Add(&Integer::Handle(Integer::New(reply_port_id)));
717 arguments.Add(&msg);
718 // TODO(turnidge): This call should be wrapped in a longjmp
719 const Object& result = Object::Handle(
720 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames));
721 if (result.IsUnhandledException()) { 729 if (result.IsUnhandledException()) {
722 return Api::ErrorFromException(result); 730 return Api::ErrorFromException(result);
723 } 731 }
724 ASSERT(result.IsNull()); 732 ASSERT(result.IsNull());
725 return Api::Success(); 733 return Api::Success();
726 } 734 }
727 735
728 736
729 DART_EXPORT Dart_Handle Dart_RunLoop() {
730 Isolate* isolate = Isolate::Current();
731 DARTSCOPE(isolate);
732
733 LongJump* base = isolate->long_jump_base();
734 LongJump jump;
735 Dart_Handle result;
736 isolate->set_long_jump_base(&jump);
737 if (setjmp(*jump.Set()) == 0) {
738 isolate->StandardRunLoop();
739 result = Api::Success();
740 } else {
741 SetupErrorResult(&result);
742 }
743 isolate->set_long_jump_base(base);
744 return result;
745 }
746
747
748 DART_EXPORT bool Dart_HasLivePorts() { 737 DART_EXPORT bool Dart_HasLivePorts() {
749 Isolate* isolate = Isolate::Current(); 738 Isolate* isolate = Isolate::Current();
750 ASSERT(isolate); 739 ASSERT(isolate);
751 return isolate->live_ports() > 0; 740 return isolate->live_ports() > 0;
752 } 741 }
753 742
754 743
755 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 744 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
756 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); 745 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
757 return reinterpret_cast<uint8_t*>(new_ptr); 746 return reinterpret_cast<uint8_t*>(new_ptr);
(...skipping 1756 matching lines...) Expand 10 before | Expand all | Expand 10 after
2514 } 2503 }
2515 delete debug_region; 2504 delete debug_region;
2516 } else { 2505 } else {
2517 *buffer = NULL; 2506 *buffer = NULL;
2518 *buffer_size = 0; 2507 *buffer_size = 0;
2519 } 2508 }
2520 } 2509 }
2521 2510
2522 2511
2523 } // namespace dart 2512 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698