OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
8 | 8 |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 if (function.IsNull()) { | 347 if (function.IsNull()) { |
348 return ApiError::New(String::Handle(String::New(""))); | 348 return ApiError::New(String::Handle(String::New(""))); |
349 } | 349 } |
350 const Array& args = Array::Handle(Array::New(kNumArgs)); | 350 const Array& args = Array::Handle(Array::New(kNumArgs)); |
351 args.SetAt(0, receiver); | 351 args.SetAt(0, receiver); |
352 args.SetAt(1, argument); | 352 args.SetAt(1, argument); |
353 return DartEntry::InvokeFunction(function, args); | 353 return DartEntry::InvokeFunction(function, args); |
354 } | 354 } |
355 | 355 |
356 | 356 |
| 357 static const char* GetErrorString(Thread* thread, const Object& obj) { |
| 358 // This function requires an API scope to be present. |
| 359 if (obj.IsError()) { |
| 360 ASSERT(thread->api_top_scope() != NULL); |
| 361 const Error& error = Error::Cast(obj); |
| 362 const char* str = error.ToErrorCString(); |
| 363 intptr_t len = strlen(str) + 1; |
| 364 char* str_copy = Api::TopScope(thread)->zone()->Alloc<char>(len); |
| 365 strncpy(str_copy, str, len); |
| 366 // Strip a possible trailing '\n'. |
| 367 if ((len > 1) && (str_copy[len - 2] == '\n')) { |
| 368 str_copy[len - 2] = '\0'; |
| 369 } |
| 370 return str_copy; |
| 371 } else { |
| 372 return ""; |
| 373 } |
| 374 } |
| 375 |
| 376 |
357 Dart_Handle Api::InitNewHandle(Thread* thread, RawObject* raw) { | 377 Dart_Handle Api::InitNewHandle(Thread* thread, RawObject* raw) { |
358 LocalHandles* local_handles = Api::TopScope(thread)->local_handles(); | 378 LocalHandles* local_handles = Api::TopScope(thread)->local_handles(); |
359 ASSERT(local_handles != NULL); | 379 ASSERT(local_handles != NULL); |
360 LocalHandle* ref = local_handles->AllocateHandle(); | 380 LocalHandle* ref = local_handles->AllocateHandle(); |
361 ref->set_raw(raw); | 381 ref->set_raw(raw); |
362 return ref->apiHandle(); | 382 return ref->apiHandle(); |
363 } | 383 } |
364 | 384 |
365 | 385 |
366 Dart_Handle Api::NewHandle(Thread* thread, RawObject* raw) { | 386 Dart_Handle Api::NewHandle(Thread* thread, RawObject* raw) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 return Api::NewHandle(thread, isolate->object_store()->sticky_error()); | 461 return Api::NewHandle(thread, isolate->object_store()->sticky_error()); |
442 } | 462 } |
443 | 463 |
444 | 464 |
445 Dart_Isolate Api::CastIsolate(Isolate* isolate) { | 465 Dart_Isolate Api::CastIsolate(Isolate* isolate) { |
446 return reinterpret_cast<Dart_Isolate>(isolate); | 466 return reinterpret_cast<Dart_Isolate>(isolate); |
447 } | 467 } |
448 | 468 |
449 | 469 |
450 Dart_Handle Api::NewError(const char* format, ...) { | 470 Dart_Handle Api::NewError(const char* format, ...) { |
451 DARTSCOPE(Thread::Current()); | 471 Thread* T = Thread::Current(); |
| 472 CHECK_API_SCOPE(T); |
| 473 HANDLESCOPE(T); |
452 CHECK_CALLBACK_STATE(T); | 474 CHECK_CALLBACK_STATE(T); |
453 | 475 |
454 va_list args; | 476 va_list args; |
455 va_start(args, format); | 477 va_start(args, format); |
456 intptr_t len = OS::VSNPrint(NULL, 0, format, args); | 478 intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
457 va_end(args); | 479 va_end(args); |
458 | 480 |
459 char* buffer = Z->Alloc<char>(len + 1); | 481 char* buffer = Z->Alloc<char>(len + 1); |
460 va_list args2; | 482 va_list args2; |
461 va_start(args2, format); | 483 va_start(args2, format); |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 DARTSCOPE(Thread::Current()); | 760 DARTSCOPE(Thread::Current()); |
739 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); | 761 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); |
740 return (obj.IsUnwindError() && UnwindError::Cast(obj).is_vm_restart()); | 762 return (obj.IsUnwindError() && UnwindError::Cast(obj).is_vm_restart()); |
741 } | 763 } |
742 | 764 |
743 | 765 |
744 DART_EXPORT const char* Dart_GetError(Dart_Handle handle) { | 766 DART_EXPORT const char* Dart_GetError(Dart_Handle handle) { |
745 API_TIMELINE_DURATION; | 767 API_TIMELINE_DURATION; |
746 DARTSCOPE(Thread::Current()); | 768 DARTSCOPE(Thread::Current()); |
747 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); | 769 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); |
748 if (obj.IsError()) { | 770 return GetErrorString(T, obj); |
749 const Error& error = Error::Cast(obj); | |
750 const char* str = error.ToErrorCString(); | |
751 intptr_t len = strlen(str) + 1; | |
752 char* str_copy = Api::TopScope(T)->zone()->Alloc<char>(len); | |
753 strncpy(str_copy, str, len); | |
754 // Strip a possible trailing '\n'. | |
755 if ((len > 1) && (str_copy[len - 2] == '\n')) { | |
756 str_copy[len - 2] = '\0'; | |
757 } | |
758 return str_copy; | |
759 } else { | |
760 return ""; | |
761 } | |
762 } | 771 } |
763 | 772 |
764 | 773 |
765 DART_EXPORT bool Dart_ErrorHasException(Dart_Handle handle) { | 774 DART_EXPORT bool Dart_ErrorHasException(Dart_Handle handle) { |
766 DARTSCOPE(Thread::Current()); | 775 DARTSCOPE(Thread::Current()); |
767 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); | 776 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); |
768 return obj.IsUnhandledException(); | 777 return obj.IsUnhandledException(); |
769 } | 778 } |
770 | 779 |
771 | 780 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 } | 817 } |
809 | 818 |
810 | 819 |
811 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { | 820 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { |
812 DARTSCOPE(Thread::Current()); | 821 DARTSCOPE(Thread::Current()); |
813 CHECK_CALLBACK_STATE(T); | 822 CHECK_CALLBACK_STATE(T); |
814 | 823 |
815 Instance& obj = Instance::Handle(Z); | 824 Instance& obj = Instance::Handle(Z); |
816 intptr_t class_id = Api::ClassId(exception); | 825 intptr_t class_id = Api::ClassId(exception); |
817 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) { | 826 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) { |
818 obj = String::New(::Dart_GetError(exception)); | 827 const Object& excp = Object::Handle(Z, Api::UnwrapHandle(exception)); |
| 828 obj = String::New(GetErrorString(T, excp)); |
819 } else { | 829 } else { |
820 obj = Api::UnwrapInstanceHandle(Z, exception).raw(); | 830 obj = Api::UnwrapInstanceHandle(Z, exception).raw(); |
821 if (obj.IsNull()) { | 831 if (obj.IsNull()) { |
822 RETURN_TYPE_ERROR(Z, exception, Instance); | 832 RETURN_TYPE_ERROR(Z, exception, Instance); |
823 } | 833 } |
824 } | 834 } |
825 const Stacktrace& stacktrace = Stacktrace::Handle(Z); | 835 const Stacktrace& stacktrace = Stacktrace::Handle(Z); |
826 return Api::NewHandle(T, UnhandledException::New(obj, stacktrace)); | 836 return Api::NewHandle(T, UnhandledException::New(obj, stacktrace)); |
827 } | 837 } |
828 | 838 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1023 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( | 1033 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( |
1024 Dart_Handle object, | 1034 Dart_Handle object, |
1025 void* peer, | 1035 void* peer, |
1026 intptr_t external_allocation_size, | 1036 intptr_t external_allocation_size, |
1027 Dart_WeakPersistentHandleFinalizer callback) { | 1037 Dart_WeakPersistentHandleFinalizer callback) { |
1028 Thread* thread = Thread::Current(); | 1038 Thread* thread = Thread::Current(); |
1029 CHECK_ISOLATE(thread->isolate()); | 1039 CHECK_ISOLATE(thread->isolate()); |
1030 if (callback == NULL) { | 1040 if (callback == NULL) { |
1031 return NULL; | 1041 return NULL; |
1032 } | 1042 } |
| 1043 TransitionNativeToVM transition(thread); |
1033 return AllocateFinalizableHandle(thread, | 1044 return AllocateFinalizableHandle(thread, |
1034 object, | 1045 object, |
1035 peer, | 1046 peer, |
1036 external_allocation_size, | 1047 external_allocation_size, |
1037 callback); | 1048 callback); |
1038 } | 1049 } |
1039 | 1050 |
1040 | 1051 |
1041 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { | 1052 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { |
1042 Isolate* isolate = Isolate::Current(); | 1053 Isolate* isolate = Isolate::Current(); |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1241 const Error& error_obj = | 1252 const Error& error_obj = |
1242 Error::Handle(Z, Dart::InitializeIsolate(snapshot, callback_data)); | 1253 Error::Handle(Z, Dart::InitializeIsolate(snapshot, callback_data)); |
1243 if (error_obj.IsNull()) { | 1254 if (error_obj.IsNull()) { |
1244 #if defined(DART_NO_SNAPSHOT) | 1255 #if defined(DART_NO_SNAPSHOT) |
1245 if (FLAG_check_function_fingerprints) { | 1256 if (FLAG_check_function_fingerprints) { |
1246 Library::CheckFunctionFingerprints(); | 1257 Library::CheckFunctionFingerprints(); |
1247 } | 1258 } |
1248 #endif // defined(DART_NO_SNAPSHOT). | 1259 #endif // defined(DART_NO_SNAPSHOT). |
1249 // We exit the API scope entered above. | 1260 // We exit the API scope entered above. |
1250 Dart_ExitScope(); | 1261 Dart_ExitScope(); |
| 1262 // A Thread structure has been associated to the thread, we do the |
| 1263 // safepoint transition explicity here instead of using the |
| 1264 // TransitionXXX scope objects as the reverse transition happens |
| 1265 // outside this scope in Dart_ShutdownIsolate/Dart_ExitIsolate. |
| 1266 T->set_execution_state(Thread::kThreadInNative); |
| 1267 T->EnterSafepoint(); |
1251 return Api::CastIsolate(I); | 1268 return Api::CastIsolate(I); |
1252 } | 1269 } |
1253 *error = strdup(error_obj.ToErrorCString()); | 1270 *error = strdup(error_obj.ToErrorCString()); |
1254 // We exit the API scope entered above. | 1271 // We exit the API scope entered above. |
1255 Dart_ExitScope(); | 1272 Dart_ExitScope(); |
1256 } | 1273 } |
1257 Dart::ShutdownIsolate(); | 1274 Dart::ShutdownIsolate(); |
1258 return reinterpret_cast<Dart_Isolate>(NULL); | 1275 return reinterpret_cast<Dart_Isolate>(NULL); |
1259 } | 1276 } |
1260 | 1277 |
1261 | 1278 |
1262 DART_EXPORT void Dart_ShutdownIsolate() { | 1279 DART_EXPORT void Dart_ShutdownIsolate() { |
1263 Thread* T = Thread::Current(); | 1280 Thread* T = Thread::Current(); |
1264 Isolate* I = T->isolate(); | 1281 Isolate* I = T->isolate(); |
1265 CHECK_ISOLATE(I); | 1282 CHECK_ISOLATE(I); |
1266 I->WaitForOutstandingSpawns(); | 1283 I->WaitForOutstandingSpawns(); |
1267 { | 1284 { |
1268 StackZone zone(T); | 1285 StackZone zone(T); |
1269 HandleScope handle_scope(T); | 1286 HandleScope handle_scope(T); |
1270 Dart::RunShutdownCallback(); | 1287 Dart::RunShutdownCallback(); |
1271 } | 1288 } |
| 1289 // The Thread structure is disassociated from the isolate, we do the |
| 1290 // safepoint transition explicity here instead of using the TransitionXXX |
| 1291 // scope objects as the original transition happened outside this scope in |
| 1292 // Dart_EnterIsolate/Dart_CreateIsolate. |
| 1293 T->ExitSafepoint(); |
| 1294 T->set_execution_state(Thread::kThreadInVM); |
1272 Dart::ShutdownIsolate(); | 1295 Dart::ShutdownIsolate(); |
1273 } | 1296 } |
1274 | 1297 |
1275 | 1298 |
1276 DART_EXPORT Dart_Isolate Dart_CurrentIsolate() { | 1299 DART_EXPORT Dart_Isolate Dart_CurrentIsolate() { |
1277 return Api::CastIsolate(Isolate::Current()); | 1300 return Api::CastIsolate(Isolate::Current()); |
1278 } | 1301 } |
1279 | 1302 |
1280 | 1303 |
1281 DART_EXPORT void* Dart_CurrentIsolateData() { | 1304 DART_EXPORT void* Dart_CurrentIsolateData() { |
(...skipping 23 matching lines...) Expand all Loading... |
1305 DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate) { | 1328 DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate) { |
1306 CHECK_NO_ISOLATE(Isolate::Current()); | 1329 CHECK_NO_ISOLATE(Isolate::Current()); |
1307 // TODO(16615): Validate isolate parameter. | 1330 // TODO(16615): Validate isolate parameter. |
1308 Isolate* iso = reinterpret_cast<Isolate*>(isolate); | 1331 Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
1309 if (iso->HasMutatorThread()) { | 1332 if (iso->HasMutatorThread()) { |
1310 FATAL("Multiple mutators within one isolate is not supported."); | 1333 FATAL("Multiple mutators within one isolate is not supported."); |
1311 } | 1334 } |
1312 if (!Thread::EnterIsolate(iso)) { | 1335 if (!Thread::EnterIsolate(iso)) { |
1313 FATAL("Unable to Enter Isolate as Dart VM is shutting down"); | 1336 FATAL("Unable to Enter Isolate as Dart VM is shutting down"); |
1314 } | 1337 } |
| 1338 // A Thread structure has been associated to the thread, we do the |
| 1339 // safepoint transition explicity here instead of using the |
| 1340 // TransitionXXX scope objects as the reverse transition happens |
| 1341 // outside this scope in Dart_ExitIsolate/Dart_ShutdownIsolate. |
| 1342 Thread* T = Thread::Current(); |
| 1343 T->set_execution_state(Thread::kThreadInNative); |
| 1344 T->EnterSafepoint(); |
1315 } | 1345 } |
1316 | 1346 |
1317 | 1347 |
1318 DART_EXPORT void Dart_ThreadDisableProfiling() { | 1348 DART_EXPORT void Dart_ThreadDisableProfiling() { |
1319 OSThread* os_thread = OSThread::Current(); | 1349 OSThread* os_thread = OSThread::Current(); |
1320 if (os_thread == NULL) { | 1350 if (os_thread == NULL) { |
1321 return; | 1351 return; |
1322 } | 1352 } |
1323 os_thread->DisableThreadInterrupts(); | 1353 os_thread->DisableThreadInterrupts(); |
1324 } | 1354 } |
1325 | 1355 |
1326 | 1356 |
1327 DART_EXPORT void Dart_ThreadEnableProfiling() { | 1357 DART_EXPORT void Dart_ThreadEnableProfiling() { |
1328 OSThread* os_thread = OSThread::Current(); | 1358 OSThread* os_thread = OSThread::Current(); |
1329 if (os_thread == NULL) { | 1359 if (os_thread == NULL) { |
1330 return; | 1360 return; |
1331 } | 1361 } |
1332 os_thread->EnableThreadInterrupts(); | 1362 os_thread->EnableThreadInterrupts(); |
1333 } | 1363 } |
1334 | 1364 |
1335 | 1365 |
1336 DART_EXPORT void Dart_ExitIsolate() { | 1366 DART_EXPORT void Dart_ExitIsolate() { |
1337 CHECK_ISOLATE(Isolate::Current()); | 1367 Thread* T = Thread::Current(); |
| 1368 CHECK_ISOLATE(T->isolate()); |
| 1369 // The Thread structure is disassociated from the isolate, we do the |
| 1370 // safepoint transition explicity here instead of using the TransitionXXX |
| 1371 // scope objects as the original transition happened outside this scope in |
| 1372 // Dart_EnterIsolate/Dart_CreateIsolate. |
| 1373 ASSERT(T->execution_state() == Thread::kThreadInNative); |
| 1374 T->ExitSafepoint(); |
| 1375 T->set_execution_state(Thread::kThreadInVM); |
1338 Thread::ExitIsolate(); | 1376 Thread::ExitIsolate(); |
1339 } | 1377 } |
1340 | 1378 |
1341 | 1379 |
1342 static uint8_t* ApiReallocate(uint8_t* ptr, | 1380 static uint8_t* ApiReallocate(uint8_t* ptr, |
1343 intptr_t old_size, | 1381 intptr_t old_size, |
1344 intptr_t new_size) { | 1382 intptr_t new_size) { |
1345 return Api::TopScope(Thread::Current())->zone()->Realloc<uint8_t>( | 1383 return Api::TopScope(Thread::Current())->zone()->Realloc<uint8_t>( |
1346 ptr, old_size, new_size); | 1384 ptr, old_size, new_size); |
1347 } | 1385 } |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1493 Thread* T = Thread::Current(); | 1531 Thread* T = Thread::Current(); |
1494 Isolate* I = T->isolate(); | 1532 Isolate* I = T->isolate(); |
1495 CHECK_API_SCOPE(T); | 1533 CHECK_API_SCOPE(T); |
1496 CHECK_CALLBACK_STATE(T); | 1534 CHECK_CALLBACK_STATE(T); |
1497 API_TIMELINE_BEGIN_END; | 1535 API_TIMELINE_BEGIN_END; |
1498 Monitor monitor; | 1536 Monitor monitor; |
1499 MonitorLocker ml(&monitor); | 1537 MonitorLocker ml(&monitor); |
1500 { | 1538 { |
1501 // The message handler run loop does not expect to have a current isolate | 1539 // The message handler run loop does not expect to have a current isolate |
1502 // so we exit the isolate here and enter it again after the runloop is done. | 1540 // so we exit the isolate here and enter it again after the runloop is done. |
1503 Thread::ExitIsolate(); | 1541 Dart_ExitIsolate(); |
1504 RunLoopData data; | 1542 RunLoopData data; |
1505 data.monitor = &monitor; | 1543 data.monitor = &monitor; |
1506 data.done = false; | 1544 data.done = false; |
1507 I->message_handler()->Run( | 1545 I->message_handler()->Run( |
1508 Dart::thread_pool(), | 1546 Dart::thread_pool(), |
1509 NULL, RunLoopDone, reinterpret_cast<uword>(&data)); | 1547 NULL, RunLoopDone, reinterpret_cast<uword>(&data)); |
1510 while (!data.done) { | 1548 while (!data.done) { |
1511 ml.Wait(); | 1549 ml.Wait(); |
1512 } | 1550 } |
1513 if (!Thread::EnterIsolate(I)) { | 1551 Dart_EnterIsolate(Api::CastIsolate(I)); |
1514 FATAL("Inconsistent state, VM shutting down while in run loop."); | |
1515 } | |
1516 } | 1552 } |
1517 if (I->object_store()->sticky_error() != Object::null()) { | 1553 if (I->object_store()->sticky_error() != Object::null()) { |
1518 Dart_Handle error = Api::NewHandle(T, I->object_store()->sticky_error()); | 1554 Dart_Handle error = Api::NewHandle(T, I->object_store()->sticky_error()); |
1519 I->object_store()->clear_sticky_error(); | 1555 I->object_store()->clear_sticky_error(); |
1520 return error; | 1556 return error; |
1521 } | 1557 } |
1522 if (FLAG_print_class_table) { | 1558 if (FLAG_print_class_table) { |
1523 HANDLESCOPE(T); | 1559 HANDLESCOPE(T); |
1524 I->class_table()->Print(); | 1560 I->class_table()->Print(); |
1525 } | 1561 } |
1526 return Api::Success(); | 1562 return Api::Success(); |
1527 } | 1563 } |
1528 | 1564 |
1529 | 1565 |
1530 DART_EXPORT Dart_Handle Dart_HandleMessage() { | 1566 DART_EXPORT Dart_Handle Dart_HandleMessage() { |
1531 Thread* T = Thread::Current(); | 1567 Thread* T = Thread::Current(); |
1532 Isolate* I = T->isolate(); | 1568 Isolate* I = T->isolate(); |
1533 CHECK_API_SCOPE(T); | 1569 CHECK_API_SCOPE(T); |
1534 CHECK_CALLBACK_STATE(T); | 1570 CHECK_CALLBACK_STATE(T); |
1535 API_TIMELINE_BEGIN_END; | 1571 API_TIMELINE_BEGIN_END; |
| 1572 TransitionNativeToVM trainsition(T); |
1536 if (I->message_handler()->HandleNextMessage() != MessageHandler::kOK) { | 1573 if (I->message_handler()->HandleNextMessage() != MessageHandler::kOK) { |
1537 Dart_Handle error = Api::NewHandle(T, I->object_store()->sticky_error()); | 1574 Dart_Handle error = Api::NewHandle(T, I->object_store()->sticky_error()); |
1538 I->object_store()->clear_sticky_error(); | 1575 I->object_store()->clear_sticky_error(); |
1539 return error; | 1576 return error; |
1540 } | 1577 } |
1541 return Api::Success(); | 1578 return Api::Success(); |
1542 } | 1579 } |
1543 | 1580 |
1544 | 1581 |
1545 DART_EXPORT bool Dart_HandleServiceMessages() { | 1582 DART_EXPORT bool Dart_HandleServiceMessages() { |
1546 Thread* T = Thread::Current(); | 1583 Thread* T = Thread::Current(); |
1547 Isolate* I = T->isolate(); | 1584 Isolate* I = T->isolate(); |
1548 CHECK_API_SCOPE(T); | 1585 CHECK_API_SCOPE(T); |
1549 CHECK_CALLBACK_STATE(T); | 1586 CHECK_CALLBACK_STATE(T); |
1550 API_TIMELINE_DURATION; | 1587 API_TIMELINE_DURATION; |
| 1588 TransitionNativeToVM trainsition(T); |
1551 ASSERT(I->GetAndClearResumeRequest() == false); | 1589 ASSERT(I->GetAndClearResumeRequest() == false); |
1552 MessageHandler::MessageStatus status = | 1590 MessageHandler::MessageStatus status = |
1553 I->message_handler()->HandleOOBMessages(); | 1591 I->message_handler()->HandleOOBMessages(); |
1554 bool resume = I->GetAndClearResumeRequest(); | 1592 bool resume = I->GetAndClearResumeRequest(); |
1555 return (status != MessageHandler::kOK) || resume; | 1593 return (status != MessageHandler::kOK) || resume; |
1556 } | 1594 } |
1557 | 1595 |
1558 | 1596 |
1559 DART_EXPORT bool Dart_HasServiceMessages() { | 1597 DART_EXPORT bool Dart_HasServiceMessages() { |
1560 Isolate* isolate = Isolate::Current(); | 1598 Isolate* isolate = Isolate::Current(); |
(...skipping 3251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4812 ASSERT(isolate->api_state() != NULL && | 4850 ASSERT(isolate->api_state() != NULL && |
4813 (isolate->api_state()->IsValidWeakPersistentHandle(rval))); | 4851 (isolate->api_state()->IsValidWeakPersistentHandle(rval))); |
4814 #endif | 4852 #endif |
4815 Api::SetWeakHandleReturnValue(arguments, rval); | 4853 Api::SetWeakHandleReturnValue(arguments, rval); |
4816 } | 4854 } |
4817 | 4855 |
4818 | 4856 |
4819 // --- Environment --- | 4857 // --- Environment --- |
4820 RawString* Api::CallEnvironmentCallback(Thread* thread, const String& name) { | 4858 RawString* Api::CallEnvironmentCallback(Thread* thread, const String& name) { |
4821 Isolate* isolate = thread->isolate(); | 4859 Isolate* isolate = thread->isolate(); |
4822 Scope api_scope(thread); | |
4823 Dart_EnvironmentCallback callback = isolate->environment_callback(); | 4860 Dart_EnvironmentCallback callback = isolate->environment_callback(); |
4824 String& result = String::Handle(thread->zone()); | 4861 String& result = String::Handle(thread->zone()); |
4825 if (callback != NULL) { | 4862 if (callback != NULL) { |
| 4863 TransitionVMToNative transition(thread); |
| 4864 Scope api_scope(thread); |
4826 Dart_Handle response = callback(Api::NewHandle(thread, name.raw())); | 4865 Dart_Handle response = callback(Api::NewHandle(thread, name.raw())); |
4827 if (::Dart_IsString(response)) { | 4866 if (::Dart_IsString(response)) { |
4828 result ^= Api::UnwrapHandle(response); | 4867 result ^= Api::UnwrapHandle(response); |
4829 } else if (::Dart_IsError(response)) { | 4868 } else if (::Dart_IsError(response)) { |
4830 const Object& error = Object::Handle( | 4869 const Object& error = Object::Handle( |
4831 thread->zone(), Api::UnwrapHandle(response)); | 4870 thread->zone(), Api::UnwrapHandle(response)); |
4832 Exceptions::ThrowArgumentError( | 4871 Exceptions::ThrowArgumentError( |
4833 String::Handle(String::New(Error::Cast(error).ToErrorCString()))); | 4872 String::Handle(String::New(Error::Cast(error).ToErrorCString()))); |
4834 } else if (!::Dart_IsNull(response)) { | 4873 } else if (!::Dart_IsNull(response)) { |
4835 // At this point everything except null are invalid environment values. | 4874 // At this point everything except null are invalid environment values. |
(...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5969 return Api::Success(); | 6008 return Api::Success(); |
5970 } | 6009 } |
5971 #endif // DART_PRECOMPILED_RUNTIME | 6010 #endif // DART_PRECOMPILED_RUNTIME |
5972 | 6011 |
5973 | 6012 |
5974 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { | 6013 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { |
5975 return Dart::IsRunningPrecompiledCode(); | 6014 return Dart::IsRunningPrecompiledCode(); |
5976 } | 6015 } |
5977 | 6016 |
5978 } // namespace dart | 6017 } // namespace dart |
OLD | NEW |