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

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

Issue 13351002: First step for fixing Issue 9416. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 8 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/dart_api_impl.h ('k') | tests/co19/co19-runtime.status » ('j') | 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/bigint_operations.h" 8 #include "vm/bigint_operations.h"
9 #include "vm/class_finalizer.h" 9 #include "vm/class_finalizer.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 intptr_t len = (length); \ 73 intptr_t len = (length); \
74 intptr_t max = (max_elements); \ 74 intptr_t max = (max_elements); \
75 if (len < 0 || len > max) { \ 75 if (len < 0 || len > max) { \
76 return Api::NewError( \ 76 return Api::NewError( \
77 "%s expects argument '%s' to be in the range [0..%"Pd"].", \ 77 "%s expects argument '%s' to be in the range [0..%"Pd"].", \
78 CURRENT_FUNC, #length, max); \ 78 CURRENT_FUNC, #length, max); \
79 } \ 79 } \
80 } while (0) 80 } while (0)
81 81
82 82
83 void SetupErrorResult(Isolate* isolate, Dart_Handle* handle) {
84 *handle = Api::NewHandle(
85 isolate, Isolate::Current()->object_store()->sticky_error());
86 }
87
88
89 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) { 83 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) {
90 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles(); 84 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles();
91 ASSERT(local_handles != NULL); 85 ASSERT(local_handles != NULL);
92 LocalHandle* ref = local_handles->AllocateHandle(); 86 LocalHandle* ref = local_handles->AllocateHandle();
93 ref->set_raw(raw); 87 ref->set_raw(raw);
94 return reinterpret_cast<Dart_Handle>(ref); 88 return reinterpret_cast<Dart_Handle>(ref);
95 } 89 }
96 90
97 RawObject* Api::UnwrapHandle(Dart_Handle object) { 91 RawObject* Api::UnwrapHandle(Dart_Handle object) {
98 #if defined(DEBUG) 92 #if defined(DEBUG)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 ASSERT(state.IsValidPrologueWeakPersistentHandle(object)); 146 ASSERT(state.IsValidPrologueWeakPersistentHandle(object));
153 return reinterpret_cast<FinalizablePersistentHandle*>(object); 147 return reinterpret_cast<FinalizablePersistentHandle*>(object);
154 } 148 }
155 149
156 150
157 Dart_Handle Api::CheckIsolateState(Isolate* isolate) { 151 Dart_Handle Api::CheckIsolateState(Isolate* isolate) {
158 if (ClassFinalizer::FinalizePendingClasses() && 152 if (ClassFinalizer::FinalizePendingClasses() &&
159 isolate->object_store()->PreallocateObjects()) { 153 isolate->object_store()->PreallocateObjects()) {
160 return Api::Success(isolate); 154 return Api::Success(isolate);
161 } 155 }
162 const Object& obj = Object::Handle(isolate->object_store()->sticky_error()); 156 ASSERT(isolate->object_store()->sticky_error() != Object::null());
163 ASSERT(obj.IsError()); 157 return Api::NewHandle(isolate, isolate->object_store()->sticky_error());
164 return Api::NewHandle(isolate, obj.raw());
165 } 158 }
166 159
167 160
168 Dart_Isolate Api::CastIsolate(Isolate* isolate) { 161 Dart_Isolate Api::CastIsolate(Isolate* isolate) {
169 return reinterpret_cast<Dart_Isolate>(isolate); 162 return reinterpret_cast<Dart_Isolate>(isolate);
170 } 163 }
171 164
172 165
173 Dart_Handle Api::Success(Isolate* isolate) { 166 Dart_Handle Api::Success(Isolate* isolate) {
174 ASSERT(isolate != NULL); 167 ASSERT(isolate != NULL);
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 RunLoopData* data = reinterpret_cast<RunLoopData*>(param); 958 RunLoopData* data = reinterpret_cast<RunLoopData*>(param);
966 ASSERT(data->monitor != NULL); 959 ASSERT(data->monitor != NULL);
967 MonitorLocker ml(data->monitor); 960 MonitorLocker ml(data->monitor);
968 data->done = true; 961 data->done = true;
969 ml.Notify(); 962 ml.Notify();
970 } 963 }
971 964
972 965
973 DART_EXPORT Dart_Handle Dart_RunLoop() { 966 DART_EXPORT Dart_Handle Dart_RunLoop() {
974 Isolate* isolate = Isolate::Current(); 967 Isolate* isolate = Isolate::Current();
975 968 CHECK_ISOLATE_SCOPE(isolate);
976 DARTSCOPE(isolate);
977 CHECK_CALLBACK_STATE(isolate); 969 CHECK_CALLBACK_STATE(isolate);
978 Monitor monitor; 970 Monitor monitor;
979 MonitorLocker ml(&monitor); 971 MonitorLocker ml(&monitor);
980 { 972 {
981 SwitchIsolateScope switch_scope(NULL); 973 SwitchIsolateScope switch_scope(NULL);
982 974
983 RunLoopData data; 975 RunLoopData data;
984 data.monitor = &monitor; 976 data.monitor = &monitor;
985 data.done = false; 977 data.done = false;
986 isolate->message_handler()->Run( 978 isolate->message_handler()->Run(
987 Dart::thread_pool(), 979 Dart::thread_pool(),
988 NULL, RunLoopDone, reinterpret_cast<uword>(&data)); 980 NULL, RunLoopDone, reinterpret_cast<uword>(&data));
989 while (!data.done) { 981 while (!data.done) {
990 ml.Wait(); 982 ml.Wait();
991 } 983 }
992 } 984 }
993 const Object& obj = Object::Handle(isolate->object_store()->sticky_error()); 985 if (isolate->object_store()->sticky_error() != Object::null()) {
994 isolate->object_store()->clear_sticky_error(); 986 Dart_Handle error = Api::NewHandle(isolate,
995 if (obj.IsError()) { 987 isolate->object_store()->sticky_error());
996 return Api::NewHandle(isolate, obj.raw()); 988 isolate->object_store()->clear_sticky_error();
989 return error;
997 } 990 }
998 ASSERT(obj.IsNull());
999 if (FLAG_print_class_table) { 991 if (FLAG_print_class_table) {
1000 isolate->class_table()->Print(); 992 isolate->class_table()->Print();
1001 } 993 }
1002 return Api::Success(isolate); 994 return Api::Success(isolate);
1003 } 995 }
1004 996
1005 997
1006 DART_EXPORT Dart_Handle Dart_HandleMessage() { 998 DART_EXPORT Dart_Handle Dart_HandleMessage() {
1007 Isolate* isolate = Isolate::Current(); 999 Isolate* isolate = Isolate::Current();
1008 CHECK_ISOLATE(isolate); 1000 CHECK_ISOLATE_SCOPE(isolate);
1001 CHECK_CALLBACK_STATE(isolate);
1009 if (!isolate->message_handler()->HandleNextMessage()) { 1002 if (!isolate->message_handler()->HandleNextMessage()) {
1010 Dart_Handle error = 1003 Dart_Handle error = Api::NewHandle(isolate,
1011 Api::NewHandle(isolate, isolate->object_store()->sticky_error()); 1004 isolate->object_store()->sticky_error());
1012 isolate->object_store()->clear_sticky_error(); 1005 isolate->object_store()->clear_sticky_error();
1013 return error; 1006 return error;
1014 } 1007 }
1015 return Api::Success(isolate); 1008 return Api::Success(isolate);
1016 } 1009 }
1017 1010
1018 1011
1019 DART_EXPORT bool Dart_HasLivePorts() { 1012 DART_EXPORT bool Dart_HasLivePorts() {
1020 Isolate* isolate = Isolate::Current(); 1013 Isolate* isolate = Isolate::Current();
1021 ASSERT(isolate); 1014 ASSERT(isolate);
(...skipping 3793 matching lines...) Expand 10 before | Expand all | Expand 10 after
4815 } 4808 }
4816 { 4809 {
4817 NoGCScope no_gc; 4810 NoGCScope no_gc;
4818 RawObject* raw_obj = obj.raw(); 4811 RawObject* raw_obj = obj.raw();
4819 isolate->heap()->SetPeer(raw_obj, peer); 4812 isolate->heap()->SetPeer(raw_obj, peer);
4820 } 4813 }
4821 return Api::Success(isolate); 4814 return Api::Success(isolate);
4822 } 4815 }
4823 4816
4824 } // namespace dart 4817 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.h ('k') | tests/co19/co19-runtime.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698