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

Side by Side Diff: vm/dart_api_impl.cc

Issue 12036098: First set of changes towards cleaning up the bytearray access APIs (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 7 years, 10 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 | « vm/dart_api_impl.h ('k') | vm/dart_api_impl_test.cc » ('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) 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 "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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 ASSERT(isolate != NULL); 185 ASSERT(isolate != NULL);
186 ApiState* state = isolate->api_state(); 186 ApiState* state = isolate->api_state();
187 ASSERT(state != NULL); 187 ASSERT(state != NULL);
188 PersistentHandle* true_handle = state->True(); 188 PersistentHandle* true_handle = state->True();
189 return reinterpret_cast<Dart_Handle>(true_handle); 189 return reinterpret_cast<Dart_Handle>(true_handle);
190 } 190 }
191 191
192 192
193 Dart_Handle Api::NewError(const char* format, ...) { 193 Dart_Handle Api::NewError(const char* format, ...) {
194 Isolate* isolate = Isolate::Current(); 194 Isolate* isolate = Isolate::Current();
195 DARTSCOPE_NOCHECKS(isolate); 195 DARTSCOPE(isolate);
196 CHECK_CALLBACK_STATE(isolate);
196 197
197 va_list args; 198 va_list args;
198 va_start(args, format); 199 va_start(args, format);
199 intptr_t len = OS::VSNPrint(NULL, 0, format, args); 200 intptr_t len = OS::VSNPrint(NULL, 0, format, args);
200 va_end(args); 201 va_end(args);
201 202
202 char* buffer = isolate->current_zone()->Alloc<char>(len + 1); 203 char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
203 va_list args2; 204 va_list args2;
204 va_start(args2, format); 205 va_start(args2, format);
205 OS::VSNPrint(buffer, (len + 1), format, args2); 206 OS::VSNPrint(buffer, (len + 1), format, args2);
206 va_end(args2); 207 va_end(args2);
207 208
208 const String& message = String::Handle(isolate, String::New(buffer)); 209 const String& message = String::Handle(isolate, String::New(buffer));
209 return Api::NewHandle(isolate, ApiError::New(message)); 210 return Api::NewHandle(isolate, ApiError::New(message));
210 } 211 }
211 212
212 213
214 void Api::SetupCallbackError(Isolate* isolate) {
215 ASSERT(isolate != NULL);
216 ApiState* state = isolate->api_state();
217 ASSERT(state != NULL);
218 state->SetupCallbackError();
219 }
220
221
222 Dart_Handle Api::CallbackError(Isolate* isolate) {
223 ASSERT(isolate != NULL);
224 ApiState* state = isolate->api_state();
225 ASSERT(state != NULL);
226 PersistentHandle* callback_error_handle = state->CallbackError();
227 return reinterpret_cast<Dart_Handle>(callback_error_handle);
228 }
229
230
213 Dart_Handle Api::Null(Isolate* isolate) { 231 Dart_Handle Api::Null(Isolate* isolate) {
214 ASSERT(isolate != NULL); 232 ASSERT(isolate != NULL);
215 ApiState* state = isolate->api_state(); 233 ApiState* state = isolate->api_state();
216 ASSERT(state != NULL); 234 ASSERT(state != NULL);
217 PersistentHandle* null_handle = state->Null(); 235 PersistentHandle* null_handle = state->Null();
218 return reinterpret_cast<Dart_Handle>(null_handle); 236 return reinterpret_cast<Dart_Handle>(null_handle);
219 } 237 }
220 238
221 239
222 Dart_Handle Api::True(Isolate* isolate) { 240 Dart_Handle Api::True(Isolate* isolate) {
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 return Api::NewError("Can only get stacktraces from error handles."); 407 return Api::NewError("Can only get stacktraces from error handles.");
390 } 408 }
391 } 409 }
392 410
393 411
394 // Deprecated. 412 // Deprecated.
395 // TODO(turnidge): Remove all uses and delete. 413 // TODO(turnidge): Remove all uses and delete.
396 DART_EXPORT Dart_Handle Dart_Error(const char* format, ...) { 414 DART_EXPORT Dart_Handle Dart_Error(const char* format, ...) {
397 Isolate* isolate = Isolate::Current(); 415 Isolate* isolate = Isolate::Current();
398 DARTSCOPE(isolate); 416 DARTSCOPE(isolate);
417 CHECK_CALLBACK_STATE(isolate);
399 418
400 va_list args; 419 va_list args;
401 va_start(args, format); 420 va_start(args, format);
402 intptr_t len = OS::VSNPrint(NULL, 0, format, args); 421 intptr_t len = OS::VSNPrint(NULL, 0, format, args);
403 va_end(args); 422 va_end(args);
404 423
405 char* buffer = isolate->current_zone()->Alloc<char>(len + 1); 424 char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
406 va_list args2; 425 va_list args2;
407 va_start(args2, format); 426 va_start(args2, format);
408 OS::VSNPrint(buffer, (len + 1), format, args2); 427 OS::VSNPrint(buffer, (len + 1), format, args2);
409 va_end(args2); 428 va_end(args2);
410 429
411 const String& message = String::Handle(isolate, String::New(buffer)); 430 const String& message = String::Handle(isolate, String::New(buffer));
412 return Api::NewHandle(isolate, ApiError::New(message)); 431 return Api::NewHandle(isolate, ApiError::New(message));
413 } 432 }
414 433
415 434
416 // TODO(turnidge): This clones Api::NewError. I need to use va_copy to 435 // TODO(turnidge): This clones Api::NewError. I need to use va_copy to
417 // fix this but not sure if it available on all of our builds. 436 // fix this but not sure if it available on all of our builds.
418 DART_EXPORT Dart_Handle Dart_NewApiError(const char* format, ...) { 437 DART_EXPORT Dart_Handle Dart_NewApiError(const char* format, ...) {
419 Isolate* isolate = Isolate::Current(); 438 Isolate* isolate = Isolate::Current();
420 DARTSCOPE(isolate); 439 DARTSCOPE(isolate);
440 CHECK_CALLBACK_STATE(isolate);
421 441
422 va_list args; 442 va_list args;
423 va_start(args, format); 443 va_start(args, format);
424 intptr_t len = OS::VSNPrint(NULL, 0, format, args); 444 intptr_t len = OS::VSNPrint(NULL, 0, format, args);
425 va_end(args); 445 va_end(args);
426 446
427 char* buffer = isolate->current_zone()->Alloc<char>(len + 1); 447 char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
428 va_list args2; 448 va_list args2;
429 va_start(args2, format); 449 va_start(args2, format);
430 OS::VSNPrint(buffer, (len + 1), format, args2); 450 OS::VSNPrint(buffer, (len + 1), format, args2);
431 va_end(args2); 451 va_end(args2);
432 452
433 const String& message = String::Handle(isolate, String::New(buffer)); 453 const String& message = String::Handle(isolate, String::New(buffer));
434 return Api::NewHandle(isolate, ApiError::New(message)); 454 return Api::NewHandle(isolate, ApiError::New(message));
435 } 455 }
436 456
437 457
438 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { 458 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) {
439 Isolate* isolate = Isolate::Current(); 459 Isolate* isolate = Isolate::Current();
440 DARTSCOPE(isolate); 460 DARTSCOPE(isolate);
461 CHECK_CALLBACK_STATE(isolate);
462
441 const Instance& obj = Api::UnwrapInstanceHandle(isolate, exception); 463 const Instance& obj = Api::UnwrapInstanceHandle(isolate, exception);
442 if (obj.IsNull()) { 464 if (obj.IsNull()) {
443 RETURN_TYPE_ERROR(isolate, exception, Instance); 465 RETURN_TYPE_ERROR(isolate, exception, Instance);
444 } 466 }
445 const Instance& stacktrace = Instance::Handle(isolate); 467 const Instance& stacktrace = Instance::Handle(isolate);
446 return Api::NewHandle(isolate, UnhandledException::New(obj, stacktrace)); 468 return Api::NewHandle(isolate, UnhandledException::New(obj, stacktrace));
447 } 469 }
448 470
449 471
450 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { 472 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 } 516 }
495 517
496 518
497 DART_EXPORT Dart_Handle Dart_ToString(Dart_Handle object) { 519 DART_EXPORT Dart_Handle Dart_ToString(Dart_Handle object) {
498 Isolate* isolate = Isolate::Current(); 520 Isolate* isolate = Isolate::Current();
499 DARTSCOPE(isolate); 521 DARTSCOPE(isolate);
500 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 522 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
501 if (obj.IsString()) { 523 if (obj.IsString()) {
502 return Api::NewHandle(isolate, obj.raw()); 524 return Api::NewHandle(isolate, obj.raw());
503 } else if (obj.IsInstance()) { 525 } else if (obj.IsInstance()) {
526 CHECK_CALLBACK_STATE(isolate);
504 const Instance& receiver = Instance::Cast(obj); 527 const Instance& receiver = Instance::Cast(obj);
505 return Api::NewHandle(isolate, DartLibraryCalls::ToString(receiver)); 528 return Api::NewHandle(isolate, DartLibraryCalls::ToString(receiver));
506 } else { 529 } else {
530 CHECK_CALLBACK_STATE(isolate);
507 // This is a VM internal object. Call the C++ method of printing. 531 // This is a VM internal object. Call the C++ method of printing.
508 return Api::NewHandle(isolate, String::New(obj.ToCString())); 532 return Api::NewHandle(isolate, String::New(obj.ToCString()));
509 } 533 }
510 } 534 }
511 535
512 536
513 DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2) { 537 DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2) {
514 Isolate* isolate = Isolate::Current(); 538 Isolate* isolate = Isolate::Current();
515 CHECK_ISOLATE(isolate); 539 CHECK_ISOLATE(isolate);
516 NoGCScope ngc; 540 NoGCScope ngc;
517 return Api::UnwrapHandle(obj1) == Api::UnwrapHandle(obj2); 541 return Api::UnwrapHandle(obj1) == Api::UnwrapHandle(obj2);
518 } 542 }
519 543
520 544
521 DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { 545 DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) {
522 Isolate* isolate = Isolate::Current(); 546 Isolate* isolate = Isolate::Current();
523 CHECK_ISOLATE(isolate); 547 DARTSCOPE(isolate);
524 DARTSCOPE_NOCHECKS(isolate);
525 ApiState* state = isolate->api_state(); 548 ApiState* state = isolate->api_state();
526 ASSERT(state != NULL); 549 ASSERT(state != NULL);
527 const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object)); 550 const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object));
528 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); 551 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle();
529 new_ref->set_raw(old_ref); 552 new_ref->set_raw(old_ref);
530 return reinterpret_cast<Dart_Handle>(new_ref); 553 return reinterpret_cast<Dart_Handle>(new_ref);
531 } 554 }
532 555
533 static Dart_Handle AllocateFinalizableHandle( 556 static Dart_Handle AllocateFinalizableHandle(
534 Isolate* isolate, 557 Isolate* isolate,
535 FinalizablePersistentHandles* handles, 558 FinalizablePersistentHandles* handles,
536 Dart_Handle object, 559 Dart_Handle object,
537 void* peer, 560 void* peer,
538 Dart_WeakPersistentHandleFinalizer callback) { 561 Dart_WeakPersistentHandleFinalizer callback) {
539 const Object& ref = Object::Handle(isolate, Api::UnwrapHandle(object)); 562 const Object& ref = Object::Handle(isolate, Api::UnwrapHandle(object));
540 FinalizablePersistentHandle* finalizable_ref = handles->AllocateHandle(); 563 FinalizablePersistentHandle* finalizable_ref = handles->AllocateHandle();
541 finalizable_ref->set_raw(ref); 564 finalizable_ref->set_raw(ref);
542 finalizable_ref->set_peer(peer); 565 finalizable_ref->set_peer(peer);
543 finalizable_ref->set_callback(callback); 566 finalizable_ref->set_callback(callback);
544 return reinterpret_cast<Dart_Handle>(finalizable_ref); 567 return reinterpret_cast<Dart_Handle>(finalizable_ref);
545 } 568 }
546 569
547 570
548 DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( 571 DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle(
549 Dart_Handle object, 572 Dart_Handle object,
550 void* peer, 573 void* peer,
551 Dart_WeakPersistentHandleFinalizer callback) { 574 Dart_WeakPersistentHandleFinalizer callback) {
552 Isolate* isolate = Isolate::Current(); 575 Isolate* isolate = Isolate::Current();
553 CHECK_ISOLATE(isolate); 576 DARTSCOPE(isolate);
554 DARTSCOPE_NOCHECKS(isolate);
555 ApiState* state = isolate->api_state(); 577 ApiState* state = isolate->api_state();
556 ASSERT(state != NULL); 578 ASSERT(state != NULL);
557 return AllocateFinalizableHandle(isolate, 579 return AllocateFinalizableHandle(isolate,
558 &state->weak_persistent_handles(), 580 &state->weak_persistent_handles(),
559 object, 581 object,
560 peer, 582 peer,
561 callback); 583 callback);
562 } 584 }
563 585
564 586
565 DART_EXPORT Dart_Handle Dart_NewPrologueWeakPersistentHandle( 587 DART_EXPORT Dart_Handle Dart_NewPrologueWeakPersistentHandle(
566 Dart_Handle object, 588 Dart_Handle object,
567 void* peer, 589 void* peer,
568 Dart_WeakPersistentHandleFinalizer callback) { 590 Dart_WeakPersistentHandleFinalizer callback) {
569 Isolate* isolate = Isolate::Current(); 591 Isolate* isolate = Isolate::Current();
570 CHECK_ISOLATE(isolate); 592 DARTSCOPE(isolate);
571 DARTSCOPE_NOCHECKS(isolate);
572 ApiState* state = isolate->api_state(); 593 ApiState* state = isolate->api_state();
573 ASSERT(state != NULL); 594 ASSERT(state != NULL);
574 return AllocateFinalizableHandle(isolate, 595 return AllocateFinalizableHandle(isolate,
575 &state->prologue_weak_persistent_handles(), 596 &state->prologue_weak_persistent_handles(),
576 object, 597 object,
577 peer, 598 peer,
578 callback); 599 callback);
579 } 600 }
580 601
581 602
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* script_uri, 824 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* script_uri,
804 const char* main, 825 const char* main,
805 const uint8_t* snapshot, 826 const uint8_t* snapshot,
806 void* callback_data, 827 void* callback_data,
807 char** error) { 828 char** error) {
808 char* isolate_name = BuildIsolateName(script_uri, main); 829 char* isolate_name = BuildIsolateName(script_uri, main);
809 Isolate* isolate = Dart::CreateIsolate(isolate_name); 830 Isolate* isolate = Dart::CreateIsolate(isolate_name);
810 free(isolate_name); 831 free(isolate_name);
811 { 832 {
812 StackZone zone(isolate); 833 StackZone zone(isolate);
813 DARTSCOPE_NOCHECKS(isolate); 834 HANDLESCOPE(isolate);
814 const Error& error_obj = 835 const Error& error_obj =
815 Error::Handle(isolate, 836 Error::Handle(isolate,
816 Dart::InitializeIsolate(snapshot, callback_data)); 837 Dart::InitializeIsolate(snapshot, callback_data));
817 if (error_obj.IsNull()) { 838 if (error_obj.IsNull()) {
818 START_TIMER(time_total_runtime); 839 START_TIMER(time_total_runtime);
819 return reinterpret_cast<Dart_Isolate>(isolate); 840 return reinterpret_cast<Dart_Isolate>(isolate);
820 } 841 }
821 *error = strdup(error_obj.ToErrorCString()); 842 *error = strdup(error_obj.ToErrorCString());
822 } 843 }
823 Dart::ShutdownIsolate(); 844 Dart::ShutdownIsolate();
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 MonitorLocker ml(data->monitor); 978 MonitorLocker ml(data->monitor);
958 data->done = true; 979 data->done = true;
959 ml.Notify(); 980 ml.Notify();
960 } 981 }
961 982
962 983
963 DART_EXPORT Dart_Handle Dart_RunLoop() { 984 DART_EXPORT Dart_Handle Dart_RunLoop() {
964 Isolate* isolate = Isolate::Current(); 985 Isolate* isolate = Isolate::Current();
965 986
966 DARTSCOPE(isolate); 987 DARTSCOPE(isolate);
988 CHECK_CALLBACK_STATE(isolate);
967 Monitor monitor; 989 Monitor monitor;
968 MonitorLocker ml(&monitor); 990 MonitorLocker ml(&monitor);
969 { 991 {
970 SwitchIsolateScope switch_scope(NULL); 992 SwitchIsolateScope switch_scope(NULL);
971 993
972 RunLoopData data; 994 RunLoopData data;
973 data.monitor = &monitor; 995 data.monitor = &monitor;
974 data.done = false; 996 data.done = false;
975 isolate->message_handler()->Run( 997 isolate->message_handler()->Run(
976 Dart::thread_pool(), 998 Dart::thread_pool(),
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 1061
1040 // Post the message at the given port. 1062 // Post the message at the given port.
1041 return PortMap::PostMessage(new Message( 1063 return PortMap::PostMessage(new Message(
1042 port_id, Message::kIllegalPort, buffer, writer.BytesWritten(), 1064 port_id, Message::kIllegalPort, buffer, writer.BytesWritten(),
1043 Message::kNormalPriority)); 1065 Message::kNormalPriority));
1044 } 1066 }
1045 1067
1046 1068
1047 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) { 1069 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) {
1048 Isolate* isolate = Isolate::Current(); 1070 Isolate* isolate = Isolate::Current();
1049 CHECK_ISOLATE(isolate); 1071 DARTSCOPE(isolate);
1050 DARTSCOPE_NOCHECKS(isolate);
1051 const Object& object = Object::Handle(isolate, Api::UnwrapHandle(handle)); 1072 const Object& object = Object::Handle(isolate, Api::UnwrapHandle(handle));
1052 uint8_t* data = NULL; 1073 uint8_t* data = NULL;
1053 MessageWriter writer(&data, &allocator); 1074 MessageWriter writer(&data, &allocator);
1054 writer.WriteMessage(object); 1075 writer.WriteMessage(object);
1055 intptr_t len = writer.BytesWritten(); 1076 intptr_t len = writer.BytesWritten();
1056 return PortMap::PostMessage(new Message( 1077 return PortMap::PostMessage(new Message(
1057 port_id, Message::kIllegalPort, data, len, Message::kNormalPriority)); 1078 port_id, Message::kIllegalPort, data, len, Message::kNormalPriority));
1058 } 1079 }
1059 1080
1060 1081
(...skipping 25 matching lines...) Expand all
1086 Isolate::SetCurrent(NULL); 1107 Isolate::SetCurrent(NULL);
1087 1108
1088 // TODO(turnidge): Check that the port is native before trying to close. 1109 // TODO(turnidge): Check that the port is native before trying to close.
1089 return PortMap::ClosePort(native_port_id); 1110 return PortMap::ClosePort(native_port_id);
1090 } 1111 }
1091 1112
1092 1113
1093 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) { 1114 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) {
1094 Isolate* isolate = Isolate::Current(); 1115 Isolate* isolate = Isolate::Current();
1095 DARTSCOPE(isolate); 1116 DARTSCOPE(isolate);
1117 CHECK_CALLBACK_STATE(isolate);
1096 return Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); 1118 return Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
1097 } 1119 }
1098 1120
1099 1121
1100 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { 1122 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) {
1101 Isolate* isolate = Isolate::Current(); 1123 Isolate* isolate = Isolate::Current();
1102 DARTSCOPE(isolate); 1124 DARTSCOPE(isolate);
1125 CHECK_CALLBACK_STATE(isolate);
1126
1103 Library& isolate_lib = Library::Handle(isolate, Library::IsolateLibrary()); 1127 Library& isolate_lib = Library::Handle(isolate, Library::IsolateLibrary());
1104 ASSERT(!isolate_lib.IsNull()); 1128 ASSERT(!isolate_lib.IsNull());
1105 const String& class_name = String::Handle( 1129 const String& class_name = String::Handle(
1106 isolate, isolate_lib.PrivateName(Symbols::_ReceivePortImpl())); 1130 isolate, isolate_lib.PrivateName(Symbols::_ReceivePortImpl()));
1107 // TODO(asiva): Symbols should contain private keys. 1131 // TODO(asiva): Symbols should contain private keys.
1108 const String& function_name = 1132 const String& function_name =
1109 String::Handle(isolate_lib.PrivateName(Symbols::_get_or_create())); 1133 String::Handle(isolate_lib.PrivateName(Symbols::_get_or_create()));
1110 const int kNumArguments = 1; 1134 const int kNumArguments = 1;
1111 const Function& function = Function::Handle( 1135 const Function& function = Function::Handle(
1112 isolate, 1136 isolate,
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 1208
1185 DART_EXPORT bool Dart_IsNull(Dart_Handle object) { 1209 DART_EXPORT bool Dart_IsNull(Dart_Handle object) {
1186 return Api::ClassId(object) == kNullCid; 1210 return Api::ClassId(object) == kNullCid;
1187 } 1211 }
1188 1212
1189 1213
1190 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, 1214 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2,
1191 bool* value) { 1215 bool* value) {
1192 Isolate* isolate = Isolate::Current(); 1216 Isolate* isolate = Isolate::Current();
1193 DARTSCOPE(isolate); 1217 DARTSCOPE(isolate);
1218 CHECK_CALLBACK_STATE(isolate);
1194 const Instance& expected = 1219 const Instance& expected =
1195 Instance::CheckedHandle(isolate, Api::UnwrapHandle(obj1)); 1220 Instance::CheckedHandle(isolate, Api::UnwrapHandle(obj1));
1196 const Instance& actual = 1221 const Instance& actual =
1197 Instance::CheckedHandle(isolate, Api::UnwrapHandle(obj2)); 1222 Instance::CheckedHandle(isolate, Api::UnwrapHandle(obj2));
1198 const Object& result = 1223 const Object& result =
1199 Object::Handle(isolate, DartLibraryCalls::Equals(expected, actual)); 1224 Object::Handle(isolate, DartLibraryCalls::Equals(expected, actual));
1200 if (result.IsBool()) { 1225 if (result.IsBool()) {
1201 *value = Bool::Cast(result).value(); 1226 *value = Bool::Cast(result).value();
1202 return Api::Success(isolate); 1227 return Api::Success(isolate);
1203 } else if (result.IsError()) { 1228 } else if (result.IsError()) {
(...skipping 24 matching lines...) Expand all
1228 return Api::NewError( 1253 return Api::NewError(
1229 "%s expects argument 'object' to be an instance of Object.", 1254 "%s expects argument 'object' to be an instance of Object.",
1230 CURRENT_FUNC); 1255 CURRENT_FUNC);
1231 } 1256 }
1232 // Finalize all classes. 1257 // Finalize all classes.
1233 const char* msg = CheckIsolateState(isolate); 1258 const char* msg = CheckIsolateState(isolate);
1234 if (msg != NULL) { 1259 if (msg != NULL) {
1235 return Api::NewError("%s", msg); 1260 return Api::NewError("%s", msg);
1236 } 1261 }
1237 if (obj.IsInstance()) { 1262 if (obj.IsInstance()) {
1263 CHECK_CALLBACK_STATE(isolate);
1238 const Type& type = Type::Handle(isolate, 1264 const Type& type = Type::Handle(isolate,
1239 Type::NewNonParameterizedType(cls)); 1265 Type::NewNonParameterizedType(cls));
1240 Error& malformed_type_error = Error::Handle(isolate); 1266 Error& malformed_type_error = Error::Handle(isolate);
1241 *value = Instance::Cast(obj).IsInstanceOf(type, 1267 *value = Instance::Cast(obj).IsInstanceOf(type,
1242 TypeArguments::Handle(isolate), 1268 TypeArguments::Handle(isolate),
1243 &malformed_type_error); 1269 &malformed_type_error);
1244 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. 1270 ASSERT(malformed_type_error.IsNull()); // Type was created from a class.
1245 } else { 1271 } else {
1246 *value = false; 1272 *value = false;
1247 } 1273 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 bool* fits) { 1318 bool* fits) {
1293 // Fast path for Smis and Mints. 1319 // Fast path for Smis and Mints.
1294 Isolate* isolate = Isolate::Current(); 1320 Isolate* isolate = Isolate::Current();
1295 CHECK_ISOLATE(isolate); 1321 CHECK_ISOLATE(isolate);
1296 intptr_t class_id = Api::ClassId(integer); 1322 intptr_t class_id = Api::ClassId(integer);
1297 if (class_id == kSmiCid || class_id == kMintCid) { 1323 if (class_id == kSmiCid || class_id == kMintCid) {
1298 *fits = true; 1324 *fits = true;
1299 return Api::Success(isolate); 1325 return Api::Success(isolate);
1300 } 1326 }
1301 // Slow path for Mints and Bigints. 1327 // Slow path for Mints and Bigints.
1302 DARTSCOPE_NOCHECKS(isolate); 1328 DARTSCOPE(isolate);
1303 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 1329 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
1304 if (int_obj.IsNull()) { 1330 if (int_obj.IsNull()) {
1305 RETURN_TYPE_ERROR(isolate, integer, Integer); 1331 RETURN_TYPE_ERROR(isolate, integer, Integer);
1306 } 1332 }
1307 ASSERT(!BigintOperations::FitsIntoMint(Bigint::Cast(int_obj))); 1333 ASSERT(!BigintOperations::FitsIntoMint(Bigint::Cast(int_obj)));
1308 *fits = false; 1334 *fits = false;
1309 return Api::Success(isolate); 1335 return Api::Success(isolate);
1310 } 1336 }
1311 1337
1312 1338
1313 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, 1339 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer,
1314 bool* fits) { 1340 bool* fits) {
1315 // Fast path for Smis. 1341 // Fast path for Smis.
1316 Isolate* isolate = Isolate::Current(); 1342 Isolate* isolate = Isolate::Current();
1317 CHECK_ISOLATE(isolate); 1343 CHECK_ISOLATE(isolate);
1318 if (Api::IsSmi(integer)) { 1344 if (Api::IsSmi(integer)) {
1319 *fits = (Api::SmiValue(integer) >= 0); 1345 *fits = (Api::SmiValue(integer) >= 0);
1320 return Api::Success(isolate); 1346 return Api::Success(isolate);
1321 } 1347 }
1322 // Slow path for Mints and Bigints. 1348 // Slow path for Mints and Bigints.
1323 DARTSCOPE_NOCHECKS(isolate); 1349 DARTSCOPE(isolate);
1324 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 1350 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
1325 if (int_obj.IsNull()) { 1351 if (int_obj.IsNull()) {
1326 RETURN_TYPE_ERROR(isolate, integer, Integer); 1352 RETURN_TYPE_ERROR(isolate, integer, Integer);
1327 } 1353 }
1328 ASSERT(!int_obj.IsSmi()); 1354 ASSERT(!int_obj.IsSmi());
1329 if (int_obj.IsMint()) { 1355 if (int_obj.IsMint()) {
1330 *fits = !int_obj.IsNegative(); 1356 *fits = !int_obj.IsNegative();
1331 } else { 1357 } else {
1332 *fits = BigintOperations::FitsIntoUint64(Bigint::Cast(int_obj)); 1358 *fits = BigintOperations::FitsIntoUint64(Bigint::Cast(int_obj));
1333 } 1359 }
1334 return Api::Success(isolate); 1360 return Api::Success(isolate);
1335 } 1361 }
1336 1362
1337 1363
1338 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { 1364 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) {
1339 // Fast path for Smis. 1365 // Fast path for Smis.
1340 Isolate* isolate = Isolate::Current(); 1366 Isolate* isolate = Isolate::Current();
1341 CHECK_ISOLATE(isolate); 1367 CHECK_ISOLATE(isolate);
1342 if (Smi::IsValid64(value)) { 1368 if (Smi::IsValid64(value)) {
1343 NOHANDLESCOPE(isolate); 1369 NOHANDLESCOPE(isolate);
1344 return Api::NewHandle(isolate, Smi::New(static_cast<intptr_t>(value))); 1370 return Api::NewHandle(isolate, Smi::New(static_cast<intptr_t>(value)));
1345 } 1371 }
1346 // Slow path for Mints and Bigints. 1372 // Slow path for Mints and Bigints.
1347 DARTSCOPE_NOCHECKS(isolate); 1373 DARTSCOPE(isolate);
1374 CHECK_CALLBACK_STATE(isolate);
1348 return Api::NewHandle(isolate, Integer::New(value)); 1375 return Api::NewHandle(isolate, Integer::New(value));
1349 } 1376 }
1350 1377
1351 1378
1352 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { 1379 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) {
1353 Isolate* isolate = Isolate::Current(); 1380 Isolate* isolate = Isolate::Current();
1354 DARTSCOPE(isolate); 1381 DARTSCOPE(isolate);
1382 CHECK_CALLBACK_STATE(isolate);
1355 const String& str_obj = String::Handle(isolate, String::New(str)); 1383 const String& str_obj = String::Handle(isolate, String::New(str));
1356 return Api::NewHandle(isolate, Integer::New(str_obj)); 1384 return Api::NewHandle(isolate, Integer::New(str_obj));
1357 } 1385 }
1358 1386
1359 1387
1360 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, 1388 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer,
1361 int64_t* value) { 1389 int64_t* value) {
1362 // Fast path for Smis. 1390 // Fast path for Smis.
1363 Isolate* isolate = Isolate::Current(); 1391 Isolate* isolate = Isolate::Current();
1364 CHECK_ISOLATE(isolate); 1392 CHECK_ISOLATE(isolate);
1365 if (Api::IsSmi(integer)) { 1393 if (Api::IsSmi(integer)) {
1366 *value = Api::SmiValue(integer); 1394 *value = Api::SmiValue(integer);
1367 return Api::Success(isolate); 1395 return Api::Success(isolate);
1368 } 1396 }
1369 // Slow path for Mints and Bigints. 1397 // Slow path for Mints and Bigints.
1370 DARTSCOPE_NOCHECKS(isolate); 1398 DARTSCOPE(isolate);
1371 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 1399 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
1372 if (int_obj.IsNull()) { 1400 if (int_obj.IsNull()) {
1373 RETURN_TYPE_ERROR(isolate, integer, Integer); 1401 RETURN_TYPE_ERROR(isolate, integer, Integer);
1374 } 1402 }
1375 ASSERT(!int_obj.IsSmi()); 1403 ASSERT(!int_obj.IsSmi());
1376 if (int_obj.IsMint()) { 1404 if (int_obj.IsMint()) {
1377 *value = int_obj.AsInt64Value(); 1405 *value = int_obj.AsInt64Value();
1378 return Api::Success(isolate); 1406 return Api::Success(isolate);
1379 } else { 1407 } else {
1380 const Bigint& bigint = Bigint::Cast(int_obj); 1408 const Bigint& bigint = Bigint::Cast(int_obj);
(...skipping 13 matching lines...) Expand all
1394 Isolate* isolate = Isolate::Current(); 1422 Isolate* isolate = Isolate::Current();
1395 CHECK_ISOLATE(isolate); 1423 CHECK_ISOLATE(isolate);
1396 if (Api::IsSmi(integer)) { 1424 if (Api::IsSmi(integer)) {
1397 intptr_t smi_value = Api::SmiValue(integer); 1425 intptr_t smi_value = Api::SmiValue(integer);
1398 if (smi_value >= 0) { 1426 if (smi_value >= 0) {
1399 *value = smi_value; 1427 *value = smi_value;
1400 return Api::Success(isolate); 1428 return Api::Success(isolate);
1401 } 1429 }
1402 } 1430 }
1403 // Slow path for Mints and Bigints. 1431 // Slow path for Mints and Bigints.
1404 DARTSCOPE_NOCHECKS(isolate); 1432 DARTSCOPE(isolate);
1405 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); 1433 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer);
1406 if (int_obj.IsNull()) { 1434 if (int_obj.IsNull()) {
1407 RETURN_TYPE_ERROR(isolate, integer, Integer); 1435 RETURN_TYPE_ERROR(isolate, integer, Integer);
1408 } 1436 }
1409 ASSERT(!int_obj.IsSmi()); 1437 ASSERT(!int_obj.IsSmi());
1410 if (int_obj.IsMint() && !int_obj.IsNegative()) { 1438 if (int_obj.IsMint() && !int_obj.IsNegative()) {
1411 *value = int_obj.AsInt64Value(); 1439 *value = int_obj.AsInt64Value();
1412 return Api::Success(isolate); 1440 return Api::Success(isolate);
1413 } else { 1441 } else {
1414 const Bigint& bigint = Bigint::Cast(int_obj); 1442 const Bigint& bigint = Bigint::Cast(int_obj);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1493 1521
1494 1522
1495 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) { 1523 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) {
1496 return Api::ClassId(object) == kDoubleCid; 1524 return Api::ClassId(object) == kDoubleCid;
1497 } 1525 }
1498 1526
1499 1527
1500 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { 1528 DART_EXPORT Dart_Handle Dart_NewDouble(double value) {
1501 Isolate* isolate = Isolate::Current(); 1529 Isolate* isolate = Isolate::Current();
1502 DARTSCOPE(isolate); 1530 DARTSCOPE(isolate);
1531 CHECK_CALLBACK_STATE(isolate);
1503 return Api::NewHandle(isolate, Double::New(value)); 1532 return Api::NewHandle(isolate, Double::New(value));
1504 } 1533 }
1505 1534
1506 1535
1507 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, 1536 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj,
1508 double* value) { 1537 double* value) {
1509 Isolate* isolate = Isolate::Current(); 1538 Isolate* isolate = Isolate::Current();
1510 DARTSCOPE(isolate); 1539 DARTSCOPE(isolate);
1511 const Double& obj = Api::UnwrapDoubleHandle(isolate, double_obj); 1540 const Double& obj = Api::UnwrapDoubleHandle(isolate, double_obj);
1512 if (obj.IsNull()) { 1541 if (obj.IsNull()) {
(...skipping 28 matching lines...) Expand all
1541 return Api::Success(isolate); 1570 return Api::Success(isolate);
1542 } 1571 }
1543 1572
1544 1573
1545 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { 1574 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) {
1546 Isolate* isolate = Isolate::Current(); 1575 Isolate* isolate = Isolate::Current();
1547 DARTSCOPE(isolate); 1576 DARTSCOPE(isolate);
1548 if (str == NULL) { 1577 if (str == NULL) {
1549 RETURN_NULL_ERROR(str); 1578 RETURN_NULL_ERROR(str);
1550 } 1579 }
1580 CHECK_CALLBACK_STATE(isolate);
1551 return Api::NewHandle(isolate, String::New(str)); 1581 return Api::NewHandle(isolate, String::New(str));
1552 } 1582 }
1553 1583
1554 1584
1555 DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array, 1585 DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array,
1556 intptr_t length) { 1586 intptr_t length) {
1557 Isolate* isolate = Isolate::Current(); 1587 Isolate* isolate = Isolate::Current();
1558 DARTSCOPE(isolate); 1588 DARTSCOPE(isolate);
1559 if (utf8_array == NULL && length != 0) { 1589 if (utf8_array == NULL && length != 0) {
1560 RETURN_NULL_ERROR(utf8_array); 1590 RETURN_NULL_ERROR(utf8_array);
1561 } 1591 }
1562 CHECK_LENGTH(length, String::kMaxElements); 1592 CHECK_LENGTH(length, String::kMaxElements);
1563 if (!Utf8::IsValid(utf8_array, length)) { 1593 if (!Utf8::IsValid(utf8_array, length)) {
1564 return Api::NewError("%s expects argument 'str' to be valid UTF-8.", 1594 return Api::NewError("%s expects argument 'str' to be valid UTF-8.",
1565 CURRENT_FUNC); 1595 CURRENT_FUNC);
1566 } 1596 }
1597 CHECK_CALLBACK_STATE(isolate);
1567 return Api::NewHandle(isolate, String::FromUTF8(utf8_array, length)); 1598 return Api::NewHandle(isolate, String::FromUTF8(utf8_array, length));
1568 } 1599 }
1569 1600
1570 1601
1571 DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array, 1602 DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array,
1572 intptr_t length) { 1603 intptr_t length) {
1573 Isolate* isolate = Isolate::Current(); 1604 Isolate* isolate = Isolate::Current();
1574 DARTSCOPE(isolate); 1605 DARTSCOPE(isolate);
1575 if (utf16_array == NULL && length != 0) { 1606 if (utf16_array == NULL && length != 0) {
1576 RETURN_NULL_ERROR(utf16_array); 1607 RETURN_NULL_ERROR(utf16_array);
1577 } 1608 }
1578 CHECK_LENGTH(length, String::kMaxElements); 1609 CHECK_LENGTH(length, String::kMaxElements);
1610 CHECK_CALLBACK_STATE(isolate);
1579 return Api::NewHandle(isolate, String::FromUTF16(utf16_array, length)); 1611 return Api::NewHandle(isolate, String::FromUTF16(utf16_array, length));
1580 } 1612 }
1581 1613
1582 1614
1583 DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array, 1615 DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array,
1584 intptr_t length) { 1616 intptr_t length) {
1585 Isolate* isolate = Isolate::Current(); 1617 Isolate* isolate = Isolate::Current();
1586 DARTSCOPE(isolate); 1618 DARTSCOPE(isolate);
1587 if (utf32_array == NULL && length != 0) { 1619 if (utf32_array == NULL && length != 0) {
1588 RETURN_NULL_ERROR(utf32_array); 1620 RETURN_NULL_ERROR(utf32_array);
1589 } 1621 }
1590 CHECK_LENGTH(length, String::kMaxElements); 1622 CHECK_LENGTH(length, String::kMaxElements);
1623 CHECK_CALLBACK_STATE(isolate);
1591 return Api::NewHandle(isolate, String::FromUTF32(utf32_array, length)); 1624 return Api::NewHandle(isolate, String::FromUTF32(utf32_array, length));
1592 } 1625 }
1593 1626
1594 1627
1595 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object) { 1628 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object) {
1596 return RawObject::IsExternalStringClassId(Api::ClassId(object)); 1629 return RawObject::IsExternalStringClassId(Api::ClassId(object));
1597 } 1630 }
1598 1631
1599 1632
1600 DART_EXPORT Dart_Handle Dart_ExternalStringGetPeer(Dart_Handle object, 1633 DART_EXPORT Dart_Handle Dart_ExternalStringGetPeer(Dart_Handle object,
(...skipping 22 matching lines...) Expand all
1623 const uint8_t* latin1_array, 1656 const uint8_t* latin1_array,
1624 intptr_t length, 1657 intptr_t length,
1625 void* peer, 1658 void* peer,
1626 Dart_PeerFinalizer cback) { 1659 Dart_PeerFinalizer cback) {
1627 Isolate* isolate = Isolate::Current(); 1660 Isolate* isolate = Isolate::Current();
1628 DARTSCOPE(isolate); 1661 DARTSCOPE(isolate);
1629 if (latin1_array == NULL && length != 0) { 1662 if (latin1_array == NULL && length != 0) {
1630 RETURN_NULL_ERROR(latin1_array); 1663 RETURN_NULL_ERROR(latin1_array);
1631 } 1664 }
1632 CHECK_LENGTH(length, String::kMaxElements); 1665 CHECK_LENGTH(length, String::kMaxElements);
1666 CHECK_CALLBACK_STATE(isolate);
1633 return Api::NewHandle(isolate, 1667 return Api::NewHandle(isolate,
1634 String::NewExternal(latin1_array, length, peer, cback)); 1668 String::NewExternal(latin1_array, length, peer, cback));
1635 } 1669 }
1636 1670
1637 1671
1638 DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array, 1672 DART_EXPORT Dart_Handle Dart_NewExternalUTF16String(const uint16_t* utf16_array,
1639 intptr_t length, 1673 intptr_t length,
1640 void* peer, 1674 void* peer,
1641 Dart_PeerFinalizer cback) { 1675 Dart_PeerFinalizer cback) {
1642 Isolate* isolate = Isolate::Current(); 1676 Isolate* isolate = Isolate::Current();
1643 DARTSCOPE(isolate); 1677 DARTSCOPE(isolate);
1644 if (utf16_array == NULL && length != 0) { 1678 if (utf16_array == NULL && length != 0) {
1645 RETURN_NULL_ERROR(utf16_array); 1679 RETURN_NULL_ERROR(utf16_array);
1646 } 1680 }
1647 CHECK_LENGTH(length, String::kMaxElements); 1681 CHECK_LENGTH(length, String::kMaxElements);
1682 CHECK_CALLBACK_STATE(isolate);
1648 return Api::NewHandle(isolate, 1683 return Api::NewHandle(isolate,
1649 String::NewExternal(utf16_array, length, peer, cback)); 1684 String::NewExternal(utf16_array, length, peer, cback));
1650 } 1685 }
1651 1686
1652 1687
1653 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, 1688 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object,
1654 const char** cstr) { 1689 const char** cstr) {
1655 Isolate* isolate = Isolate::Current(); 1690 Isolate* isolate = Isolate::Current();
1656 DARTSCOPE(isolate); 1691 DARTSCOPE(isolate);
1657 if (cstr == NULL) { 1692 if (cstr == NULL) {
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1846 DARTSCOPE(isolate); 1881 DARTSCOPE(isolate);
1847 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 1882 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
1848 return GetListInstance(isolate, obj) != Instance::null(); 1883 return GetListInstance(isolate, obj) != Instance::null();
1849 } 1884 }
1850 1885
1851 1886
1852 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { 1887 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) {
1853 Isolate* isolate = Isolate::Current(); 1888 Isolate* isolate = Isolate::Current();
1854 DARTSCOPE(isolate); 1889 DARTSCOPE(isolate);
1855 CHECK_LENGTH(length, Array::kMaxElements); 1890 CHECK_LENGTH(length, Array::kMaxElements);
1891 CHECK_CALLBACK_STATE(isolate);
1856 return Api::NewHandle(isolate, Array::New(length)); 1892 return Api::NewHandle(isolate, Array::New(length));
1857 } 1893 }
1858 1894
1859 1895
1860 #define GET_LIST_LENGTH(isolate, type, obj, len) \ 1896 #define GET_LIST_LENGTH(isolate, type, obj, len) \
1861 type& array = type::Handle(isolate); \ 1897 type& array = type::Handle(isolate); \
1862 array ^= obj.raw(); \ 1898 array ^= obj.raw(); \
1863 *len = array.Length(); \ 1899 *len = array.Length(); \
1864 return Api::Success(isolate); \ 1900 return Api::Success(isolate); \
1865 1901
1866 1902
1867 DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* len) { 1903 DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* len) {
1868 Isolate* isolate = Isolate::Current(); 1904 Isolate* isolate = Isolate::Current();
1869 DARTSCOPE(isolate); 1905 DARTSCOPE(isolate);
1870 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list)); 1906 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
1871 if (obj.IsError()) { 1907 if (obj.IsError()) {
1872 // Pass through errors. 1908 // Pass through errors.
1873 return list; 1909 return list;
1874 } 1910 }
1875 if (obj.IsByteArray()) { 1911 if (obj.IsByteArray()) {
1876 GET_LIST_LENGTH(isolate, ByteArray, obj, len); 1912 GET_LIST_LENGTH(isolate, ByteArray, obj, len);
1877 } 1913 }
1878 if (obj.IsArray()) { 1914 if (obj.IsArray()) {
1879 GET_LIST_LENGTH(isolate, Array, obj, len); 1915 GET_LIST_LENGTH(isolate, Array, obj, len);
1880 } 1916 }
1881 if (obj.IsGrowableObjectArray()) { 1917 if (obj.IsGrowableObjectArray()) {
1882 GET_LIST_LENGTH(isolate, GrowableObjectArray, obj, len); 1918 GET_LIST_LENGTH(isolate, GrowableObjectArray, obj, len);
1883 } 1919 }
1920 CHECK_CALLBACK_STATE(isolate);
1921
1884 // Now check and handle a dart object that implements the List interface. 1922 // Now check and handle a dart object that implements the List interface.
1885 const Instance& instance = 1923 const Instance& instance =
1886 Instance::Handle(isolate, GetListInstance(isolate, obj)); 1924 Instance::Handle(isolate, GetListInstance(isolate, obj));
1887 if (instance.IsNull()) { 1925 if (instance.IsNull()) {
1888 return Api::NewError("Object does not implement the List interface"); 1926 return Api::NewError("Object does not implement the List interface");
1889 } 1927 }
1890 const String& name = String::Handle(Field::GetterName(Symbols::Length())); 1928 const String& name = String::Handle(Field::GetterName(Symbols::Length()));
1891 const Function& function = 1929 const Function& function =
1892 Function::Handle(isolate, Resolver::ResolveDynamic(instance, name, 1, 0)); 1930 Function::Handle(isolate, Resolver::ResolveDynamic(instance, name, 1, 0));
1893 if (function.IsNull()) { 1931 if (function.IsNull()) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1941 Isolate* isolate = Isolate::Current(); 1979 Isolate* isolate = Isolate::Current();
1942 DARTSCOPE(isolate); 1980 DARTSCOPE(isolate);
1943 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list)); 1981 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
1944 if (obj.IsArray()) { 1982 if (obj.IsArray()) {
1945 GET_LIST_ELEMENT(isolate, Array, obj, index); 1983 GET_LIST_ELEMENT(isolate, Array, obj, index);
1946 } else if (obj.IsGrowableObjectArray()) { 1984 } else if (obj.IsGrowableObjectArray()) {
1947 GET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index); 1985 GET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index);
1948 } else if (obj.IsError()) { 1986 } else if (obj.IsError()) {
1949 return list; 1987 return list;
1950 } else { 1988 } else {
1989 CHECK_CALLBACK_STATE(isolate);
1990
1951 // Check and handle a dart object that implements the List interface. 1991 // Check and handle a dart object that implements the List interface.
1952 const Instance& instance = 1992 const Instance& instance =
1953 Instance::Handle(isolate, GetListInstance(isolate, obj)); 1993 Instance::Handle(isolate, GetListInstance(isolate, obj));
1954 if (!instance.IsNull()) { 1994 if (!instance.IsNull()) {
1955 const Function& function = Function::Handle( 1995 const Function& function = Function::Handle(
1956 isolate, 1996 isolate,
1957 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), 2, 0)); 1997 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), 2, 0));
1958 if (!function.IsNull()) { 1998 if (!function.IsNull()) {
1959 const int kNumArgs = 2; 1999 const int kNumArgs = 2;
1960 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 2000 const Array& args = Array::Handle(isolate, Array::New(kNumArgs));
(...skipping 30 matching lines...) Expand all
1991 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list)); 2031 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
1992 // If the list is immutable we call into Dart for the indexed setter to 2032 // If the list is immutable we call into Dart for the indexed setter to
1993 // get the unsupported operation exception as the result. 2033 // get the unsupported operation exception as the result.
1994 if (obj.IsArray() && !obj.IsImmutableArray()) { 2034 if (obj.IsArray() && !obj.IsImmutableArray()) {
1995 SET_LIST_ELEMENT(isolate, Array, obj, index, value); 2035 SET_LIST_ELEMENT(isolate, Array, obj, index, value);
1996 } else if (obj.IsGrowableObjectArray()) { 2036 } else if (obj.IsGrowableObjectArray()) {
1997 SET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index, value); 2037 SET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index, value);
1998 } else if (obj.IsError()) { 2038 } else if (obj.IsError()) {
1999 return list; 2039 return list;
2000 } else { 2040 } else {
2041 CHECK_CALLBACK_STATE(isolate);
2042
2001 // Check and handle a dart object that implements the List interface. 2043 // Check and handle a dart object that implements the List interface.
2002 const Instance& instance = 2044 const Instance& instance =
2003 Instance::Handle(isolate, GetListInstance(isolate, obj)); 2045 Instance::Handle(isolate, GetListInstance(isolate, obj));
2004 if (!instance.IsNull()) { 2046 if (!instance.IsNull()) {
2005 const Function& function = Function::Handle( 2047 const Function& function = Function::Handle(
2006 isolate, 2048 isolate,
2007 Resolver::ResolveDynamic(instance, 2049 Resolver::ResolveDynamic(instance,
2008 Symbols::AssignIndexToken(), 2050 Symbols::AssignIndexToken(),
2009 3, 2051 3,
2010 0)); 2052 0));
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2077 } else if (obj.IsGrowableObjectArray()) { 2119 } else if (obj.IsGrowableObjectArray()) {
2078 GET_LIST_ELEMENT_AS_BYTES(isolate, 2120 GET_LIST_ELEMENT_AS_BYTES(isolate,
2079 GrowableObjectArray, 2121 GrowableObjectArray,
2080 obj, 2122 obj,
2081 native_array, 2123 native_array,
2082 offset, 2124 offset,
2083 length); 2125 length);
2084 } else if (obj.IsError()) { 2126 } else if (obj.IsError()) {
2085 return list; 2127 return list;
2086 } else { 2128 } else {
2129 CHECK_CALLBACK_STATE(isolate);
2130
2087 // Check and handle a dart object that implements the List interface. 2131 // Check and handle a dart object that implements the List interface.
2088 const Instance& instance = 2132 const Instance& instance =
2089 Instance::Handle(isolate, GetListInstance(isolate, obj)); 2133 Instance::Handle(isolate, GetListInstance(isolate, obj));
2090 if (!instance.IsNull()) { 2134 if (!instance.IsNull()) {
2091 const Function& function = Function::Handle( 2135 const Function& function = Function::Handle(
2092 isolate, 2136 isolate,
2093 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), 2, 0)); 2137 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), 2, 0));
2094 if (!function.IsNull()) { 2138 if (!function.IsNull()) {
2095 Object& result = Object::Handle(isolate); 2139 Object& result = Object::Handle(isolate);
2096 Integer& intobj = Integer::Handle(isolate); 2140 Integer& intobj = Integer::Handle(isolate);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2164 } else if (obj.IsGrowableObjectArray()) { 2208 } else if (obj.IsGrowableObjectArray()) {
2165 SET_LIST_ELEMENT_AS_BYTES(isolate, 2209 SET_LIST_ELEMENT_AS_BYTES(isolate,
2166 GrowableObjectArray, 2210 GrowableObjectArray,
2167 obj, 2211 obj,
2168 native_array, 2212 native_array,
2169 offset, 2213 offset,
2170 length); 2214 length);
2171 } else if (obj.IsError()) { 2215 } else if (obj.IsError()) {
2172 return list; 2216 return list;
2173 } else { 2217 } else {
2218 CHECK_CALLBACK_STATE(isolate);
2219
2174 // Check and handle a dart object that implements the List interface. 2220 // Check and handle a dart object that implements the List interface.
2175 const Instance& instance = 2221 const Instance& instance =
2176 Instance::Handle(isolate, GetListInstance(isolate, obj)); 2222 Instance::Handle(isolate, GetListInstance(isolate, obj));
2177 if (!instance.IsNull()) { 2223 if (!instance.IsNull()) {
2178 const Function& function = Function::Handle( 2224 const Function& function = Function::Handle(
2179 isolate, 2225 isolate,
2180 Resolver::ResolveDynamic(instance, 2226 Resolver::ResolveDynamic(instance,
2181 Symbols::AssignIndexToken(), 2227 Symbols::AssignIndexToken(),
2182 3, 2228 3,
2183 0)); 2229 0));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2216 2262
2217 DART_EXPORT bool Dart_IsByteArrayExternal(Dart_Handle object) { 2263 DART_EXPORT bool Dart_IsByteArrayExternal(Dart_Handle object) {
2218 return RawObject::IsExternalByteArrayClassId(Api::ClassId(object)); 2264 return RawObject::IsExternalByteArrayClassId(Api::ClassId(object));
2219 } 2265 }
2220 2266
2221 2267
2222 DART_EXPORT Dart_Handle Dart_NewByteArray(intptr_t length) { 2268 DART_EXPORT Dart_Handle Dart_NewByteArray(intptr_t length) {
2223 Isolate* isolate = Isolate::Current(); 2269 Isolate* isolate = Isolate::Current();
2224 DARTSCOPE(isolate); 2270 DARTSCOPE(isolate);
2225 CHECK_LENGTH(length, Uint8Array::kMaxElements); 2271 CHECK_LENGTH(length, Uint8Array::kMaxElements);
2272 CHECK_CALLBACK_STATE(isolate);
2226 return Api::NewHandle(isolate, Uint8Array::New(length)); 2273 return Api::NewHandle(isolate, Uint8Array::New(length));
2227 } 2274 }
2228 2275
2229 2276
2230 DART_EXPORT Dart_Handle Dart_NewExternalByteArray(uint8_t* data, 2277 DART_EXPORT Dart_Handle Dart_NewExternalByteArray(uint8_t* data,
2231 intptr_t length, 2278 intptr_t length,
2232 void* peer, 2279 void* peer,
2233 Dart_PeerFinalizer callback) { 2280 Dart_PeerFinalizer callback) {
2234 Isolate* isolate = Isolate::Current(); 2281 Isolate* isolate = Isolate::Current();
2235 DARTSCOPE(isolate); 2282 DARTSCOPE(isolate);
2236 if (data == NULL && length != 0) { 2283 if (data == NULL && length != 0) {
2237 RETURN_NULL_ERROR(data); 2284 RETURN_NULL_ERROR(data);
2238 } 2285 }
2239 CHECK_LENGTH(length, ExternalUint8Array::kMaxElements); 2286 CHECK_LENGTH(length, ExternalUint8Array::kMaxElements);
2287 CHECK_CALLBACK_STATE(isolate);
2240 return Api::NewHandle( 2288 return Api::NewHandle(
2241 isolate, ExternalUint8Array::New(data, length, peer, callback)); 2289 isolate, ExternalUint8Array::New(data, length, peer, callback));
2242 } 2290 }
2243 2291
2244 2292
2245 DART_EXPORT Dart_Handle Dart_NewExternalClampedByteArray( 2293 DART_EXPORT Dart_Handle Dart_NewExternalClampedByteArray(
2246 uint8_t* data, 2294 uint8_t* data,
2247 intptr_t length, 2295 intptr_t length,
2248 void* peer, 2296 void* peer,
2249 Dart_PeerFinalizer callback) { 2297 Dart_PeerFinalizer callback) {
2250 Isolate* isolate = Isolate::Current(); 2298 Isolate* isolate = Isolate::Current();
2251 DARTSCOPE(isolate); 2299 DARTSCOPE(isolate);
2252 if (data == NULL && length != 0) { 2300 if (data == NULL && length != 0) {
2253 RETURN_NULL_ERROR(data); 2301 RETURN_NULL_ERROR(data);
2254 } 2302 }
2255 CHECK_LENGTH(length, ExternalUint8ClampedArray::kMaxElements); 2303 CHECK_LENGTH(length, ExternalUint8ClampedArray::kMaxElements);
2304 CHECK_CALLBACK_STATE(isolate);
2256 return Api::NewHandle( 2305 return Api::NewHandle(
2257 isolate, ExternalUint8ClampedArray::New(data, length, peer, callback)); 2306 isolate, ExternalUint8ClampedArray::New(data, length, peer, callback));
2258 } 2307 }
2259 2308
2260 2309
2261 DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetData(Dart_Handle object, 2310 DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetData(Dart_Handle object,
2262 void** data) { 2311 void** data) {
2263 Isolate* isolate = Isolate::Current(); 2312 Isolate* isolate = Isolate::Current();
2264 DARTSCOPE(isolate); 2313 DARTSCOPE(isolate);
2265 const ExternalUint8Array& array = 2314 const ExternalUint8Array& array =
(...skipping 19 matching lines...) Expand all
2285 RETURN_TYPE_ERROR(isolate, object, ExternalUint8Array); 2334 RETURN_TYPE_ERROR(isolate, object, ExternalUint8Array);
2286 } 2335 }
2287 if (peer == NULL) { 2336 if (peer == NULL) {
2288 RETURN_NULL_ERROR(peer); 2337 RETURN_NULL_ERROR(peer);
2289 } 2338 }
2290 *peer = array.GetPeer(); 2339 *peer = array.GetPeer();
2291 return Api::Success(isolate); 2340 return Api::Success(isolate);
2292 } 2341 }
2293 2342
2294 2343
2295 template<typename T> 2344 DART_EXPORT Dart_Handle Dart_ScalarListAcquireData(Dart_Handle array,
2296 Dart_Handle ByteArrayGetAt(T* value, Dart_Handle array, intptr_t offset) { 2345 Dart_Scalar_Type* type,
2346 void** data,
2347 intptr_t* len) {
2297 Isolate* isolate = Isolate::Current(); 2348 Isolate* isolate = Isolate::Current();
2298 CHECK_ISOLATE(isolate); 2349 DARTSCOPE(isolate);
2299 const ByteArray& array_obj = Api::UnwrapByteArrayHandle(isolate, array); 2350 if (!RawObject::IsByteArrayClassId(Api::ClassId(array))) {
2300 if (array_obj.IsNull()) { 2351 RETURN_TYPE_ERROR(isolate, array, 'scalar list');
2301 RETURN_TYPE_ERROR(isolate, array, ByteArray);
2302 } 2352 }
2303 intptr_t length = sizeof(T); 2353 if (type == NULL) {
2304 if (!Utils::RangeCheck(offset, length, array_obj.ByteLength())) { 2354 RETURN_NULL_ERROR(type);
2305 return Api::NewError("Invalid index passed in to get byte array element");
2306 } 2355 }
2307 uint8_t* dst = reinterpret_cast<uint8_t*>(value); 2356 if (data == NULL) {
2308 ByteArray::Copy(dst, array_obj, offset, length); 2357 RETURN_NULL_ERROR(data);
2358 }
2359 if (len == NULL) {
2360 RETURN_NULL_ERROR(len);
2361 }
2362 isolate->IncrementNoGCScopeDepth();
2363 START_NO_CALLBACK_SCOPE(isolate);
2364
2365 UNIMPLEMENTED();
2309 return Api::Success(isolate); 2366 return Api::Success(isolate);
2310 } 2367 }
2311 2368
2312 2369
2313 template<typename T> 2370 DART_EXPORT Dart_Handle Dart_ScalarListReleaseData(Dart_Handle array) {
2314 Dart_Handle ByteArraySetAt(Dart_Handle array, intptr_t offset, T value) {
2315 Isolate* isolate = Isolate::Current(); 2371 Isolate* isolate = Isolate::Current();
2316 CHECK_ISOLATE(isolate); 2372 DARTSCOPE(isolate);
2317 const ByteArray& array_obj = Api::UnwrapByteArrayHandle(isolate, array); 2373 if (!RawObject::IsByteArrayClassId(Api::ClassId(array))) {
2318 if (array_obj.IsNull()) { 2374 RETURN_TYPE_ERROR(isolate, array, 'scalar list');
2319 RETURN_TYPE_ERROR(isolate, array, ByteArray);
2320 } 2375 }
2321 intptr_t length = sizeof(T); 2376
2322 if (!Utils::RangeCheck(offset, length, array_obj.ByteLength())) { 2377 UNIMPLEMENTED();
2323 return Api::NewError("Invalid index passed in to get byte array element"); 2378 isolate->DecrementNoGCScopeDepth();
2324 } 2379 END_NO_CALLBACK_SCOPE(isolate);
2325 const uint8_t* src = reinterpret_cast<uint8_t*>(&value);
2326 ByteArray::Copy(array_obj, offset, src, length);
2327 return Api::Success(isolate); 2380 return Api::Success(isolate);
2328 } 2381 }
2329 2382
2330 2383
2331 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt8At(Dart_Handle array,
2332 intptr_t byte_offset,
2333 int8_t* value) {
2334 return ByteArrayGetAt(value, array, byte_offset);
2335 }
2336
2337
2338 DART_EXPORT Dart_Handle Dart_ByteArraySetInt8At(Dart_Handle array,
2339 intptr_t byte_offset,
2340 int8_t value) {
2341 return ByteArraySetAt(array, byte_offset, value);
2342 }
2343
2344
2345 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint8At(Dart_Handle array,
2346 intptr_t byte_offset,
2347 uint8_t* value) {
2348 return ByteArrayGetAt(value, array, byte_offset);
2349 }
2350
2351
2352 DART_EXPORT Dart_Handle Dart_ByteArraySetUint8At(Dart_Handle array,
2353 intptr_t byte_offset,
2354 uint8_t value) {
2355 return ByteArraySetAt(array, byte_offset, value);
2356 }
2357
2358
2359 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt16At(Dart_Handle array,
2360 intptr_t byte_offset,
2361 int16_t* value) {
2362 return ByteArrayGetAt(value, array, byte_offset);
2363 }
2364
2365
2366 DART_EXPORT Dart_Handle Dart_ByteArraySetInt16At(Dart_Handle array,
2367 intptr_t byte_offset,
2368 int16_t value) {
2369 return ByteArraySetAt(array, byte_offset, value);
2370 }
2371
2372
2373 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint16At(Dart_Handle array,
2374 intptr_t byte_offset,
2375 uint16_t* value) {
2376 return ByteArrayGetAt(value, array, byte_offset);
2377 }
2378
2379
2380 DART_EXPORT Dart_Handle Dart_ByteArraySetUint16At(Dart_Handle array,
2381 intptr_t byte_offset,
2382 uint16_t value) {
2383 return ByteArraySetAt(array, byte_offset, value);
2384 }
2385
2386
2387 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt32At(Dart_Handle array,
2388 intptr_t byte_offset,
2389 int32_t* value) {
2390 return ByteArrayGetAt(value, array, byte_offset);
2391 }
2392
2393
2394 DART_EXPORT Dart_Handle Dart_ByteArraySetInt32At(Dart_Handle array,
2395 intptr_t byte_offset,
2396 int32_t value) {
2397 return ByteArraySetAt(array, byte_offset, value);
2398 }
2399
2400
2401 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint32At(Dart_Handle array,
2402 intptr_t byte_offset,
2403 uint32_t* value) {
2404 return ByteArrayGetAt(value, array, byte_offset);
2405 }
2406
2407
2408 DART_EXPORT Dart_Handle Dart_ByteArraySetUint32At(Dart_Handle array,
2409 intptr_t byte_offset,
2410 uint32_t value) {
2411 return ByteArraySetAt(array, byte_offset, value);
2412 }
2413
2414
2415 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt64At(Dart_Handle array,
2416 intptr_t byte_offset,
2417 int64_t* value) {
2418 return ByteArrayGetAt(value, array, byte_offset);
2419 }
2420
2421
2422 DART_EXPORT Dart_Handle Dart_ByteArraySetInt64At(Dart_Handle array,
2423 intptr_t byte_offset,
2424 int64_t value) {
2425 return ByteArraySetAt(array, byte_offset, value);
2426 }
2427
2428
2429 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint64At(Dart_Handle array,
2430 intptr_t byte_offset,
2431 uint64_t* value) {
2432 return ByteArrayGetAt(value, array, byte_offset);
2433 }
2434
2435
2436 DART_EXPORT Dart_Handle Dart_ByteArraySetUint64At(Dart_Handle array,
2437 intptr_t byte_offset,
2438 uint64_t value) {
2439 return ByteArraySetAt(array, byte_offset, value);
2440 }
2441
2442
2443 DART_EXPORT Dart_Handle Dart_ByteArrayGetFloat32At(Dart_Handle array,
2444 intptr_t byte_offset,
2445 float* value) {
2446 return ByteArrayGetAt(value, array, byte_offset);
2447 }
2448
2449
2450 DART_EXPORT Dart_Handle Dart_ByteArraySetFloat32At(Dart_Handle array,
2451 intptr_t byte_offset,
2452 float value) {
2453 return ByteArraySetAt(array, byte_offset, value);
2454 }
2455
2456
2457 DART_EXPORT Dart_Handle Dart_ByteArrayGetFloat64At(Dart_Handle array,
2458 intptr_t byte_offset,
2459 double* value) {
2460 return ByteArrayGetAt(value, array, byte_offset);
2461 }
2462
2463
2464 DART_EXPORT Dart_Handle Dart_ByteArraySetFloat64At(Dart_Handle array,
2465 intptr_t byte_offset,
2466 double value) {
2467 return ByteArraySetAt(array, byte_offset, value);
2468 }
2469
2470
2471 // --- Closures --- 2384 // --- Closures ---
2472 2385
2473 2386
2474 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { 2387 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) {
2475 // We can't use a fast class index check here because there are many 2388 // We can't use a fast class index check here because there are many
2476 // different signature classes for closures. 2389 // different signature classes for closures.
2477 Isolate* isolate = Isolate::Current(); 2390 Isolate* isolate = Isolate::Current();
2478 DARTSCOPE(isolate); 2391 DARTSCOPE(isolate);
2479 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, object); 2392 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, object);
2480 return (!closure_obj.IsNull() && closure_obj.IsClosure()); 2393 return (!closure_obj.IsNull() && closure_obj.IsClosure());
(...skipping 13 matching lines...) Expand all
2494 RawFunction* rf = Closure::function(closure_obj); 2407 RawFunction* rf = Closure::function(closure_obj);
2495 return Api::NewHandle(isolate, rf); 2408 return Api::NewHandle(isolate, rf);
2496 } 2409 }
2497 2410
2498 2411
2499 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, 2412 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
2500 int number_of_arguments, 2413 int number_of_arguments,
2501 Dart_Handle* arguments) { 2414 Dart_Handle* arguments) {
2502 Isolate* isolate = Isolate::Current(); 2415 Isolate* isolate = Isolate::Current();
2503 DARTSCOPE(isolate); 2416 DARTSCOPE(isolate);
2417 CHECK_CALLBACK_STATE(isolate);
2504 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure); 2418 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure);
2505 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) { 2419 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) {
2506 RETURN_TYPE_ERROR(isolate, closure, Instance); 2420 RETURN_TYPE_ERROR(isolate, closure, Instance);
2507 } 2421 }
2508 if (number_of_arguments < 0) { 2422 if (number_of_arguments < 0) {
2509 return Api::NewError( 2423 return Api::NewError(
2510 "%s expects argument 'number_of_arguments' to be non-negative.", 2424 "%s expects argument 'number_of_arguments' to be non-negative.",
2511 CURRENT_FUNC); 2425 CURRENT_FUNC);
2512 } 2426 }
2513 ASSERT(ClassFinalizer::AllClassesFinalized()); 2427 ASSERT(ClassFinalizer::AllClassesFinalized());
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
3342 return constructor.raw(); 3256 return constructor.raw();
3343 } 3257 }
3344 3258
3345 3259
3346 DART_EXPORT Dart_Handle Dart_New(Dart_Handle clazz, 3260 DART_EXPORT Dart_Handle Dart_New(Dart_Handle clazz,
3347 Dart_Handle constructor_name, 3261 Dart_Handle constructor_name,
3348 int number_of_arguments, 3262 int number_of_arguments,
3349 Dart_Handle* arguments) { 3263 Dart_Handle* arguments) {
3350 Isolate* isolate = Isolate::Current(); 3264 Isolate* isolate = Isolate::Current();
3351 DARTSCOPE(isolate); 3265 DARTSCOPE(isolate);
3266 CHECK_CALLBACK_STATE(isolate);
3352 Object& result = Object::Handle(isolate); 3267 Object& result = Object::Handle(isolate);
3353 3268
3354 if (number_of_arguments < 0) { 3269 if (number_of_arguments < 0) {
3355 return Api::NewError( 3270 return Api::NewError(
3356 "%s expects argument 'number_of_arguments' to be non-negative.", 3271 "%s expects argument 'number_of_arguments' to be non-negative.",
3357 CURRENT_FUNC); 3272 CURRENT_FUNC);
3358 } 3273 }
3359 3274
3360 // Get the class to instantiate. 3275 // Get the class to instantiate.
3361 Class& cls = 3276 Class& cls =
3362 Class::Handle(isolate, Api::UnwrapClassHandle(isolate, clazz).raw()); 3277 Class::Handle(isolate, Api::UnwrapClassHandle(isolate, clazz).raw());
3363 if (cls.IsNull()) { 3278 if (cls.IsNull()) {
3364 RETURN_TYPE_ERROR(isolate, clazz, Class); 3279 RETURN_TYPE_ERROR(isolate, clazz, Class);
3365 } 3280 }
3281
3366 String& base_constructor_name = String::Handle(); 3282 String& base_constructor_name = String::Handle();
3367 base_constructor_name = cls.Name(); 3283 base_constructor_name = cls.Name();
3368 3284
3369 // And get the name of the constructor to invoke. 3285 // And get the name of the constructor to invoke.
3370 String& dot_name = String::Handle(isolate); 3286 String& dot_name = String::Handle(isolate);
3371 const Object& name_obj = 3287 const Object& name_obj =
3372 Object::Handle(isolate, Api::UnwrapHandle(constructor_name)); 3288 Object::Handle(isolate, Api::UnwrapHandle(constructor_name));
3373 if (name_obj.IsNull()) { 3289 if (name_obj.IsNull()) {
3374 dot_name = Symbols::Dot().raw(); 3290 dot_name = Symbols::Dot().raw();
3375 } else if (name_obj.IsString()) { 3291 } else if (name_obj.IsString()) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
3442 return Api::NewHandle(isolate, new_object.raw()); 3358 return Api::NewHandle(isolate, new_object.raw());
3443 } 3359 }
3444 3360
3445 3361
3446 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, 3362 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target,
3447 Dart_Handle name, 3363 Dart_Handle name,
3448 int number_of_arguments, 3364 int number_of_arguments,
3449 Dart_Handle* arguments) { 3365 Dart_Handle* arguments) {
3450 Isolate* isolate = Isolate::Current(); 3366 Isolate* isolate = Isolate::Current();
3451 DARTSCOPE(isolate); 3367 DARTSCOPE(isolate);
3368 CHECK_CALLBACK_STATE(isolate);
3452 3369
3453 const String& function_name = Api::UnwrapStringHandle(isolate, name); 3370 const String& function_name = Api::UnwrapStringHandle(isolate, name);
3454 if (function_name.IsNull()) { 3371 if (function_name.IsNull()) {
3455 RETURN_TYPE_ERROR(isolate, name, String); 3372 RETURN_TYPE_ERROR(isolate, name, String);
3456 } 3373 }
3457 if (number_of_arguments < 0) { 3374 if (number_of_arguments < 0) {
3458 return Api::NewError( 3375 return Api::NewError(
3459 "%s expects argument 'number_of_arguments' to be non-negative.", 3376 "%s expects argument 'number_of_arguments' to be non-negative.",
3460 CURRENT_FUNC); 3377 CURRENT_FUNC);
3461 } 3378 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
3585 // initialized until the first time the getter is invoked. 3502 // initialized until the first time the getter is invoked.
3586 const Instance& value = Instance::Handle(isolate, fld.value()); 3503 const Instance& value = Instance::Handle(isolate, fld.value());
3587 ASSERT(value.raw() != Object::transition_sentinel().raw()); 3504 ASSERT(value.raw() != Object::transition_sentinel().raw());
3588 return value.raw() == Object::sentinel().raw(); 3505 return value.raw() == Object::sentinel().raw();
3589 } 3506 }
3590 3507
3591 3508
3592 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { 3509 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) {
3593 Isolate* isolate = Isolate::Current(); 3510 Isolate* isolate = Isolate::Current();
3594 DARTSCOPE(isolate); 3511 DARTSCOPE(isolate);
3512 CHECK_CALLBACK_STATE(isolate);
3595 3513
3596 const String& field_name = Api::UnwrapStringHandle(isolate, name); 3514 const String& field_name = Api::UnwrapStringHandle(isolate, name);
3597 if (field_name.IsNull()) { 3515 if (field_name.IsNull()) {
3598 RETURN_TYPE_ERROR(isolate, name, String); 3516 RETURN_TYPE_ERROR(isolate, name, String);
3599 } 3517 }
3600 3518
3601 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container)); 3519 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container));
3602 3520
3603 Field& field = Field::Handle(isolate); 3521 Field& field = Field::Handle(isolate);
3604 Function& getter = Function::Handle(isolate); 3522 Function& getter = Function::Handle(isolate);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
3699 CURRENT_FUNC); 3617 CURRENT_FUNC);
3700 } 3618 }
3701 } 3619 }
3702 3620
3703 3621
3704 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, 3622 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container,
3705 Dart_Handle name, 3623 Dart_Handle name,
3706 Dart_Handle value) { 3624 Dart_Handle value) {
3707 Isolate* isolate = Isolate::Current(); 3625 Isolate* isolate = Isolate::Current();
3708 DARTSCOPE(isolate); 3626 DARTSCOPE(isolate);
3627 CHECK_CALLBACK_STATE(isolate);
3709 3628
3710 const String& field_name = Api::UnwrapStringHandle(isolate, name); 3629 const String& field_name = Api::UnwrapStringHandle(isolate, name);
3711 if (field_name.IsNull()) { 3630 if (field_name.IsNull()) {
3712 RETURN_TYPE_ERROR(isolate, name, String); 3631 RETURN_TYPE_ERROR(isolate, name, String);
3713 } 3632 }
3714 3633
3715 // Since null is allowed for value, we don't use UnwrapInstanceHandle. 3634 // Since null is allowed for value, we don't use UnwrapInstanceHandle.
3716 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value)); 3635 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value));
3717 if (!value_obj.IsNull() && !value_obj.IsInstance()) { 3636 if (!value_obj.IsNull() && !value_obj.IsInstance()) {
3718 RETURN_TYPE_ERROR(isolate, value, Instance); 3637 RETURN_TYPE_ERROR(isolate, value, Instance);
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
3852 RETURN_TYPE_ERROR(isolate, name, String); 3771 RETURN_TYPE_ERROR(isolate, name, String);
3853 } 3772 }
3854 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 3773 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
3855 if (lib.IsNull()) { 3774 if (lib.IsNull()) {
3856 RETURN_TYPE_ERROR(isolate, library, Library); 3775 RETURN_TYPE_ERROR(isolate, library, Library);
3857 } 3776 }
3858 if (field_count <= 0) { 3777 if (field_count <= 0) {
3859 return Api::NewError( 3778 return Api::NewError(
3860 "Negative field_count passed to Dart_CreateNativeWrapperClass"); 3779 "Negative field_count passed to Dart_CreateNativeWrapperClass");
3861 } 3780 }
3781 CHECK_CALLBACK_STATE(isolate);
3862 3782
3863 String& cls_symbol = String::Handle(isolate, Symbols::New(cls_name)); 3783 String& cls_symbol = String::Handle(isolate, Symbols::New(cls_name));
3864 const Class& cls = Class::Handle( 3784 const Class& cls = Class::Handle(
3865 isolate, Class::NewNativeWrapper(lib, cls_symbol, field_count)); 3785 isolate, Class::NewNativeWrapper(lib, cls_symbol, field_count));
3866 if (cls.IsNull()) { 3786 if (cls.IsNull()) {
3867 return Api::NewError( 3787 return Api::NewError(
3868 "Unable to create native wrapper class : already exists"); 3788 "Unable to create native wrapper class : already exists");
3869 } 3789 }
3870 return Api::NewHandle(isolate, cls.raw()); 3790 return Api::NewHandle(isolate, cls.raw());
3871 } 3791 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3922 return Api::Success(isolate); 3842 return Api::Success(isolate);
3923 } 3843 }
3924 3844
3925 3845
3926 // --- Exceptions ---- 3846 // --- Exceptions ----
3927 3847
3928 3848
3929 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { 3849 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) {
3930 Isolate* isolate = Isolate::Current(); 3850 Isolate* isolate = Isolate::Current();
3931 CHECK_ISOLATE(isolate); 3851 CHECK_ISOLATE(isolate);
3852 CHECK_CALLBACK_STATE(isolate);
3932 { 3853 {
3933 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); 3854 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
3934 if (excp.IsNull()) { 3855 if (excp.IsNull()) {
3935 RETURN_TYPE_ERROR(isolate, exception, Instance); 3856 RETURN_TYPE_ERROR(isolate, exception, Instance);
3936 } 3857 }
3937 } 3858 }
3938 if (isolate->top_exit_frame_info() == 0) { 3859 if (isolate->top_exit_frame_info() == 0) {
3939 // There are no dart frames on the stack so it would be illegal to 3860 // There are no dart frames on the stack so it would be illegal to
3940 // throw an exception here. 3861 // throw an exception here.
3941 return Api::NewError("No Dart frames on stack, cannot throw exception"); 3862 return Api::NewError("No Dart frames on stack, cannot throw exception");
3942 } 3863 }
3864
3943 // Unwind all the API scopes till the exit frame before throwing an 3865 // Unwind all the API scopes till the exit frame before throwing an
3944 // exception. 3866 // exception.
3945 ApiState* state = isolate->api_state(); 3867 ApiState* state = isolate->api_state();
3946 ASSERT(state != NULL); 3868 ASSERT(state != NULL);
3947 const Instance* saved_exception; 3869 const Instance* saved_exception;
3948 { 3870 {
3949 NoGCScope no_gc; 3871 NoGCScope no_gc;
3950 RawInstance* raw_exception = 3872 RawInstance* raw_exception =
3951 Api::UnwrapInstanceHandle(isolate, exception).raw(); 3873 Api::UnwrapInstanceHandle(isolate, exception).raw();
3952 state->UnwindScopes(isolate->top_exit_frame_info()); 3874 state->UnwindScopes(isolate->top_exit_frame_info());
3953 saved_exception = &Instance::Handle(raw_exception); 3875 saved_exception = &Instance::Handle(raw_exception);
3954 } 3876 }
3955 Exceptions::Throw(*saved_exception); 3877 Exceptions::Throw(*saved_exception);
3956 return Api::NewError("Exception was not thrown, internal error"); 3878 return Api::NewError("Exception was not thrown, internal error");
3957 } 3879 }
3958 3880
3959 3881
3960 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, 3882 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception,
3961 Dart_Handle stacktrace) { 3883 Dart_Handle stacktrace) {
3962 Isolate* isolate = Isolate::Current(); 3884 Isolate* isolate = Isolate::Current();
3963 CHECK_ISOLATE(isolate); 3885 CHECK_ISOLATE(isolate);
3886 CHECK_CALLBACK_STATE(isolate);
3964 { 3887 {
3965 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); 3888 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
3966 if (excp.IsNull()) { 3889 if (excp.IsNull()) {
3967 RETURN_TYPE_ERROR(isolate, exception, Instance); 3890 RETURN_TYPE_ERROR(isolate, exception, Instance);
3968 } 3891 }
3969 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace); 3892 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace);
3970 if (stk.IsNull()) { 3893 if (stk.IsNull()) {
3971 RETURN_TYPE_ERROR(isolate, stacktrace, Instance); 3894 RETURN_TYPE_ERROR(isolate, stacktrace, Instance);
3972 } 3895 }
3973 } 3896 }
3974 if (isolate->top_exit_frame_info() == 0) { 3897 if (isolate->top_exit_frame_info() == 0) {
3975 // There are no dart frames on the stack so it would be illegal to 3898 // There are no dart frames on the stack so it would be illegal to
3976 // throw an exception here. 3899 // throw an exception here.
3977 return Api::NewError("No Dart frames on stack, cannot throw exception"); 3900 return Api::NewError("No Dart frames on stack, cannot throw exception");
3978 } 3901 }
3902
3979 // Unwind all the API scopes till the exit frame before throwing an 3903 // Unwind all the API scopes till the exit frame before throwing an
3980 // exception. 3904 // exception.
3981 ApiState* state = isolate->api_state(); 3905 ApiState* state = isolate->api_state();
3982 ASSERT(state != NULL); 3906 ASSERT(state != NULL);
3983 const Instance* saved_exception; 3907 const Instance* saved_exception;
3984 const Instance* saved_stacktrace; 3908 const Instance* saved_stacktrace;
3985 { 3909 {
3986 NoGCScope no_gc; 3910 NoGCScope no_gc;
3987 RawInstance* raw_exception = 3911 RawInstance* raw_exception =
3988 Api::UnwrapInstanceHandle(isolate, exception).raw(); 3912 Api::UnwrapInstanceHandle(isolate, exception).raw();
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
4085 if (source_str.IsNull()) { 4009 if (source_str.IsNull()) {
4086 RETURN_TYPE_ERROR(isolate, source, String); 4010 RETURN_TYPE_ERROR(isolate, source, String);
4087 } 4011 }
4088 Library& library = 4012 Library& library =
4089 Library::Handle(isolate, isolate->object_store()->root_library()); 4013 Library::Handle(isolate, isolate->object_store()->root_library());
4090 if (!library.IsNull()) { 4014 if (!library.IsNull()) {
4091 const String& library_url = String::Handle(isolate, library.url()); 4015 const String& library_url = String::Handle(isolate, library.url());
4092 return Api::NewError("%s: A script has already been loaded from '%s'.", 4016 return Api::NewError("%s: A script has already been loaded from '%s'.",
4093 CURRENT_FUNC, library_url.ToCString()); 4017 CURRENT_FUNC, library_url.ToCString());
4094 } 4018 }
4019 CHECK_CALLBACK_STATE(isolate);
4020
4095 library = Library::New(url_str); 4021 library = Library::New(url_str);
4096 library.set_debuggable(true); 4022 library.set_debuggable(true);
4097 library.Register(); 4023 library.Register();
4098 isolate->object_store()->set_root_library(library); 4024 isolate->object_store()->set_root_library(library);
4099 4025
4100 const Script& script = Script::Handle( 4026 const Script& script = Script::Handle(
4101 isolate, Script::New(url_str, source_str, RawScript::kScriptTag)); 4027 isolate, Script::New(url_str, source_str, RawScript::kScriptTag));
4102 Dart_Handle result; 4028 Dart_Handle result;
4103 CompileSource(isolate, library, script, &result); 4029 CompileSource(isolate, library, script, &result);
4104 return result; 4030 return result;
(...skipping 23 matching lines...) Expand all
4128 CURRENT_FUNC, library_url.ToCString()); 4054 CURRENT_FUNC, library_url.ToCString());
4129 } 4055 }
4130 if (line_offset < 0) { 4056 if (line_offset < 0) {
4131 return Api::NewError("%s: argument 'line_offset' must be positive number", 4057 return Api::NewError("%s: argument 'line_offset' must be positive number",
4132 CURRENT_FUNC); 4058 CURRENT_FUNC);
4133 } 4059 }
4134 if (col_offset < 0) { 4060 if (col_offset < 0) {
4135 return Api::NewError("%s: argument 'col_offset' must be positive number", 4061 return Api::NewError("%s: argument 'col_offset' must be positive number",
4136 CURRENT_FUNC); 4062 CURRENT_FUNC);
4137 } 4063 }
4064 CHECK_CALLBACK_STATE(isolate);
4138 4065
4139 library = Library::New(url_str); 4066 library = Library::New(url_str);
4140 library.set_debuggable(true); 4067 library.set_debuggable(true);
4141 library.Register(); 4068 library.Register();
4142 isolate->object_store()->set_root_library(library); 4069 isolate->object_store()->set_root_library(library);
4143 4070
4144 const Script& script = Script::Handle( 4071 const Script& script = Script::Handle(
4145 isolate, Script::New(url_str, source_str, RawScript::kScriptTag)); 4072 isolate, Script::New(url_str, source_str, RawScript::kScriptTag));
4146 script.SetLocationOffset(line_offset, col_offset); 4073 script.SetLocationOffset(line_offset, col_offset);
4147 Dart_Handle result; 4074 Dart_Handle result;
(...skipping 14 matching lines...) Expand all
4162 return Api::NewError("%s expects parameter 'buffer' to be a script type" 4089 return Api::NewError("%s expects parameter 'buffer' to be a script type"
4163 " snapshot.", CURRENT_FUNC); 4090 " snapshot.", CURRENT_FUNC);
4164 } 4091 }
4165 Library& library = 4092 Library& library =
4166 Library::Handle(isolate, isolate->object_store()->root_library()); 4093 Library::Handle(isolate, isolate->object_store()->root_library());
4167 if (!library.IsNull()) { 4094 if (!library.IsNull()) {
4168 const String& library_url = String::Handle(isolate, library.url()); 4095 const String& library_url = String::Handle(isolate, library.url());
4169 return Api::NewError("%s: A script has already been loaded from '%s'.", 4096 return Api::NewError("%s: A script has already been loaded from '%s'.",
4170 CURRENT_FUNC, library_url.ToCString()); 4097 CURRENT_FUNC, library_url.ToCString());
4171 } 4098 }
4099 CHECK_CALLBACK_STATE(isolate);
4100
4172 SnapshotReader reader(snapshot->content(), 4101 SnapshotReader reader(snapshot->content(),
4173 snapshot->length(), 4102 snapshot->length(),
4174 snapshot->kind(), 4103 snapshot->kind(),
4175 isolate); 4104 isolate);
4176 const Object& tmp = Object::Handle(isolate, reader.ReadObject()); 4105 const Object& tmp = Object::Handle(isolate, reader.ReadObject());
4177 if (!tmp.IsLibrary()) { 4106 if (!tmp.IsLibrary()) {
4178 return Api::NewError("%s: Unable to deserialize snapshot correctly.", 4107 return Api::NewError("%s: Unable to deserialize snapshot correctly.",
4179 CURRENT_FUNC); 4108 CURRENT_FUNC);
4180 } 4109 }
4181 library ^= tmp.raw(); 4110 library ^= tmp.raw();
(...skipping 24 matching lines...) Expand all
4206 4135
4207 4136
4208 DART_EXPORT Dart_Handle Dart_CompileAll() { 4137 DART_EXPORT Dart_Handle Dart_CompileAll() {
4209 Isolate* isolate = Isolate::Current(); 4138 Isolate* isolate = Isolate::Current();
4210 DARTSCOPE(isolate); 4139 DARTSCOPE(isolate);
4211 Dart_Handle result; 4140 Dart_Handle result;
4212 const char* msg = CheckIsolateState(isolate); 4141 const char* msg = CheckIsolateState(isolate);
4213 if (msg != NULL) { 4142 if (msg != NULL) {
4214 return Api::NewError("%s", msg); 4143 return Api::NewError("%s", msg);
4215 } 4144 }
4145 CHECK_CALLBACK_STATE(isolate);
4216 CompileAll(isolate, &result); 4146 CompileAll(isolate, &result);
4217 return result; 4147 return result;
4218 } 4148 }
4219 4149
4220 4150
4221 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { 4151 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) {
4222 return Api::ClassId(object) == kLibraryCid; 4152 return Api::ClassId(object) == kLibraryCid;
4223 } 4153 }
4224 4154
4225 4155
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4329 Isolate* isolate = Isolate::Current(); 4259 Isolate* isolate = Isolate::Current();
4330 DARTSCOPE(isolate); 4260 DARTSCOPE(isolate);
4331 const String& url_str = Api::UnwrapStringHandle(isolate, url); 4261 const String& url_str = Api::UnwrapStringHandle(isolate, url);
4332 if (url_str.IsNull()) { 4262 if (url_str.IsNull()) {
4333 RETURN_TYPE_ERROR(isolate, url, String); 4263 RETURN_TYPE_ERROR(isolate, url, String);
4334 } 4264 }
4335 const String& source_str = Api::UnwrapStringHandle(isolate, source); 4265 const String& source_str = Api::UnwrapStringHandle(isolate, source);
4336 if (source_str.IsNull()) { 4266 if (source_str.IsNull()) {
4337 RETURN_TYPE_ERROR(isolate, source, String); 4267 RETURN_TYPE_ERROR(isolate, source, String);
4338 } 4268 }
4269 CHECK_CALLBACK_STATE(isolate);
4270
4339 Library& library = Library::Handle(isolate, Library::LookupLibrary(url_str)); 4271 Library& library = Library::Handle(isolate, Library::LookupLibrary(url_str));
4340 if (library.IsNull()) { 4272 if (library.IsNull()) {
4341 library = Library::New(url_str); 4273 library = Library::New(url_str);
4342 library.Register(); 4274 library.Register();
4343 } else if (!library.LoadNotStarted()) { 4275 } else if (!library.LoadNotStarted()) {
4344 // The source for this library has either been loaded or is in the 4276 // The source for this library has either been loaded or is in the
4345 // process of loading. Return an error. 4277 // process of loading. Return an error.
4346 return Api::NewError("%s: library '%s' has already been loaded.", 4278 return Api::NewError("%s: library '%s' has already been loaded.",
4347 CURRENT_FUNC, url_str.ToCString()); 4279 CURRENT_FUNC, url_str.ToCString());
4348 } 4280 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4381 RETURN_TYPE_ERROR(isolate, import, Library); 4313 RETURN_TYPE_ERROR(isolate, import, Library);
4382 } 4314 }
4383 const Object& prefix_object = 4315 const Object& prefix_object =
4384 Object::Handle(isolate, Api::UnwrapHandle(prefix)); 4316 Object::Handle(isolate, Api::UnwrapHandle(prefix));
4385 const String& prefix_vm = prefix_object.IsNull() 4317 const String& prefix_vm = prefix_object.IsNull()
4386 ? Symbols::Empty() 4318 ? Symbols::Empty()
4387 : String::Cast(prefix_object); 4319 : String::Cast(prefix_object);
4388 if (prefix_vm.IsNull()) { 4320 if (prefix_vm.IsNull()) {
4389 RETURN_TYPE_ERROR(isolate, prefix, String); 4321 RETURN_TYPE_ERROR(isolate, prefix, String);
4390 } 4322 }
4323 CHECK_CALLBACK_STATE(isolate);
4324
4391 const String& prefix_symbol = 4325 const String& prefix_symbol =
4392 String::Handle(isolate, Symbols::New(prefix_vm)); 4326 String::Handle(isolate, Symbols::New(prefix_vm));
4393 const Namespace& import_ns = Namespace::Handle( 4327 const Namespace& import_ns = Namespace::Handle(
4394 Namespace::New(import_vm, Array::Handle(), Array::Handle())); 4328 Namespace::New(import_vm, Array::Handle(), Array::Handle()));
4395 if (prefix_vm.Length() == 0) { 4329 if (prefix_vm.Length() == 0) {
4396 library_vm.AddImport(import_ns); 4330 library_vm.AddImport(import_ns);
4397 } else { 4331 } else {
4398 LibraryPrefix& library_prefix = LibraryPrefix::Handle(); 4332 LibraryPrefix& library_prefix = LibraryPrefix::Handle();
4399 library_prefix = library_vm.LookupLocalLibraryPrefix(prefix_symbol); 4333 library_prefix = library_vm.LookupLocalLibraryPrefix(prefix_symbol);
4400 if (!library_prefix.IsNull()) { 4334 if (!library_prefix.IsNull()) {
(...skipping 18 matching lines...) Expand all
4419 RETURN_TYPE_ERROR(isolate, library, Library); 4353 RETURN_TYPE_ERROR(isolate, library, Library);
4420 } 4354 }
4421 const String& url_str = Api::UnwrapStringHandle(isolate, url); 4355 const String& url_str = Api::UnwrapStringHandle(isolate, url);
4422 if (url_str.IsNull()) { 4356 if (url_str.IsNull()) {
4423 RETURN_TYPE_ERROR(isolate, url, String); 4357 RETURN_TYPE_ERROR(isolate, url, String);
4424 } 4358 }
4425 const String& source_str = Api::UnwrapStringHandle(isolate, source); 4359 const String& source_str = Api::UnwrapStringHandle(isolate, source);
4426 if (source_str.IsNull()) { 4360 if (source_str.IsNull()) {
4427 RETURN_TYPE_ERROR(isolate, source, String); 4361 RETURN_TYPE_ERROR(isolate, source, String);
4428 } 4362 }
4363 CHECK_CALLBACK_STATE(isolate);
4364
4429 const Script& script = Script::Handle( 4365 const Script& script = Script::Handle(
4430 isolate, Script::New(url_str, source_str, RawScript::kSourceTag)); 4366 isolate, Script::New(url_str, source_str, RawScript::kSourceTag));
4431 Dart_Handle result; 4367 Dart_Handle result;
4432 CompileSource(isolate, lib, script, &result); 4368 CompileSource(isolate, lib, script, &result);
4433 return result; 4369 return result;
4434 } 4370 }
4435 4371
4436 4372
4437 DART_EXPORT Dart_Handle Dart_LoadPatch(Dart_Handle library, 4373 DART_EXPORT Dart_Handle Dart_LoadPatch(Dart_Handle library,
4438 Dart_Handle url, 4374 Dart_Handle url,
4439 Dart_Handle patch_source) { 4375 Dart_Handle patch_source) {
4440 TIMERSCOPE(time_script_loading); 4376 TIMERSCOPE(time_script_loading);
4441 Isolate* isolate = Isolate::Current(); 4377 Isolate* isolate = Isolate::Current();
4442 DARTSCOPE(isolate); 4378 DARTSCOPE(isolate);
4443 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 4379 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4444 if (lib.IsNull()) { 4380 if (lib.IsNull()) {
4445 RETURN_TYPE_ERROR(isolate, library, Library); 4381 RETURN_TYPE_ERROR(isolate, library, Library);
4446 } 4382 }
4447 const String& url_str = Api::UnwrapStringHandle(isolate, url); 4383 const String& url_str = Api::UnwrapStringHandle(isolate, url);
4448 if (url_str.IsNull()) { 4384 if (url_str.IsNull()) {
4449 RETURN_TYPE_ERROR(isolate, url, String); 4385 RETURN_TYPE_ERROR(isolate, url, String);
4450 } 4386 }
4451 const String& source_str = Api::UnwrapStringHandle(isolate, patch_source); 4387 const String& source_str = Api::UnwrapStringHandle(isolate, patch_source);
4452 if (source_str.IsNull()) { 4388 if (source_str.IsNull()) {
4453 RETURN_TYPE_ERROR(isolate, patch_source, String); 4389 RETURN_TYPE_ERROR(isolate, patch_source, String);
4454 } 4390 }
4391 CHECK_CALLBACK_STATE(isolate);
4392
4455 const Script& script = Script::Handle( 4393 const Script& script = Script::Handle(
4456 isolate, Script::New(url_str, source_str, RawScript::kPatchTag)); 4394 isolate, Script::New(url_str, source_str, RawScript::kPatchTag));
4457 Dart_Handle result; 4395 Dart_Handle result;
4458 CompileSource(isolate, lib, script, &result); 4396 CompileSource(isolate, lib, script, &result);
4459 return result; 4397 return result;
4460 } 4398 }
4461 4399
4462 4400
4463 DART_EXPORT Dart_Handle Dart_SetNativeResolver( 4401 DART_EXPORT Dart_Handle Dart_SetNativeResolver(
4464 Dart_Handle library, 4402 Dart_Handle library,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
4522 } 4460 }
4523 { 4461 {
4524 NoGCScope no_gc; 4462 NoGCScope no_gc;
4525 RawObject* raw_obj = obj.raw(); 4463 RawObject* raw_obj = obj.raw();
4526 isolate->heap()->SetPeer(raw_obj, peer); 4464 isolate->heap()->SetPeer(raw_obj, peer);
4527 } 4465 }
4528 return Api::Success(isolate); 4466 return Api::Success(isolate);
4529 } 4467 }
4530 4468
4531 } // namespace dart 4469 } // namespace dart
OLDNEW
« no previous file with comments | « vm/dart_api_impl.h ('k') | vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698