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

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
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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1992 if (obj.IsArray()) { 2032 if (obj.IsArray()) {
1993 if (obj.IsImmutableArray()) { 2033 if (obj.IsImmutableArray()) {
1994 return Api::NewError("Cannot modify immutable array"); 2034 return Api::NewError("Cannot modify immutable array");
1995 } 2035 }
1996 SET_LIST_ELEMENT(isolate, Array, obj, index, value); 2036 SET_LIST_ELEMENT(isolate, Array, obj, index, value);
1997 } else if (obj.IsGrowableObjectArray()) { 2037 } else if (obj.IsGrowableObjectArray()) {
1998 SET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index, value); 2038 SET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index, value);
1999 } else if (obj.IsError()) { 2039 } else if (obj.IsError()) {
2000 return list; 2040 return list;
2001 } else { 2041 } else {
2042 CHECK_CALLBACK_STATE(isolate);
2043
2002 // Check and handle a dart object that implements the List interface. 2044 // Check and handle a dart object that implements the List interface.
2003 const Instance& instance = 2045 const Instance& instance =
2004 Instance::Handle(isolate, GetListInstance(isolate, obj)); 2046 Instance::Handle(isolate, GetListInstance(isolate, obj));
2005 if (!instance.IsNull()) { 2047 if (!instance.IsNull()) {
2006 const Function& function = Function::Handle( 2048 const Function& function = Function::Handle(
2007 isolate, 2049 isolate,
2008 Resolver::ResolveDynamic(instance, 2050 Resolver::ResolveDynamic(instance,
2009 Symbols::AssignIndexToken(), 2051 Symbols::AssignIndexToken(),
2010 3, 2052 3,
2011 0)); 2053 0));
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 } else if (obj.IsGrowableObjectArray()) { 2120 } else if (obj.IsGrowableObjectArray()) {
2079 GET_LIST_ELEMENT_AS_BYTES(isolate, 2121 GET_LIST_ELEMENT_AS_BYTES(isolate,
2080 GrowableObjectArray, 2122 GrowableObjectArray,
2081 obj, 2123 obj,
2082 native_array, 2124 native_array,
2083 offset, 2125 offset,
2084 length); 2126 length);
2085 } else if (obj.IsError()) { 2127 } else if (obj.IsError()) {
2086 return list; 2128 return list;
2087 } else { 2129 } else {
2130 CHECK_CALLBACK_STATE(isolate);
2131
2088 // Check and handle a dart object that implements the List interface. 2132 // Check and handle a dart object that implements the List interface.
2089 const Instance& instance = 2133 const Instance& instance =
2090 Instance::Handle(isolate, GetListInstance(isolate, obj)); 2134 Instance::Handle(isolate, GetListInstance(isolate, obj));
2091 if (!instance.IsNull()) { 2135 if (!instance.IsNull()) {
2092 const Function& function = Function::Handle( 2136 const Function& function = Function::Handle(
2093 isolate, 2137 isolate,
2094 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), 2, 0)); 2138 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), 2, 0));
2095 if (!function.IsNull()) { 2139 if (!function.IsNull()) {
2096 Object& result = Object::Handle(isolate); 2140 Object& result = Object::Handle(isolate);
2097 Integer& intobj = Integer::Handle(isolate); 2141 Integer& intobj = Integer::Handle(isolate);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2166 } else if (obj.IsGrowableObjectArray()) { 2210 } else if (obj.IsGrowableObjectArray()) {
2167 SET_LIST_ELEMENT_AS_BYTES(isolate, 2211 SET_LIST_ELEMENT_AS_BYTES(isolate,
2168 GrowableObjectArray, 2212 GrowableObjectArray,
2169 obj, 2213 obj,
2170 native_array, 2214 native_array,
2171 offset, 2215 offset,
2172 length); 2216 length);
2173 } else if (obj.IsError()) { 2217 } else if (obj.IsError()) {
2174 return list; 2218 return list;
2175 } else { 2219 } else {
2176 // Check and handle a dart object that implements the List interface. 2220 CHECK_CALLBACK_STATE(isolate);
2221
2222 // Check and handle a dart object that implements the List interface.
2177 const Instance& instance = 2223 const Instance& instance =
2178 Instance::Handle(isolate, GetListInstance(isolate, obj)); 2224 Instance::Handle(isolate, GetListInstance(isolate, obj));
2179 if (!instance.IsNull()) { 2225 if (!instance.IsNull()) {
2180 const Function& function = Function::Handle( 2226 const Function& function = Function::Handle(
2181 isolate, 2227 isolate,
2182 Resolver::ResolveDynamic(instance, 2228 Resolver::ResolveDynamic(instance,
2183 Symbols::AssignIndexToken(), 2229 Symbols::AssignIndexToken(),
2184 3, 2230 3,
2185 0)); 2231 0));
2186 if (!function.IsNull()) { 2232 if (!function.IsNull()) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2218 2264
2219 DART_EXPORT bool Dart_IsByteArrayExternal(Dart_Handle object) { 2265 DART_EXPORT bool Dart_IsByteArrayExternal(Dart_Handle object) {
2220 return RawObject::IsExternalByteArrayClassId(Api::ClassId(object)); 2266 return RawObject::IsExternalByteArrayClassId(Api::ClassId(object));
2221 } 2267 }
2222 2268
2223 2269
2224 DART_EXPORT Dart_Handle Dart_NewByteArray(intptr_t length) { 2270 DART_EXPORT Dart_Handle Dart_NewByteArray(intptr_t length) {
2225 Isolate* isolate = Isolate::Current(); 2271 Isolate* isolate = Isolate::Current();
2226 DARTSCOPE(isolate); 2272 DARTSCOPE(isolate);
2227 CHECK_LENGTH(length, Uint8Array::kMaxElements); 2273 CHECK_LENGTH(length, Uint8Array::kMaxElements);
2274 CHECK_CALLBACK_STATE(isolate);
2228 return Api::NewHandle(isolate, Uint8Array::New(length)); 2275 return Api::NewHandle(isolate, Uint8Array::New(length));
2229 } 2276 }
2230 2277
2231 2278
2232 DART_EXPORT Dart_Handle Dart_NewExternalByteArray(uint8_t* data, 2279 DART_EXPORT Dart_Handle Dart_NewExternalByteArray(uint8_t* data,
2233 intptr_t length, 2280 intptr_t length,
2234 void* peer, 2281 void* peer,
2235 Dart_PeerFinalizer callback) { 2282 Dart_PeerFinalizer callback) {
2236 Isolate* isolate = Isolate::Current(); 2283 Isolate* isolate = Isolate::Current();
2237 DARTSCOPE(isolate); 2284 DARTSCOPE(isolate);
2238 if (data == NULL && length != 0) { 2285 if (data == NULL && length != 0) {
2239 RETURN_NULL_ERROR(data); 2286 RETURN_NULL_ERROR(data);
2240 } 2287 }
2241 CHECK_LENGTH(length, ExternalUint8Array::kMaxElements); 2288 CHECK_LENGTH(length, ExternalUint8Array::kMaxElements);
2289 CHECK_CALLBACK_STATE(isolate);
2242 return Api::NewHandle( 2290 return Api::NewHandle(
2243 isolate, ExternalUint8Array::New(data, length, peer, callback)); 2291 isolate, ExternalUint8Array::New(data, length, peer, callback));
2244 } 2292 }
2245 2293
2246 2294
2247 DART_EXPORT Dart_Handle Dart_NewExternalClampedByteArray( 2295 DART_EXPORT Dart_Handle Dart_NewExternalClampedByteArray(
2248 uint8_t* data, 2296 uint8_t* data,
2249 intptr_t length, 2297 intptr_t length,
2250 void* peer, 2298 void* peer,
2251 Dart_PeerFinalizer callback) { 2299 Dart_PeerFinalizer callback) {
2252 Isolate* isolate = Isolate::Current(); 2300 Isolate* isolate = Isolate::Current();
2253 DARTSCOPE(isolate); 2301 DARTSCOPE(isolate);
2254 if (data == NULL && length != 0) { 2302 if (data == NULL && length != 0) {
2255 RETURN_NULL_ERROR(data); 2303 RETURN_NULL_ERROR(data);
2256 } 2304 }
2257 CHECK_LENGTH(length, ExternalUint8ClampedArray::kMaxElements); 2305 CHECK_LENGTH(length, ExternalUint8ClampedArray::kMaxElements);
2306 CHECK_CALLBACK_STATE(isolate);
Ivan Posva 2013/01/29 01:54:03 Is there a way to make sure that this macro was ad
siva 2013/01/31 01:54:45 I have added an assert in the 3 entrypoints to dar
2258 return Api::NewHandle( 2307 return Api::NewHandle(
2259 isolate, ExternalUint8ClampedArray::New(data, length, peer, callback)); 2308 isolate, ExternalUint8ClampedArray::New(data, length, peer, callback));
2260 } 2309 }
2261 2310
2262 2311
2263 DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetData(Dart_Handle object, 2312 DART_EXPORT Dart_Handle Dart_ExternalByteArrayGetData(Dart_Handle object,
2264 void** data) { 2313 void** data) {
2265 Isolate* isolate = Isolate::Current(); 2314 Isolate* isolate = Isolate::Current();
2266 DARTSCOPE(isolate); 2315 DARTSCOPE(isolate);
2267 const ExternalUint8Array& array = 2316 const ExternalUint8Array& array =
(...skipping 19 matching lines...) Expand all
2287 RETURN_TYPE_ERROR(isolate, object, ExternalUint8Array); 2336 RETURN_TYPE_ERROR(isolate, object, ExternalUint8Array);
2288 } 2337 }
2289 if (peer == NULL) { 2338 if (peer == NULL) {
2290 RETURN_NULL_ERROR(peer); 2339 RETURN_NULL_ERROR(peer);
2291 } 2340 }
2292 *peer = array.GetPeer(); 2341 *peer = array.GetPeer();
2293 return Api::Success(isolate); 2342 return Api::Success(isolate);
2294 } 2343 }
2295 2344
2296 2345
2297 template<typename T> 2346 DART_EXPORT Dart_Handle Dart_ScalarListAcquireData(Dart_Handle array,
2298 Dart_Handle ByteArrayGetAt(T* value, Dart_Handle array, intptr_t offset) { 2347 Dart_Scalar_Type* type,
2348 void** data,
2349 intptr_t* len) {
2299 Isolate* isolate = Isolate::Current(); 2350 Isolate* isolate = Isolate::Current();
2300 CHECK_ISOLATE(isolate); 2351 DARTSCOPE(isolate);
2301 const ByteArray& array_obj = Api::UnwrapByteArrayHandle(isolate, array); 2352 if (!RawObject::IsByteArrayClassId(Api::ClassId(array))) {
2302 if (array_obj.IsNull()) { 2353 RETURN_TYPE_ERROR(isolate, array, 'scalar list');
2303 RETURN_TYPE_ERROR(isolate, array, ByteArray);
2304 } 2354 }
2305 intptr_t length = sizeof(T); 2355 if (type == NULL) {
2306 if (!Utils::RangeCheck(offset, length, array_obj.ByteLength())) { 2356 RETURN_NULL_ERROR(type);
2307 return Api::NewError("Invalid index passed in to get byte array element");
2308 } 2357 }
2309 uint8_t* dst = reinterpret_cast<uint8_t*>(value); 2358 if (data == NULL) {
2310 ByteArray::Copy(dst, array_obj, offset, length); 2359 RETURN_NULL_ERROR(data);
2360 }
2361 if (len == NULL) {
2362 RETURN_NULL_ERROR(len);
2363 }
2364 isolate->IncrementNoGCScopeDepth();
2365 START_NO_CALLBACK_SCOPE(isolate);
2366
2367 UNIMPLEMENTED();
2311 return Api::Success(isolate); 2368 return Api::Success(isolate);
2312 } 2369 }
2313 2370
2314 2371
2315 template<typename T> 2372 DART_EXPORT Dart_Handle Dart_ScalarListReleaseData(Dart_Handle array) {
2316 Dart_Handle ByteArraySetAt(Dart_Handle array, intptr_t offset, T value) {
2317 Isolate* isolate = Isolate::Current(); 2373 Isolate* isolate = Isolate::Current();
2318 CHECK_ISOLATE(isolate); 2374 DARTSCOPE(isolate);
2319 const ByteArray& array_obj = Api::UnwrapByteArrayHandle(isolate, array); 2375 if (!RawObject::IsByteArrayClassId(Api::ClassId(array))) {
2320 if (array_obj.IsNull()) { 2376 RETURN_TYPE_ERROR(isolate, array, 'scalar list');
2321 RETURN_TYPE_ERROR(isolate, array, ByteArray);
2322 } 2377 }
2323 intptr_t length = sizeof(T); 2378
2324 if (!Utils::RangeCheck(offset, length, array_obj.ByteLength())) { 2379 UNIMPLEMENTED();
2325 return Api::NewError("Invalid index passed in to get byte array element"); 2380 isolate->DecrementNoGCScopeDepth();
2326 } 2381 END_NO_CALLBACK_SCOPE(isolate);
2327 const uint8_t* src = reinterpret_cast<uint8_t*>(&value);
2328 ByteArray::Copy(array_obj, offset, src, length);
2329 return Api::Success(isolate); 2382 return Api::Success(isolate);
2330 } 2383 }
2331 2384
2332 2385
2333 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt8At(Dart_Handle array,
2334 intptr_t byte_offset,
2335 int8_t* value) {
2336 return ByteArrayGetAt(value, array, byte_offset);
2337 }
2338
2339
2340 DART_EXPORT Dart_Handle Dart_ByteArraySetInt8At(Dart_Handle array,
2341 intptr_t byte_offset,
2342 int8_t value) {
2343 return ByteArraySetAt(array, byte_offset, value);
2344 }
2345
2346
2347 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint8At(Dart_Handle array,
2348 intptr_t byte_offset,
2349 uint8_t* value) {
2350 return ByteArrayGetAt(value, array, byte_offset);
2351 }
2352
2353
2354 DART_EXPORT Dart_Handle Dart_ByteArraySetUint8At(Dart_Handle array,
2355 intptr_t byte_offset,
2356 uint8_t value) {
2357 return ByteArraySetAt(array, byte_offset, value);
2358 }
2359
2360
2361 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt16At(Dart_Handle array,
2362 intptr_t byte_offset,
2363 int16_t* value) {
2364 return ByteArrayGetAt(value, array, byte_offset);
2365 }
2366
2367
2368 DART_EXPORT Dart_Handle Dart_ByteArraySetInt16At(Dart_Handle array,
2369 intptr_t byte_offset,
2370 int16_t value) {
2371 return ByteArraySetAt(array, byte_offset, value);
2372 }
2373
2374
2375 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint16At(Dart_Handle array,
2376 intptr_t byte_offset,
2377 uint16_t* value) {
2378 return ByteArrayGetAt(value, array, byte_offset);
2379 }
2380
2381
2382 DART_EXPORT Dart_Handle Dart_ByteArraySetUint16At(Dart_Handle array,
2383 intptr_t byte_offset,
2384 uint16_t value) {
2385 return ByteArraySetAt(array, byte_offset, value);
2386 }
2387
2388
2389 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt32At(Dart_Handle array,
2390 intptr_t byte_offset,
2391 int32_t* value) {
2392 return ByteArrayGetAt(value, array, byte_offset);
2393 }
2394
2395
2396 DART_EXPORT Dart_Handle Dart_ByteArraySetInt32At(Dart_Handle array,
2397 intptr_t byte_offset,
2398 int32_t value) {
2399 return ByteArraySetAt(array, byte_offset, value);
2400 }
2401
2402
2403 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint32At(Dart_Handle array,
2404 intptr_t byte_offset,
2405 uint32_t* value) {
2406 return ByteArrayGetAt(value, array, byte_offset);
2407 }
2408
2409
2410 DART_EXPORT Dart_Handle Dart_ByteArraySetUint32At(Dart_Handle array,
2411 intptr_t byte_offset,
2412 uint32_t value) {
2413 return ByteArraySetAt(array, byte_offset, value);
2414 }
2415
2416
2417 DART_EXPORT Dart_Handle Dart_ByteArrayGetInt64At(Dart_Handle array,
2418 intptr_t byte_offset,
2419 int64_t* value) {
2420 return ByteArrayGetAt(value, array, byte_offset);
2421 }
2422
2423
2424 DART_EXPORT Dart_Handle Dart_ByteArraySetInt64At(Dart_Handle array,
2425 intptr_t byte_offset,
2426 int64_t value) {
2427 return ByteArraySetAt(array, byte_offset, value);
2428 }
2429
2430
2431 DART_EXPORT Dart_Handle Dart_ByteArrayGetUint64At(Dart_Handle array,
2432 intptr_t byte_offset,
2433 uint64_t* value) {
2434 return ByteArrayGetAt(value, array, byte_offset);
2435 }
2436
2437
2438 DART_EXPORT Dart_Handle Dart_ByteArraySetUint64At(Dart_Handle array,
2439 intptr_t byte_offset,
2440 uint64_t value) {
2441 return ByteArraySetAt(array, byte_offset, value);
2442 }
2443
2444
2445 DART_EXPORT Dart_Handle Dart_ByteArrayGetFloat32At(Dart_Handle array,
2446 intptr_t byte_offset,
2447 float* value) {
2448 return ByteArrayGetAt(value, array, byte_offset);
2449 }
2450
2451
2452 DART_EXPORT Dart_Handle Dart_ByteArraySetFloat32At(Dart_Handle array,
2453 intptr_t byte_offset,
2454 float value) {
2455 return ByteArraySetAt(array, byte_offset, value);
2456 }
2457
2458
2459 DART_EXPORT Dart_Handle Dart_ByteArrayGetFloat64At(Dart_Handle array,
2460 intptr_t byte_offset,
2461 double* value) {
2462 return ByteArrayGetAt(value, array, byte_offset);
2463 }
2464
2465
2466 DART_EXPORT Dart_Handle Dart_ByteArraySetFloat64At(Dart_Handle array,
2467 intptr_t byte_offset,
2468 double value) {
2469 return ByteArraySetAt(array, byte_offset, value);
2470 }
2471
2472
2473 // --- Closures --- 2386 // --- Closures ---
2474 2387
2475 2388
2476 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { 2389 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) {
2477 // We can't use a fast class index check here because there are many 2390 // We can't use a fast class index check here because there are many
2478 // different signature classes for closures. 2391 // different signature classes for closures.
2479 Isolate* isolate = Isolate::Current(); 2392 Isolate* isolate = Isolate::Current();
2480 DARTSCOPE(isolate); 2393 DARTSCOPE(isolate);
2481 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, object); 2394 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, object);
2482 return (!closure_obj.IsNull() && closure_obj.IsClosure()); 2395 return (!closure_obj.IsNull() && closure_obj.IsClosure());
(...skipping 13 matching lines...) Expand all
2496 RawFunction* rf = Closure::function(closure_obj); 2409 RawFunction* rf = Closure::function(closure_obj);
2497 return Api::NewHandle(isolate, rf); 2410 return Api::NewHandle(isolate, rf);
2498 } 2411 }
2499 2412
2500 2413
2501 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, 2414 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
2502 int number_of_arguments, 2415 int number_of_arguments,
2503 Dart_Handle* arguments) { 2416 Dart_Handle* arguments) {
2504 Isolate* isolate = Isolate::Current(); 2417 Isolate* isolate = Isolate::Current();
2505 DARTSCOPE(isolate); 2418 DARTSCOPE(isolate);
2419 CHECK_CALLBACK_STATE(isolate);
2506 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure); 2420 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure);
2507 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) { 2421 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) {
2508 RETURN_TYPE_ERROR(isolate, closure, Instance); 2422 RETURN_TYPE_ERROR(isolate, closure, Instance);
2509 } 2423 }
2510 if (number_of_arguments < 0) { 2424 if (number_of_arguments < 0) {
2511 return Api::NewError( 2425 return Api::NewError(
2512 "%s expects argument 'number_of_arguments' to be non-negative.", 2426 "%s expects argument 'number_of_arguments' to be non-negative.",
2513 CURRENT_FUNC); 2427 CURRENT_FUNC);
2514 } 2428 }
2515 ASSERT(ClassFinalizer::AllClassesFinalized()); 2429 ASSERT(ClassFinalizer::AllClassesFinalized());
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
3344 return constructor.raw(); 3258 return constructor.raw();
3345 } 3259 }
3346 3260
3347 3261
3348 DART_EXPORT Dart_Handle Dart_New(Dart_Handle clazz, 3262 DART_EXPORT Dart_Handle Dart_New(Dart_Handle clazz,
3349 Dart_Handle constructor_name, 3263 Dart_Handle constructor_name,
3350 int number_of_arguments, 3264 int number_of_arguments,
3351 Dart_Handle* arguments) { 3265 Dart_Handle* arguments) {
3352 Isolate* isolate = Isolate::Current(); 3266 Isolate* isolate = Isolate::Current();
3353 DARTSCOPE(isolate); 3267 DARTSCOPE(isolate);
3268 CHECK_CALLBACK_STATE(isolate);
3354 Object& result = Object::Handle(isolate); 3269 Object& result = Object::Handle(isolate);
3355 3270
3356 if (number_of_arguments < 0) { 3271 if (number_of_arguments < 0) {
3357 return Api::NewError( 3272 return Api::NewError(
3358 "%s expects argument 'number_of_arguments' to be non-negative.", 3273 "%s expects argument 'number_of_arguments' to be non-negative.",
3359 CURRENT_FUNC); 3274 CURRENT_FUNC);
3360 } 3275 }
3361 3276
3362 // Get the class to instantiate. 3277 // Get the class to instantiate.
3363 Class& cls = 3278 Class& cls =
3364 Class::Handle(isolate, Api::UnwrapClassHandle(isolate, clazz).raw()); 3279 Class::Handle(isolate, Api::UnwrapClassHandle(isolate, clazz).raw());
3365 if (cls.IsNull()) { 3280 if (cls.IsNull()) {
3366 RETURN_TYPE_ERROR(isolate, clazz, Class); 3281 RETURN_TYPE_ERROR(isolate, clazz, Class);
3367 } 3282 }
3283
3368 String& base_constructor_name = String::Handle(); 3284 String& base_constructor_name = String::Handle();
3369 base_constructor_name = cls.Name(); 3285 base_constructor_name = cls.Name();
3370 3286
3371 // And get the name of the constructor to invoke. 3287 // And get the name of the constructor to invoke.
3372 String& dot_name = String::Handle(isolate); 3288 String& dot_name = String::Handle(isolate);
3373 const Object& name_obj = 3289 const Object& name_obj =
3374 Object::Handle(isolate, Api::UnwrapHandle(constructor_name)); 3290 Object::Handle(isolate, Api::UnwrapHandle(constructor_name));
3375 if (name_obj.IsNull()) { 3291 if (name_obj.IsNull()) {
3376 dot_name = Symbols::Dot().raw(); 3292 dot_name = Symbols::Dot().raw();
3377 } else if (name_obj.IsString()) { 3293 } else if (name_obj.IsString()) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
3444 return Api::NewHandle(isolate, new_object.raw()); 3360 return Api::NewHandle(isolate, new_object.raw());
3445 } 3361 }
3446 3362
3447 3363
3448 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, 3364 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target,
3449 Dart_Handle name, 3365 Dart_Handle name,
3450 int number_of_arguments, 3366 int number_of_arguments,
3451 Dart_Handle* arguments) { 3367 Dart_Handle* arguments) {
3452 Isolate* isolate = Isolate::Current(); 3368 Isolate* isolate = Isolate::Current();
3453 DARTSCOPE(isolate); 3369 DARTSCOPE(isolate);
3370 CHECK_CALLBACK_STATE(isolate);
3454 3371
3455 const String& function_name = Api::UnwrapStringHandle(isolate, name); 3372 const String& function_name = Api::UnwrapStringHandle(isolate, name);
3456 if (function_name.IsNull()) { 3373 if (function_name.IsNull()) {
3457 RETURN_TYPE_ERROR(isolate, name, String); 3374 RETURN_TYPE_ERROR(isolate, name, String);
3458 } 3375 }
3459 if (number_of_arguments < 0) { 3376 if (number_of_arguments < 0) {
3460 return Api::NewError( 3377 return Api::NewError(
3461 "%s expects argument 'number_of_arguments' to be non-negative.", 3378 "%s expects argument 'number_of_arguments' to be non-negative.",
3462 CURRENT_FUNC); 3379 CURRENT_FUNC);
3463 } 3380 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
3587 // initialized until the first time the getter is invoked. 3504 // initialized until the first time the getter is invoked.
3588 const Instance& value = Instance::Handle(isolate, fld.value()); 3505 const Instance& value = Instance::Handle(isolate, fld.value());
3589 ASSERT(value.raw() != Object::transition_sentinel().raw()); 3506 ASSERT(value.raw() != Object::transition_sentinel().raw());
3590 return value.raw() == Object::sentinel().raw(); 3507 return value.raw() == Object::sentinel().raw();
3591 } 3508 }
3592 3509
3593 3510
3594 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { 3511 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) {
3595 Isolate* isolate = Isolate::Current(); 3512 Isolate* isolate = Isolate::Current();
3596 DARTSCOPE(isolate); 3513 DARTSCOPE(isolate);
3514 CHECK_CALLBACK_STATE(isolate);
3597 3515
3598 const String& field_name = Api::UnwrapStringHandle(isolate, name); 3516 const String& field_name = Api::UnwrapStringHandle(isolate, name);
3599 if (field_name.IsNull()) { 3517 if (field_name.IsNull()) {
3600 RETURN_TYPE_ERROR(isolate, name, String); 3518 RETURN_TYPE_ERROR(isolate, name, String);
3601 } 3519 }
3602 3520
3603 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container)); 3521 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(container));
3604 3522
3605 Field& field = Field::Handle(isolate); 3523 Field& field = Field::Handle(isolate);
3606 Function& getter = Function::Handle(isolate); 3524 Function& getter = Function::Handle(isolate);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
3701 CURRENT_FUNC); 3619 CURRENT_FUNC);
3702 } 3620 }
3703 } 3621 }
3704 3622
3705 3623
3706 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, 3624 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container,
3707 Dart_Handle name, 3625 Dart_Handle name,
3708 Dart_Handle value) { 3626 Dart_Handle value) {
3709 Isolate* isolate = Isolate::Current(); 3627 Isolate* isolate = Isolate::Current();
3710 DARTSCOPE(isolate); 3628 DARTSCOPE(isolate);
3629 CHECK_CALLBACK_STATE(isolate);
3711 3630
3712 const String& field_name = Api::UnwrapStringHandle(isolate, name); 3631 const String& field_name = Api::UnwrapStringHandle(isolate, name);
3713 if (field_name.IsNull()) { 3632 if (field_name.IsNull()) {
3714 RETURN_TYPE_ERROR(isolate, name, String); 3633 RETURN_TYPE_ERROR(isolate, name, String);
3715 } 3634 }
3716 3635
3717 // Since null is allowed for value, we don't use UnwrapInstanceHandle. 3636 // Since null is allowed for value, we don't use UnwrapInstanceHandle.
3718 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value)); 3637 const Object& value_obj = Object::Handle(isolate, Api::UnwrapHandle(value));
3719 if (!value_obj.IsNull() && !value_obj.IsInstance()) { 3638 if (!value_obj.IsNull() && !value_obj.IsInstance()) {
3720 RETURN_TYPE_ERROR(isolate, value, Instance); 3639 RETURN_TYPE_ERROR(isolate, value, Instance);
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
3854 RETURN_TYPE_ERROR(isolate, name, String); 3773 RETURN_TYPE_ERROR(isolate, name, String);
3855 } 3774 }
3856 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 3775 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
3857 if (lib.IsNull()) { 3776 if (lib.IsNull()) {
3858 RETURN_TYPE_ERROR(isolate, library, Library); 3777 RETURN_TYPE_ERROR(isolate, library, Library);
3859 } 3778 }
3860 if (field_count <= 0) { 3779 if (field_count <= 0) {
3861 return Api::NewError( 3780 return Api::NewError(
3862 "Negative field_count passed to Dart_CreateNativeWrapperClass"); 3781 "Negative field_count passed to Dart_CreateNativeWrapperClass");
3863 } 3782 }
3783 CHECK_CALLBACK_STATE(isolate);
3864 3784
3865 String& cls_symbol = String::Handle(isolate, Symbols::New(cls_name)); 3785 String& cls_symbol = String::Handle(isolate, Symbols::New(cls_name));
3866 const Class& cls = Class::Handle( 3786 const Class& cls = Class::Handle(
3867 isolate, Class::NewNativeWrapper(lib, cls_symbol, field_count)); 3787 isolate, Class::NewNativeWrapper(lib, cls_symbol, field_count));
3868 if (cls.IsNull()) { 3788 if (cls.IsNull()) {
3869 return Api::NewError( 3789 return Api::NewError(
3870 "Unable to create native wrapper class : already exists"); 3790 "Unable to create native wrapper class : already exists");
3871 } 3791 }
3872 return Api::NewHandle(isolate, cls.raw()); 3792 return Api::NewHandle(isolate, cls.raw());
3873 } 3793 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3924 return Api::Success(isolate); 3844 return Api::Success(isolate);
3925 } 3845 }
3926 3846
3927 3847
3928 // --- Exceptions ---- 3848 // --- Exceptions ----
3929 3849
3930 3850
3931 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { 3851 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) {
3932 Isolate* isolate = Isolate::Current(); 3852 Isolate* isolate = Isolate::Current();
3933 CHECK_ISOLATE(isolate); 3853 CHECK_ISOLATE(isolate);
3854 CHECK_CALLBACK_STATE(isolate);
3934 { 3855 {
3935 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); 3856 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
3936 if (excp.IsNull()) { 3857 if (excp.IsNull()) {
3937 RETURN_TYPE_ERROR(isolate, exception, Instance); 3858 RETURN_TYPE_ERROR(isolate, exception, Instance);
3938 } 3859 }
3939 } 3860 }
3940 if (isolate->top_exit_frame_info() == 0) { 3861 if (isolate->top_exit_frame_info() == 0) {
3941 // There are no dart frames on the stack so it would be illegal to 3862 // There are no dart frames on the stack so it would be illegal to
3942 // throw an exception here. 3863 // throw an exception here.
3943 return Api::NewError("No Dart frames on stack, cannot throw exception"); 3864 return Api::NewError("No Dart frames on stack, cannot throw exception");
3944 } 3865 }
3866
3945 // Unwind all the API scopes till the exit frame before throwing an 3867 // Unwind all the API scopes till the exit frame before throwing an
3946 // exception. 3868 // exception.
3947 ApiState* state = isolate->api_state(); 3869 ApiState* state = isolate->api_state();
3948 ASSERT(state != NULL); 3870 ASSERT(state != NULL);
3949 const Instance* saved_exception; 3871 const Instance* saved_exception;
3950 { 3872 {
3951 NoGCScope no_gc; 3873 NoGCScope no_gc;
3952 RawInstance* raw_exception = 3874 RawInstance* raw_exception =
3953 Api::UnwrapInstanceHandle(isolate, exception).raw(); 3875 Api::UnwrapInstanceHandle(isolate, exception).raw();
3954 state->UnwindScopes(isolate->top_exit_frame_info()); 3876 state->UnwindScopes(isolate->top_exit_frame_info());
3955 saved_exception = &Instance::Handle(raw_exception); 3877 saved_exception = &Instance::Handle(raw_exception);
3956 } 3878 }
3957 Exceptions::Throw(*saved_exception); 3879 Exceptions::Throw(*saved_exception);
3958 return Api::NewError("Exception was not thrown, internal error"); 3880 return Api::NewError("Exception was not thrown, internal error");
3959 } 3881 }
3960 3882
3961 3883
3962 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, 3884 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception,
3963 Dart_Handle stacktrace) { 3885 Dart_Handle stacktrace) {
3964 Isolate* isolate = Isolate::Current(); 3886 Isolate* isolate = Isolate::Current();
3965 CHECK_ISOLATE(isolate); 3887 CHECK_ISOLATE(isolate);
3888 CHECK_CALLBACK_STATE(isolate);
3966 { 3889 {
3967 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); 3890 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
3968 if (excp.IsNull()) { 3891 if (excp.IsNull()) {
3969 RETURN_TYPE_ERROR(isolate, exception, Instance); 3892 RETURN_TYPE_ERROR(isolate, exception, Instance);
3970 } 3893 }
3971 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace); 3894 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace);
3972 if (stk.IsNull()) { 3895 if (stk.IsNull()) {
3973 RETURN_TYPE_ERROR(isolate, stacktrace, Instance); 3896 RETURN_TYPE_ERROR(isolate, stacktrace, Instance);
3974 } 3897 }
3975 } 3898 }
3976 if (isolate->top_exit_frame_info() == 0) { 3899 if (isolate->top_exit_frame_info() == 0) {
3977 // There are no dart frames on the stack so it would be illegal to 3900 // There are no dart frames on the stack so it would be illegal to
3978 // throw an exception here. 3901 // throw an exception here.
3979 return Api::NewError("No Dart frames on stack, cannot throw exception"); 3902 return Api::NewError("No Dart frames on stack, cannot throw exception");
3980 } 3903 }
3904
3981 // Unwind all the API scopes till the exit frame before throwing an 3905 // Unwind all the API scopes till the exit frame before throwing an
3982 // exception. 3906 // exception.
3983 ApiState* state = isolate->api_state(); 3907 ApiState* state = isolate->api_state();
3984 ASSERT(state != NULL); 3908 ASSERT(state != NULL);
3985 const Instance* saved_exception; 3909 const Instance* saved_exception;
3986 const Instance* saved_stacktrace; 3910 const Instance* saved_stacktrace;
3987 { 3911 {
3988 NoGCScope no_gc; 3912 NoGCScope no_gc;
3989 RawInstance* raw_exception = 3913 RawInstance* raw_exception =
3990 Api::UnwrapInstanceHandle(isolate, exception).raw(); 3914 Api::UnwrapInstanceHandle(isolate, exception).raw();
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
4087 if (source_str.IsNull()) { 4011 if (source_str.IsNull()) {
4088 RETURN_TYPE_ERROR(isolate, source, String); 4012 RETURN_TYPE_ERROR(isolate, source, String);
4089 } 4013 }
4090 Library& library = 4014 Library& library =
4091 Library::Handle(isolate, isolate->object_store()->root_library()); 4015 Library::Handle(isolate, isolate->object_store()->root_library());
4092 if (!library.IsNull()) { 4016 if (!library.IsNull()) {
4093 const String& library_url = String::Handle(isolate, library.url()); 4017 const String& library_url = String::Handle(isolate, library.url());
4094 return Api::NewError("%s: A script has already been loaded from '%s'.", 4018 return Api::NewError("%s: A script has already been loaded from '%s'.",
4095 CURRENT_FUNC, library_url.ToCString()); 4019 CURRENT_FUNC, library_url.ToCString());
4096 } 4020 }
4021 CHECK_CALLBACK_STATE(isolate);
4022
4097 library = Library::New(url_str); 4023 library = Library::New(url_str);
4098 library.set_debuggable(true); 4024 library.set_debuggable(true);
4099 library.Register(); 4025 library.Register();
4100 isolate->object_store()->set_root_library(library); 4026 isolate->object_store()->set_root_library(library);
4101 4027
4102 const Script& script = Script::Handle( 4028 const Script& script = Script::Handle(
4103 isolate, Script::New(url_str, source_str, RawScript::kScriptTag)); 4029 isolate, Script::New(url_str, source_str, RawScript::kScriptTag));
4104 Dart_Handle result; 4030 Dart_Handle result;
4105 CompileSource(isolate, library, script, &result); 4031 CompileSource(isolate, library, script, &result);
4106 return result; 4032 return result;
(...skipping 23 matching lines...) Expand all
4130 CURRENT_FUNC, library_url.ToCString()); 4056 CURRENT_FUNC, library_url.ToCString());
4131 } 4057 }
4132 if (line_offset < 0) { 4058 if (line_offset < 0) {
4133 return Api::NewError("%s: argument 'line_offset' must be positive number", 4059 return Api::NewError("%s: argument 'line_offset' must be positive number",
4134 CURRENT_FUNC); 4060 CURRENT_FUNC);
4135 } 4061 }
4136 if (col_offset < 0) { 4062 if (col_offset < 0) {
4137 return Api::NewError("%s: argument 'col_offset' must be positive number", 4063 return Api::NewError("%s: argument 'col_offset' must be positive number",
4138 CURRENT_FUNC); 4064 CURRENT_FUNC);
4139 } 4065 }
4066 CHECK_CALLBACK_STATE(isolate);
4140 4067
4141 library = Library::New(url_str); 4068 library = Library::New(url_str);
4142 library.set_debuggable(true); 4069 library.set_debuggable(true);
4143 library.Register(); 4070 library.Register();
4144 isolate->object_store()->set_root_library(library); 4071 isolate->object_store()->set_root_library(library);
4145 4072
4146 const Script& script = Script::Handle( 4073 const Script& script = Script::Handle(
4147 isolate, Script::New(url_str, source_str, RawScript::kScriptTag)); 4074 isolate, Script::New(url_str, source_str, RawScript::kScriptTag));
4148 script.SetLocationOffset(line_offset, col_offset); 4075 script.SetLocationOffset(line_offset, col_offset);
4149 Dart_Handle result; 4076 Dart_Handle result;
(...skipping 14 matching lines...) Expand all
4164 return Api::NewError("%s expects parameter 'buffer' to be a script type" 4091 return Api::NewError("%s expects parameter 'buffer' to be a script type"
4165 " snapshot.", CURRENT_FUNC); 4092 " snapshot.", CURRENT_FUNC);
4166 } 4093 }
4167 Library& library = 4094 Library& library =
4168 Library::Handle(isolate, isolate->object_store()->root_library()); 4095 Library::Handle(isolate, isolate->object_store()->root_library());
4169 if (!library.IsNull()) { 4096 if (!library.IsNull()) {
4170 const String& library_url = String::Handle(isolate, library.url()); 4097 const String& library_url = String::Handle(isolate, library.url());
4171 return Api::NewError("%s: A script has already been loaded from '%s'.", 4098 return Api::NewError("%s: A script has already been loaded from '%s'.",
4172 CURRENT_FUNC, library_url.ToCString()); 4099 CURRENT_FUNC, library_url.ToCString());
4173 } 4100 }
4101 CHECK_CALLBACK_STATE(isolate);
4102
4174 SnapshotReader reader(snapshot->content(), 4103 SnapshotReader reader(snapshot->content(),
4175 snapshot->length(), 4104 snapshot->length(),
4176 snapshot->kind(), 4105 snapshot->kind(),
4177 isolate); 4106 isolate);
4178 const Object& tmp = Object::Handle(isolate, reader.ReadObject()); 4107 const Object& tmp = Object::Handle(isolate, reader.ReadObject());
4179 if (!tmp.IsLibrary()) { 4108 if (!tmp.IsLibrary()) {
4180 return Api::NewError("%s: Unable to deserialize snapshot correctly.", 4109 return Api::NewError("%s: Unable to deserialize snapshot correctly.",
4181 CURRENT_FUNC); 4110 CURRENT_FUNC);
4182 } 4111 }
4183 library ^= tmp.raw(); 4112 library ^= tmp.raw();
(...skipping 24 matching lines...) Expand all
4208 4137
4209 4138
4210 DART_EXPORT Dart_Handle Dart_CompileAll() { 4139 DART_EXPORT Dart_Handle Dart_CompileAll() {
4211 Isolate* isolate = Isolate::Current(); 4140 Isolate* isolate = Isolate::Current();
4212 DARTSCOPE(isolate); 4141 DARTSCOPE(isolate);
4213 Dart_Handle result; 4142 Dart_Handle result;
4214 const char* msg = CheckIsolateState(isolate); 4143 const char* msg = CheckIsolateState(isolate);
4215 if (msg != NULL) { 4144 if (msg != NULL) {
4216 return Api::NewError("%s", msg); 4145 return Api::NewError("%s", msg);
4217 } 4146 }
4147 CHECK_CALLBACK_STATE(isolate);
4218 CompileAll(isolate, &result); 4148 CompileAll(isolate, &result);
4219 return result; 4149 return result;
4220 } 4150 }
4221 4151
4222 4152
4223 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { 4153 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) {
4224 return Api::ClassId(object) == kLibraryCid; 4154 return Api::ClassId(object) == kLibraryCid;
4225 } 4155 }
4226 4156
4227 4157
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
4331 Isolate* isolate = Isolate::Current(); 4261 Isolate* isolate = Isolate::Current();
4332 DARTSCOPE(isolate); 4262 DARTSCOPE(isolate);
4333 const String& url_str = Api::UnwrapStringHandle(isolate, url); 4263 const String& url_str = Api::UnwrapStringHandle(isolate, url);
4334 if (url_str.IsNull()) { 4264 if (url_str.IsNull()) {
4335 RETURN_TYPE_ERROR(isolate, url, String); 4265 RETURN_TYPE_ERROR(isolate, url, String);
4336 } 4266 }
4337 const String& source_str = Api::UnwrapStringHandle(isolate, source); 4267 const String& source_str = Api::UnwrapStringHandle(isolate, source);
4338 if (source_str.IsNull()) { 4268 if (source_str.IsNull()) {
4339 RETURN_TYPE_ERROR(isolate, source, String); 4269 RETURN_TYPE_ERROR(isolate, source, String);
4340 } 4270 }
4271 CHECK_CALLBACK_STATE(isolate);
4272
4341 Library& library = Library::Handle(isolate, Library::LookupLibrary(url_str)); 4273 Library& library = Library::Handle(isolate, Library::LookupLibrary(url_str));
4342 if (library.IsNull()) { 4274 if (library.IsNull()) {
4343 library = Library::New(url_str); 4275 library = Library::New(url_str);
4344 library.Register(); 4276 library.Register();
4345 } else if (!library.LoadNotStarted()) { 4277 } else if (!library.LoadNotStarted()) {
4346 // The source for this library has either been loaded or is in the 4278 // The source for this library has either been loaded or is in the
4347 // process of loading. Return an error. 4279 // process of loading. Return an error.
4348 return Api::NewError("%s: library '%s' has already been loaded.", 4280 return Api::NewError("%s: library '%s' has already been loaded.",
4349 CURRENT_FUNC, url_str.ToCString()); 4281 CURRENT_FUNC, url_str.ToCString());
4350 } 4282 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4383 RETURN_TYPE_ERROR(isolate, import, Library); 4315 RETURN_TYPE_ERROR(isolate, import, Library);
4384 } 4316 }
4385 const Object& prefix_object = 4317 const Object& prefix_object =
4386 Object::Handle(isolate, Api::UnwrapHandle(prefix)); 4318 Object::Handle(isolate, Api::UnwrapHandle(prefix));
4387 const String& prefix_vm = prefix_object.IsNull() 4319 const String& prefix_vm = prefix_object.IsNull()
4388 ? Symbols::Empty() 4320 ? Symbols::Empty()
4389 : String::Cast(prefix_object); 4321 : String::Cast(prefix_object);
4390 if (prefix_vm.IsNull()) { 4322 if (prefix_vm.IsNull()) {
4391 RETURN_TYPE_ERROR(isolate, prefix, String); 4323 RETURN_TYPE_ERROR(isolate, prefix, String);
4392 } 4324 }
4325 CHECK_CALLBACK_STATE(isolate);
4326
4393 const String& prefix_symbol = 4327 const String& prefix_symbol =
4394 String::Handle(isolate, Symbols::New(prefix_vm)); 4328 String::Handle(isolate, Symbols::New(prefix_vm));
4395 const Namespace& import_ns = Namespace::Handle( 4329 const Namespace& import_ns = Namespace::Handle(
4396 Namespace::New(import_vm, Array::Handle(), Array::Handle())); 4330 Namespace::New(import_vm, Array::Handle(), Array::Handle()));
4397 if (prefix_vm.Length() == 0) { 4331 if (prefix_vm.Length() == 0) {
4398 library_vm.AddImport(import_ns); 4332 library_vm.AddImport(import_ns);
4399 } else { 4333 } else {
4400 LibraryPrefix& library_prefix = LibraryPrefix::Handle(); 4334 LibraryPrefix& library_prefix = LibraryPrefix::Handle();
4401 library_prefix = library_vm.LookupLocalLibraryPrefix(prefix_symbol); 4335 library_prefix = library_vm.LookupLocalLibraryPrefix(prefix_symbol);
4402 if (!library_prefix.IsNull()) { 4336 if (!library_prefix.IsNull()) {
(...skipping 18 matching lines...) Expand all
4421 RETURN_TYPE_ERROR(isolate, library, Library); 4355 RETURN_TYPE_ERROR(isolate, library, Library);
4422 } 4356 }
4423 const String& url_str = Api::UnwrapStringHandle(isolate, url); 4357 const String& url_str = Api::UnwrapStringHandle(isolate, url);
4424 if (url_str.IsNull()) { 4358 if (url_str.IsNull()) {
4425 RETURN_TYPE_ERROR(isolate, url, String); 4359 RETURN_TYPE_ERROR(isolate, url, String);
4426 } 4360 }
4427 const String& source_str = Api::UnwrapStringHandle(isolate, source); 4361 const String& source_str = Api::UnwrapStringHandle(isolate, source);
4428 if (source_str.IsNull()) { 4362 if (source_str.IsNull()) {
4429 RETURN_TYPE_ERROR(isolate, source, String); 4363 RETURN_TYPE_ERROR(isolate, source, String);
4430 } 4364 }
4365 CHECK_CALLBACK_STATE(isolate);
4366
4431 const Script& script = Script::Handle( 4367 const Script& script = Script::Handle(
4432 isolate, Script::New(url_str, source_str, RawScript::kSourceTag)); 4368 isolate, Script::New(url_str, source_str, RawScript::kSourceTag));
4433 Dart_Handle result; 4369 Dart_Handle result;
4434 CompileSource(isolate, lib, script, &result); 4370 CompileSource(isolate, lib, script, &result);
4435 return result; 4371 return result;
4436 } 4372 }
4437 4373
4438 4374
4439 DART_EXPORT Dart_Handle Dart_LoadPatch(Dart_Handle library, 4375 DART_EXPORT Dart_Handle Dart_LoadPatch(Dart_Handle library,
4440 Dart_Handle url, 4376 Dart_Handle url,
4441 Dart_Handle patch_source) { 4377 Dart_Handle patch_source) {
4442 TIMERSCOPE(time_script_loading); 4378 TIMERSCOPE(time_script_loading);
4443 Isolate* isolate = Isolate::Current(); 4379 Isolate* isolate = Isolate::Current();
4444 DARTSCOPE(isolate); 4380 DARTSCOPE(isolate);
4445 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 4381 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4446 if (lib.IsNull()) { 4382 if (lib.IsNull()) {
4447 RETURN_TYPE_ERROR(isolate, library, Library); 4383 RETURN_TYPE_ERROR(isolate, library, Library);
4448 } 4384 }
4449 const String& url_str = Api::UnwrapStringHandle(isolate, url); 4385 const String& url_str = Api::UnwrapStringHandle(isolate, url);
4450 if (url_str.IsNull()) { 4386 if (url_str.IsNull()) {
4451 RETURN_TYPE_ERROR(isolate, url, String); 4387 RETURN_TYPE_ERROR(isolate, url, String);
4452 } 4388 }
4453 const String& source_str = Api::UnwrapStringHandle(isolate, patch_source); 4389 const String& source_str = Api::UnwrapStringHandle(isolate, patch_source);
4454 if (source_str.IsNull()) { 4390 if (source_str.IsNull()) {
4455 RETURN_TYPE_ERROR(isolate, patch_source, String); 4391 RETURN_TYPE_ERROR(isolate, patch_source, String);
4456 } 4392 }
4393 CHECK_CALLBACK_STATE(isolate);
4394
4457 const Script& script = Script::Handle( 4395 const Script& script = Script::Handle(
4458 isolate, Script::New(url_str, source_str, RawScript::kPatchTag)); 4396 isolate, Script::New(url_str, source_str, RawScript::kPatchTag));
4459 Dart_Handle result; 4397 Dart_Handle result;
4460 CompileSource(isolate, lib, script, &result); 4398 CompileSource(isolate, lib, script, &result);
4461 return result; 4399 return result;
4462 } 4400 }
4463 4401
4464 4402
4465 DART_EXPORT Dart_Handle Dart_SetNativeResolver( 4403 DART_EXPORT Dart_Handle Dart_SetNativeResolver(
4466 Dart_Handle library, 4404 Dart_Handle library,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
4524 } 4462 }
4525 { 4463 {
4526 NoGCScope no_gc; 4464 NoGCScope no_gc;
4527 RawObject* raw_obj = obj.raw(); 4465 RawObject* raw_obj = obj.raw();
4528 isolate->heap()->SetPeer(raw_obj, peer); 4466 isolate->heap()->SetPeer(raw_obj, peer);
4529 } 4467 }
4530 return Api::Success(isolate); 4468 return Api::Success(isolate);
4531 } 4469 }
4532 4470
4533 } // namespace dart 4471 } // namespace dart
OLDNEW
« vm/dart_api_impl.h ('K') | « 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