| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 52 |
| 53 | 53 |
| 54 DECLARE_FLAG(bool, load_deferred_eagerly); | 54 DECLARE_FLAG(bool, load_deferred_eagerly); |
| 55 DECLARE_FLAG(bool, precompilation); | 55 DECLARE_FLAG(bool, precompilation); |
| 56 DECLARE_FLAG(bool, print_class_table); | 56 DECLARE_FLAG(bool, print_class_table); |
| 57 DECLARE_FLAG(bool, verify_handles); | 57 DECLARE_FLAG(bool, verify_handles); |
| 58 #if defined(DART_NO_SNAPSHOT) | 58 #if defined(DART_NO_SNAPSHOT) |
| 59 DEFINE_FLAG(bool, check_function_fingerprints, true, | 59 DEFINE_FLAG(bool, check_function_fingerprints, true, |
| 60 "Check function fingerprints"); | 60 "Check function fingerprints"); |
| 61 #endif // defined(DART_NO_SNAPSHOT). | 61 #endif // defined(DART_NO_SNAPSHOT). |
| 62 DEFINE_FLAG(bool, trace_api, false, | |
| 63 "Trace invocation of API calls (debug mode only)"); | |
| 64 DEFINE_FLAG(bool, verify_acquired_data, false, | 62 DEFINE_FLAG(bool, verify_acquired_data, false, |
| 65 "Verify correct API acquire/release of typed data."); | 63 "Verify correct API acquire/release of typed data."); |
| 66 | 64 |
| 67 ThreadLocalKey Api::api_native_key_ = kUnsetThreadLocalKey; | 65 ThreadLocalKey Api::api_native_key_ = kUnsetThreadLocalKey; |
| 68 Dart_Handle Api::true_handle_ = NULL; | 66 Dart_Handle Api::true_handle_ = NULL; |
| 69 Dart_Handle Api::false_handle_ = NULL; | 67 Dart_Handle Api::false_handle_ = NULL; |
| 70 Dart_Handle Api::null_handle_ = NULL; | 68 Dart_Handle Api::null_handle_ = NULL; |
| 71 Dart_Handle Api::empty_string_handle_ = NULL; | 69 Dart_Handle Api::empty_string_handle_ = NULL; |
| 72 | 70 |
| 73 | 71 |
| 74 const char* CanonicalFunction(const char* func) { | 72 const char* CanonicalFunction(const char* func) { |
| 75 if (strncmp(func, "dart::", 6) == 0) { | 73 if (strncmp(func, "dart::", 6) == 0) { |
| 76 return func + 6; | 74 return func + 6; |
| 77 } else { | 75 } else { |
| 78 return func; | 76 return func; |
| 79 } | 77 } |
| 80 } | 78 } |
| 81 | 79 |
| 80 #define API_TIMELINE_DURATION \ |
| 81 TimelineDurationScope tds(Thread::Current(), \ |
| 82 Timeline::GetVMApiStream(), \ |
| 83 CURRENT_FUNC) |
| 84 |
| 85 #define API_TIMELINE_BEGIN_END \ |
| 86 TimelineBeginEndScope tbes(Thread::Current(), \ |
| 87 Timeline::GetVMApiStream(), \ |
| 88 CURRENT_FUNC) |
| 82 | 89 |
| 83 #if defined(DEBUG) | 90 #if defined(DEBUG) |
| 84 // An object visitor which will iterate over all the function objects in the | 91 // An object visitor which will iterate over all the function objects in the |
| 85 // heap and check if the result type and parameter types are canonicalized | 92 // heap and check if the result type and parameter types are canonicalized |
| 86 // or not. An assertion is raised if a type is not canonicalized. | 93 // or not. An assertion is raised if a type is not canonicalized. |
| 87 class FunctionVisitor : public ObjectVisitor { | 94 class FunctionVisitor : public ObjectVisitor { |
| 88 public: | 95 public: |
| 89 explicit FunctionVisitor(Thread* thread) : | 96 explicit FunctionVisitor(Thread* thread) : |
| 90 ObjectVisitor(thread->isolate()), | 97 ObjectVisitor(thread->isolate()), |
| 91 classHandle_(Class::Handle(thread->zone())), | 98 classHandle_(Class::Handle(thread->zone())), |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 (*callback)(isolate->init_callback_data(), object, peer); | 701 (*callback)(isolate->init_callback_data(), object, peer); |
| 695 ApiState* state = isolate->api_state(); | 702 ApiState* state = isolate->api_state(); |
| 696 ASSERT(state != NULL); | 703 ASSERT(state != NULL); |
| 697 state->weak_persistent_handles().FreeHandle(handle); | 704 state->weak_persistent_handles().FreeHandle(handle); |
| 698 } | 705 } |
| 699 | 706 |
| 700 | 707 |
| 701 // --- Handles --- | 708 // --- Handles --- |
| 702 | 709 |
| 703 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { | 710 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { |
| 704 TRACE_API_CALL(CURRENT_FUNC); | |
| 705 return RawObject::IsErrorClassId(Api::ClassId(handle)); | 711 return RawObject::IsErrorClassId(Api::ClassId(handle)); |
| 706 } | 712 } |
| 707 | 713 |
| 708 | 714 |
| 709 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) { | 715 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) { |
| 710 TRACE_API_CALL(CURRENT_FUNC); | |
| 711 return Api::ClassId(object) == kApiErrorCid; | 716 return Api::ClassId(object) == kApiErrorCid; |
| 712 } | 717 } |
| 713 | 718 |
| 714 | 719 |
| 715 DART_EXPORT bool Dart_IsUnhandledExceptionError(Dart_Handle object) { | 720 DART_EXPORT bool Dart_IsUnhandledExceptionError(Dart_Handle object) { |
| 716 TRACE_API_CALL(CURRENT_FUNC); | |
| 717 return Api::ClassId(object) == kUnhandledExceptionCid; | 721 return Api::ClassId(object) == kUnhandledExceptionCid; |
| 718 } | 722 } |
| 719 | 723 |
| 720 | 724 |
| 721 DART_EXPORT bool Dart_IsCompilationError(Dart_Handle object) { | 725 DART_EXPORT bool Dart_IsCompilationError(Dart_Handle object) { |
| 722 TRACE_API_CALL(CURRENT_FUNC); | |
| 723 return Api::ClassId(object) == kLanguageErrorCid; | 726 return Api::ClassId(object) == kLanguageErrorCid; |
| 724 } | 727 } |
| 725 | 728 |
| 726 | 729 |
| 727 DART_EXPORT bool Dart_IsFatalError(Dart_Handle object) { | 730 DART_EXPORT bool Dart_IsFatalError(Dart_Handle object) { |
| 728 TRACE_API_CALL(CURRENT_FUNC); | |
| 729 return Api::ClassId(object) == kUnwindErrorCid; | 731 return Api::ClassId(object) == kUnwindErrorCid; |
| 730 } | 732 } |
| 731 | 733 |
| 732 | 734 |
| 733 DART_EXPORT bool Dart_IsVMRestartRequest(Dart_Handle handle) { | 735 DART_EXPORT bool Dart_IsVMRestartRequest(Dart_Handle handle) { |
| 734 DARTSCOPE(Thread::Current()); | 736 DARTSCOPE(Thread::Current()); |
| 735 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); | 737 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); |
| 736 return (obj.IsUnwindError() && UnwindError::Cast(obj).is_vm_restart()); | 738 return (obj.IsUnwindError() && UnwindError::Cast(obj).is_vm_restart()); |
| 737 } | 739 } |
| 738 | 740 |
| 739 | 741 |
| 740 DART_EXPORT const char* Dart_GetError(Dart_Handle handle) { | 742 DART_EXPORT const char* Dart_GetError(Dart_Handle handle) { |
| 743 API_TIMELINE_DURATION; |
| 741 DARTSCOPE(Thread::Current()); | 744 DARTSCOPE(Thread::Current()); |
| 742 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); | 745 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); |
| 743 if (obj.IsError()) { | 746 if (obj.IsError()) { |
| 744 const Error& error = Error::Cast(obj); | 747 const Error& error = Error::Cast(obj); |
| 745 const char* str = error.ToErrorCString(); | 748 const char* str = error.ToErrorCString(); |
| 746 intptr_t len = strlen(str) + 1; | 749 intptr_t len = strlen(str) + 1; |
| 747 char* str_copy = Api::TopScope(T)->zone()->Alloc<char>(len); | 750 char* str_copy = Api::TopScope(T)->zone()->Alloc<char>(len); |
| 748 strncpy(str_copy, str, len); | 751 strncpy(str_copy, str, len); |
| 749 // Strip a possible trailing '\n'. | 752 // Strip a possible trailing '\n'. |
| 750 if ((len > 1) && (str_copy[len - 2] == '\n')) { | 753 if ((len > 1) && (str_copy[len - 2] == '\n')) { |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 | 1276 |
| 1274 | 1277 |
| 1275 DART_EXPORT void* Dart_CurrentIsolateData() { | 1278 DART_EXPORT void* Dart_CurrentIsolateData() { |
| 1276 Isolate* isolate = Isolate::Current(); | 1279 Isolate* isolate = Isolate::Current(); |
| 1277 CHECK_ISOLATE(isolate); | 1280 CHECK_ISOLATE(isolate); |
| 1278 return isolate->init_callback_data(); | 1281 return isolate->init_callback_data(); |
| 1279 } | 1282 } |
| 1280 | 1283 |
| 1281 | 1284 |
| 1282 DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate) { | 1285 DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate) { |
| 1283 TRACE_API_CALL(CURRENT_FUNC); | |
| 1284 if (isolate == NULL) { | 1286 if (isolate == NULL) { |
| 1285 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); | 1287 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); |
| 1286 } | 1288 } |
| 1287 // TODO(16615): Validate isolate parameter. | 1289 // TODO(16615): Validate isolate parameter. |
| 1288 Isolate* iso = reinterpret_cast<Isolate*>(isolate); | 1290 Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
| 1289 return iso->init_callback_data(); | 1291 return iso->init_callback_data(); |
| 1290 } | 1292 } |
| 1291 | 1293 |
| 1292 | 1294 |
| 1293 DART_EXPORT Dart_Handle Dart_DebugName() { | 1295 DART_EXPORT Dart_Handle Dart_DebugName() { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1442 | 1444 |
| 1443 | 1445 |
| 1444 DART_EXPORT Dart_Handle Dart_CreateLibrarySnapshot(Dart_Handle library, | 1446 DART_EXPORT Dart_Handle Dart_CreateLibrarySnapshot(Dart_Handle library, |
| 1445 uint8_t** buffer, | 1447 uint8_t** buffer, |
| 1446 intptr_t* size) { | 1448 intptr_t* size) { |
| 1447 return createLibrarySnapshot(library, buffer, size); | 1449 return createLibrarySnapshot(library, buffer, size); |
| 1448 } | 1450 } |
| 1449 | 1451 |
| 1450 | 1452 |
| 1451 DART_EXPORT void Dart_InterruptIsolate(Dart_Isolate isolate) { | 1453 DART_EXPORT void Dart_InterruptIsolate(Dart_Isolate isolate) { |
| 1452 TRACE_API_CALL(CURRENT_FUNC); | |
| 1453 if (isolate == NULL) { | 1454 if (isolate == NULL) { |
| 1454 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); | 1455 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); |
| 1455 } | 1456 } |
| 1456 // TODO(16615): Validate isolate parameter. | 1457 // TODO(16615): Validate isolate parameter. |
| 1457 Isolate* iso = reinterpret_cast<Isolate*>(isolate); | 1458 Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
| 1458 iso->SendInternalLibMessage(Isolate::kInterruptMsg, iso->pause_capability()); | 1459 iso->SendInternalLibMessage(Isolate::kInterruptMsg, iso->pause_capability()); |
| 1459 } | 1460 } |
| 1460 | 1461 |
| 1461 | 1462 |
| 1462 DART_EXPORT bool Dart_IsolateMakeRunnable(Dart_Isolate isolate) { | 1463 DART_EXPORT bool Dart_IsolateMakeRunnable(Dart_Isolate isolate) { |
| 1463 CHECK_NO_ISOLATE(Isolate::Current()); | 1464 CHECK_NO_ISOLATE(Isolate::Current()); |
| 1465 API_TIMELINE_DURATION; |
| 1464 if (isolate == NULL) { | 1466 if (isolate == NULL) { |
| 1465 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); | 1467 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); |
| 1466 } | 1468 } |
| 1467 // TODO(16615): Validate isolate parameter. | 1469 // TODO(16615): Validate isolate parameter. |
| 1468 Isolate* iso = reinterpret_cast<Isolate*>(isolate); | 1470 Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
| 1469 if (iso->object_store()->root_library() == Library::null()) { | 1471 if (iso->object_store()->root_library() == Library::null()) { |
| 1470 // The embedder should have called Dart_LoadScript by now. | 1472 // The embedder should have called Dart_LoadScript by now. |
| 1471 return false; | 1473 return false; |
| 1472 } | 1474 } |
| 1473 return iso->MakeRunnable(); | 1475 return iso->MakeRunnable(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1497 data->done = true; | 1499 data->done = true; |
| 1498 ml.Notify(); | 1500 ml.Notify(); |
| 1499 } | 1501 } |
| 1500 | 1502 |
| 1501 | 1503 |
| 1502 DART_EXPORT Dart_Handle Dart_RunLoop() { | 1504 DART_EXPORT Dart_Handle Dart_RunLoop() { |
| 1503 Thread* T = Thread::Current(); | 1505 Thread* T = Thread::Current(); |
| 1504 Isolate* I = T->isolate(); | 1506 Isolate* I = T->isolate(); |
| 1505 CHECK_API_SCOPE(T); | 1507 CHECK_API_SCOPE(T); |
| 1506 CHECK_CALLBACK_STATE(T); | 1508 CHECK_CALLBACK_STATE(T); |
| 1509 API_TIMELINE_BEGIN_END; |
| 1507 Monitor monitor; | 1510 Monitor monitor; |
| 1508 MonitorLocker ml(&monitor); | 1511 MonitorLocker ml(&monitor); |
| 1509 { | 1512 { |
| 1510 // The message handler run loop does not expect to have a current isolate | 1513 // The message handler run loop does not expect to have a current isolate |
| 1511 // so we exit the isolate here and enter it again after the runloop is done. | 1514 // so we exit the isolate here and enter it again after the runloop is done. |
| 1512 Thread::ExitIsolate(); | 1515 Thread::ExitIsolate(); |
| 1513 RunLoopData data; | 1516 RunLoopData data; |
| 1514 data.monitor = &monitor; | 1517 data.monitor = &monitor; |
| 1515 data.done = false; | 1518 data.done = false; |
| 1516 I->message_handler()->Run( | 1519 I->message_handler()->Run( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1532 } | 1535 } |
| 1533 return Api::Success(); | 1536 return Api::Success(); |
| 1534 } | 1537 } |
| 1535 | 1538 |
| 1536 | 1539 |
| 1537 DART_EXPORT Dart_Handle Dart_HandleMessage() { | 1540 DART_EXPORT Dart_Handle Dart_HandleMessage() { |
| 1538 Thread* T = Thread::Current(); | 1541 Thread* T = Thread::Current(); |
| 1539 Isolate* I = T->isolate(); | 1542 Isolate* I = T->isolate(); |
| 1540 CHECK_API_SCOPE(T); | 1543 CHECK_API_SCOPE(T); |
| 1541 CHECK_CALLBACK_STATE(T); | 1544 CHECK_CALLBACK_STATE(T); |
| 1545 API_TIMELINE_BEGIN_END; |
| 1542 if (I->message_handler()->HandleNextMessage() != MessageHandler::kOK) { | 1546 if (I->message_handler()->HandleNextMessage() != MessageHandler::kOK) { |
| 1543 Dart_Handle error = Api::NewHandle(T, I->object_store()->sticky_error()); | 1547 Dart_Handle error = Api::NewHandle(T, I->object_store()->sticky_error()); |
| 1544 I->object_store()->clear_sticky_error(); | 1548 I->object_store()->clear_sticky_error(); |
| 1545 return error; | 1549 return error; |
| 1546 } | 1550 } |
| 1547 return Api::Success(); | 1551 return Api::Success(); |
| 1548 } | 1552 } |
| 1549 | 1553 |
| 1550 | 1554 |
| 1551 DART_EXPORT bool Dart_HandleServiceMessages() { | 1555 DART_EXPORT bool Dart_HandleServiceMessages() { |
| 1552 Thread* T = Thread::Current(); | 1556 Thread* T = Thread::Current(); |
| 1553 Isolate* I = T->isolate(); | 1557 Isolate* I = T->isolate(); |
| 1554 CHECK_API_SCOPE(T); | 1558 CHECK_API_SCOPE(T); |
| 1555 CHECK_CALLBACK_STATE(T); | 1559 CHECK_CALLBACK_STATE(T); |
| 1556 | 1560 API_TIMELINE_DURATION; |
| 1557 ASSERT(I->GetAndClearResumeRequest() == false); | 1561 ASSERT(I->GetAndClearResumeRequest() == false); |
| 1558 MessageHandler::MessageStatus status = | 1562 MessageHandler::MessageStatus status = |
| 1559 I->message_handler()->HandleOOBMessages(); | 1563 I->message_handler()->HandleOOBMessages(); |
| 1560 bool resume = I->GetAndClearResumeRequest(); | 1564 bool resume = I->GetAndClearResumeRequest(); |
| 1561 return (status != MessageHandler::kOK) || resume; | 1565 return (status != MessageHandler::kOK) || resume; |
| 1562 } | 1566 } |
| 1563 | 1567 |
| 1564 | 1568 |
| 1565 DART_EXPORT bool Dart_HasServiceMessages() { | 1569 DART_EXPORT bool Dart_HasServiceMessages() { |
| 1566 Isolate* isolate = Isolate::Current(); | 1570 Isolate* isolate = Isolate::Current(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1577 | 1581 |
| 1578 | 1582 |
| 1579 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 1583 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
| 1580 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); | 1584 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); |
| 1581 return reinterpret_cast<uint8_t*>(new_ptr); | 1585 return reinterpret_cast<uint8_t*>(new_ptr); |
| 1582 } | 1586 } |
| 1583 | 1587 |
| 1584 | 1588 |
| 1585 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) { | 1589 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) { |
| 1586 DARTSCOPE(Thread::Current()); | 1590 DARTSCOPE(Thread::Current()); |
| 1591 API_TIMELINE_DURATION; |
| 1587 NoSafepointScope no_safepoint_scope; | 1592 NoSafepointScope no_safepoint_scope; |
| 1588 if (port_id == ILLEGAL_PORT) { | 1593 if (port_id == ILLEGAL_PORT) { |
| 1589 return false; | 1594 return false; |
| 1590 } | 1595 } |
| 1591 | 1596 |
| 1592 // Smis and null can be sent without serialization. | 1597 // Smis and null can be sent without serialization. |
| 1593 RawObject* raw_obj = Api::UnwrapHandle(handle); | 1598 RawObject* raw_obj = Api::UnwrapHandle(handle); |
| 1594 if (ApiObjectConverter::CanConvert(raw_obj)) { | 1599 if (ApiObjectConverter::CanConvert(raw_obj)) { |
| 1595 return PortMap::PostMessage(new Message( | 1600 return PortMap::PostMessage(new Message( |
| 1596 port_id, raw_obj, Message::kNormalPriority)); | 1601 port_id, raw_obj, Message::kNormalPriority)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1615 port_id); | 1620 port_id); |
| 1616 } | 1621 } |
| 1617 return Api::NewHandle(T, SendPort::New(port_id)); | 1622 return Api::NewHandle(T, SendPort::New(port_id)); |
| 1618 } | 1623 } |
| 1619 | 1624 |
| 1620 | 1625 |
| 1621 DART_EXPORT Dart_Handle Dart_SendPortGetId(Dart_Handle port, | 1626 DART_EXPORT Dart_Handle Dart_SendPortGetId(Dart_Handle port, |
| 1622 Dart_Port* port_id) { | 1627 Dart_Port* port_id) { |
| 1623 DARTSCOPE(Thread::Current()); | 1628 DARTSCOPE(Thread::Current()); |
| 1624 CHECK_CALLBACK_STATE(T); | 1629 CHECK_CALLBACK_STATE(T); |
| 1630 API_TIMELINE_DURATION; |
| 1625 const SendPort& send_port = Api::UnwrapSendPortHandle(Z, port); | 1631 const SendPort& send_port = Api::UnwrapSendPortHandle(Z, port); |
| 1626 if (send_port.IsNull()) { | 1632 if (send_port.IsNull()) { |
| 1627 RETURN_TYPE_ERROR(Z, port, SendPort); | 1633 RETURN_TYPE_ERROR(Z, port, SendPort); |
| 1628 } | 1634 } |
| 1629 if (port_id == NULL) { | 1635 if (port_id == NULL) { |
| 1630 RETURN_NULL_ERROR(port_id); | 1636 RETURN_NULL_ERROR(port_id); |
| 1631 } | 1637 } |
| 1632 *port_id = send_port.Id(); | 1638 *port_id = send_port.Id(); |
| 1633 return Api::Success(); | 1639 return Api::Success(); |
| 1634 } | 1640 } |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1774 Thread* thread = Thread::Current(); | 1780 Thread* thread = Thread::Current(); |
| 1775 CHECK_ISOLATE(thread->isolate()); | 1781 CHECK_ISOLATE(thread->isolate()); |
| 1776 REUSABLE_OBJECT_HANDLESCOPE(thread); | 1782 REUSABLE_OBJECT_HANDLESCOPE(thread); |
| 1777 Object& ref = thread->ObjectHandle(); | 1783 Object& ref = thread->ObjectHandle(); |
| 1778 ref = Api::UnwrapHandle(object); | 1784 ref = Api::UnwrapHandle(object); |
| 1779 return ref.IsInstance(); | 1785 return ref.IsInstance(); |
| 1780 } | 1786 } |
| 1781 | 1787 |
| 1782 | 1788 |
| 1783 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) { | 1789 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) { |
| 1784 TRACE_API_CALL(CURRENT_FUNC); | |
| 1785 return RawObject::IsNumberClassId(Api::ClassId(object)); | 1790 return RawObject::IsNumberClassId(Api::ClassId(object)); |
| 1786 } | 1791 } |
| 1787 | 1792 |
| 1788 | 1793 |
| 1789 DART_EXPORT bool Dart_IsInteger(Dart_Handle object) { | 1794 DART_EXPORT bool Dart_IsInteger(Dart_Handle object) { |
| 1790 TRACE_API_CALL(CURRENT_FUNC); | |
| 1791 return RawObject::IsIntegerClassId(Api::ClassId(object)); | 1795 return RawObject::IsIntegerClassId(Api::ClassId(object)); |
| 1792 } | 1796 } |
| 1793 | 1797 |
| 1794 | 1798 |
| 1795 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) { | 1799 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) { |
| 1796 TRACE_API_CALL(CURRENT_FUNC); | |
| 1797 return Api::ClassId(object) == kDoubleCid; | 1800 return Api::ClassId(object) == kDoubleCid; |
| 1798 } | 1801 } |
| 1799 | 1802 |
| 1800 | 1803 |
| 1801 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object) { | 1804 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object) { |
| 1802 TRACE_API_CALL(CURRENT_FUNC); | |
| 1803 return Api::ClassId(object) == kBoolCid; | 1805 return Api::ClassId(object) == kBoolCid; |
| 1804 } | 1806 } |
| 1805 | 1807 |
| 1806 | 1808 |
| 1807 DART_EXPORT bool Dart_IsString(Dart_Handle object) { | 1809 DART_EXPORT bool Dart_IsString(Dart_Handle object) { |
| 1808 TRACE_API_CALL(CURRENT_FUNC); | |
| 1809 return RawObject::IsStringClassId(Api::ClassId(object)); | 1810 return RawObject::IsStringClassId(Api::ClassId(object)); |
| 1810 } | 1811 } |
| 1811 | 1812 |
| 1812 | 1813 |
| 1813 DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object) { | 1814 DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object) { |
| 1814 TRACE_API_CALL(CURRENT_FUNC); | |
| 1815 return RawObject::IsOneByteStringClassId(Api::ClassId(object)); | 1815 return RawObject::IsOneByteStringClassId(Api::ClassId(object)); |
| 1816 } | 1816 } |
| 1817 | 1817 |
| 1818 | 1818 |
| 1819 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object) { | 1819 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object) { |
| 1820 TRACE_API_CALL(CURRENT_FUNC); | |
| 1821 return RawObject::IsExternalStringClassId(Api::ClassId(object)); | 1820 return RawObject::IsExternalStringClassId(Api::ClassId(object)); |
| 1822 } | 1821 } |
| 1823 | 1822 |
| 1824 | 1823 |
| 1825 DART_EXPORT bool Dart_IsList(Dart_Handle object) { | 1824 DART_EXPORT bool Dart_IsList(Dart_Handle object) { |
| 1826 if (RawObject::IsBuiltinListClassId(Api::ClassId(object))) { | 1825 if (RawObject::IsBuiltinListClassId(Api::ClassId(object))) { |
| 1827 TRACE_API_CALL(CURRENT_FUNC); | |
| 1828 return true; | 1826 return true; |
| 1829 } | 1827 } |
| 1830 | 1828 |
| 1831 DARTSCOPE(Thread::Current()); | 1829 DARTSCOPE(Thread::Current()); |
| 1832 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object)); | 1830 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object)); |
| 1833 return GetListInstance(Z, obj) != Instance::null(); | 1831 return GetListInstance(Z, obj) != Instance::null(); |
| 1834 } | 1832 } |
| 1835 | 1833 |
| 1836 | 1834 |
| 1837 DART_EXPORT bool Dart_IsMap(Dart_Handle object) { | 1835 DART_EXPORT bool Dart_IsMap(Dart_Handle object) { |
| 1838 DARTSCOPE(Thread::Current()); | 1836 DARTSCOPE(Thread::Current()); |
| 1839 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object)); | 1837 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object)); |
| 1840 return GetMapInstance(Z, obj) != Instance::null(); | 1838 return GetMapInstance(Z, obj) != Instance::null(); |
| 1841 } | 1839 } |
| 1842 | 1840 |
| 1843 | 1841 |
| 1844 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { | 1842 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { |
| 1845 TRACE_API_CALL(CURRENT_FUNC); | |
| 1846 return Api::ClassId(object) == kLibraryCid; | 1843 return Api::ClassId(object) == kLibraryCid; |
| 1847 } | 1844 } |
| 1848 | 1845 |
| 1849 | 1846 |
| 1850 DART_EXPORT bool Dart_IsType(Dart_Handle handle) { | 1847 DART_EXPORT bool Dart_IsType(Dart_Handle handle) { |
| 1851 TRACE_API_CALL(CURRENT_FUNC); | |
| 1852 return Api::ClassId(handle) == kTypeCid; | 1848 return Api::ClassId(handle) == kTypeCid; |
| 1853 } | 1849 } |
| 1854 | 1850 |
| 1855 | 1851 |
| 1856 DART_EXPORT bool Dart_IsFunction(Dart_Handle handle) { | 1852 DART_EXPORT bool Dart_IsFunction(Dart_Handle handle) { |
| 1857 TRACE_API_CALL(CURRENT_FUNC); | |
| 1858 return Api::ClassId(handle) == kFunctionCid; | 1853 return Api::ClassId(handle) == kFunctionCid; |
| 1859 } | 1854 } |
| 1860 | 1855 |
| 1861 | 1856 |
| 1862 DART_EXPORT bool Dart_IsVariable(Dart_Handle handle) { | 1857 DART_EXPORT bool Dart_IsVariable(Dart_Handle handle) { |
| 1863 TRACE_API_CALL(CURRENT_FUNC); | |
| 1864 return Api::ClassId(handle) == kFieldCid; | 1858 return Api::ClassId(handle) == kFieldCid; |
| 1865 } | 1859 } |
| 1866 | 1860 |
| 1867 | 1861 |
| 1868 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) { | 1862 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) { |
| 1869 TRACE_API_CALL(CURRENT_FUNC); | |
| 1870 return Api::ClassId(handle) == kTypeParameterCid; | 1863 return Api::ClassId(handle) == kTypeParameterCid; |
| 1871 } | 1864 } |
| 1872 | 1865 |
| 1873 | 1866 |
| 1874 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { | 1867 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { |
| 1875 // We can't use a fast class index check here because there are many | 1868 // We can't use a fast class index check here because there are many |
| 1876 // different signature classes for closures. | 1869 // different signature classes for closures. |
| 1877 Thread* thread = Thread::Current(); | 1870 Thread* thread = Thread::Current(); |
| 1878 CHECK_ISOLATE(thread->isolate()); | 1871 CHECK_ISOLATE(thread->isolate()); |
| 1879 ReusableObjectHandleScope reused_obj_handle(thread); | 1872 ReusableObjectHandleScope reused_obj_handle(thread); |
| 1880 const Instance& closure_obj = | 1873 const Instance& closure_obj = |
| 1881 Api::UnwrapInstanceHandle(reused_obj_handle, object); | 1874 Api::UnwrapInstanceHandle(reused_obj_handle, object); |
| 1882 return (!closure_obj.IsNull() && closure_obj.IsClosure()); | 1875 return (!closure_obj.IsNull() && closure_obj.IsClosure()); |
| 1883 } | 1876 } |
| 1884 | 1877 |
| 1885 | 1878 |
| 1886 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) { | 1879 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) { |
| 1887 TRACE_API_CALL(CURRENT_FUNC); | |
| 1888 intptr_t cid = Api::ClassId(handle); | 1880 intptr_t cid = Api::ClassId(handle); |
| 1889 return RawObject::IsTypedDataClassId(cid) || | 1881 return RawObject::IsTypedDataClassId(cid) || |
| 1890 RawObject::IsExternalTypedDataClassId(cid) || | 1882 RawObject::IsExternalTypedDataClassId(cid) || |
| 1891 RawObject::IsTypedDataViewClassId(cid); | 1883 RawObject::IsTypedDataViewClassId(cid); |
| 1892 } | 1884 } |
| 1893 | 1885 |
| 1894 | 1886 |
| 1895 DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) { | 1887 DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) { |
| 1896 TRACE_API_CALL(CURRENT_FUNC); | |
| 1897 return Api::ClassId(handle) == kByteBufferCid; | 1888 return Api::ClassId(handle) == kByteBufferCid; |
| 1898 } | 1889 } |
| 1899 | 1890 |
| 1900 | 1891 |
| 1901 DART_EXPORT bool Dart_IsFuture(Dart_Handle handle) { | 1892 DART_EXPORT bool Dart_IsFuture(Dart_Handle handle) { |
| 1902 TRACE_API_CALL(CURRENT_FUNC); | 1893 API_TIMELINE_DURATION; |
| 1903 DARTSCOPE(Thread::Current()); | 1894 DARTSCOPE(Thread::Current()); |
| 1904 Isolate* I = T->isolate(); | 1895 Isolate* I = T->isolate(); |
| 1905 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); | 1896 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(handle)); |
| 1906 if (obj.IsInstance()) { | 1897 if (obj.IsInstance()) { |
| 1907 const Class& future_class = | 1898 const Class& future_class = |
| 1908 Class::Handle(I->object_store()->future_class()); | 1899 Class::Handle(I->object_store()->future_class()); |
| 1909 ASSERT(!future_class.IsNull()); | 1900 ASSERT(!future_class.IsNull()); |
| 1910 const Class& obj_class = Class::Handle(Z, obj.clazz()); | 1901 const Class& obj_class = Class::Handle(Z, obj.clazz()); |
| 1911 Error& malformed_type_error = Error::Handle(Z); | 1902 Error& malformed_type_error = Error::Handle(Z); |
| 1912 bool is_future = obj_class.IsSubtypeOf(Object::null_type_arguments(), | 1903 bool is_future = obj_class.IsSubtypeOf(Object::null_type_arguments(), |
| 1913 future_class, | 1904 future_class, |
| 1914 Object::null_type_arguments(), | 1905 Object::null_type_arguments(), |
| 1915 &malformed_type_error); | 1906 &malformed_type_error); |
| 1916 ASSERT(malformed_type_error.IsNull()); // Type is a raw Future. | 1907 ASSERT(malformed_type_error.IsNull()); // Type is a raw Future. |
| 1917 return is_future; | 1908 return is_future; |
| 1918 } | 1909 } |
| 1919 return false; | 1910 return false; |
| 1920 } | 1911 } |
| 1921 | 1912 |
| 1922 | 1913 |
| 1923 // --- Instances ---- | 1914 // --- Instances ---- |
| 1924 | 1915 |
| 1925 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) { | 1916 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) { |
| 1917 API_TIMELINE_DURATION; |
| 1926 DARTSCOPE(Thread::Current()); | 1918 DARTSCOPE(Thread::Current()); |
| 1927 Isolate* I = T->isolate(); | 1919 Isolate* I = T->isolate(); |
| 1928 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(instance)); | 1920 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(instance)); |
| 1929 if (obj.IsNull()) { | 1921 if (obj.IsNull()) { |
| 1930 return Api::NewHandle(T, I->object_store()->null_type()); | 1922 return Api::NewHandle(T, I->object_store()->null_type()); |
| 1931 } | 1923 } |
| 1932 if (!obj.IsInstance()) { | 1924 if (!obj.IsInstance()) { |
| 1933 RETURN_TYPE_ERROR(Z, instance, Instance); | 1925 RETURN_TYPE_ERROR(Z, instance, Instance); |
| 1934 } | 1926 } |
| 1935 const Type& type = Type::Handle(Instance::Cast(obj).GetType()); | 1927 const Type& type = Type::Handle(Instance::Cast(obj).GetType()); |
| 1936 return Api::NewHandle(T, type.Canonicalize()); | 1928 return Api::NewHandle(T, type.Canonicalize()); |
| 1937 } | 1929 } |
| 1938 | 1930 |
| 1939 | 1931 |
| 1940 // --- Numbers, Integers and Doubles ---- | 1932 // --- Numbers, Integers and Doubles ---- |
| 1941 | 1933 |
| 1942 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, | 1934 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, |
| 1943 bool* fits) { | 1935 bool* fits) { |
| 1936 API_TIMELINE_DURATION; |
| 1944 // Fast path for Smis and Mints. | 1937 // Fast path for Smis and Mints. |
| 1945 Thread* thread = Thread::Current(); | 1938 Thread* thread = Thread::Current(); |
| 1946 Isolate* isolate = thread->isolate(); | 1939 Isolate* isolate = thread->isolate(); |
| 1947 CHECK_ISOLATE(isolate); | 1940 CHECK_ISOLATE(isolate); |
| 1948 intptr_t class_id = Api::ClassId(integer); | 1941 intptr_t class_id = Api::ClassId(integer); |
| 1949 if (class_id == kSmiCid || class_id == kMintCid) { | 1942 if (class_id == kSmiCid || class_id == kMintCid) { |
| 1950 *fits = true; | 1943 *fits = true; |
| 1951 return Api::Success(); | 1944 return Api::Success(); |
| 1952 } | 1945 } |
| 1953 // Slow path for Mints and Bigints. | 1946 // Slow path for Mints and Bigints. |
| 1954 DARTSCOPE(thread); | 1947 DARTSCOPE(thread); |
| 1955 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); | 1948 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
| 1956 if (int_obj.IsNull()) { | 1949 if (int_obj.IsNull()) { |
| 1957 RETURN_TYPE_ERROR(Z, integer, Integer); | 1950 RETURN_TYPE_ERROR(Z, integer, Integer); |
| 1958 } | 1951 } |
| 1959 ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64()); | 1952 ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64()); |
| 1960 *fits = false; | 1953 *fits = false; |
| 1961 return Api::Success(); | 1954 return Api::Success(); |
| 1962 } | 1955 } |
| 1963 | 1956 |
| 1964 | 1957 |
| 1965 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, | 1958 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, |
| 1966 bool* fits) { | 1959 bool* fits) { |
| 1967 // Fast path for Smis. | 1960 // Fast path for Smis. |
| 1968 Thread* thread = Thread::Current(); | 1961 Thread* thread = Thread::Current(); |
| 1969 Isolate* isolate = thread->isolate(); | 1962 Isolate* isolate = thread->isolate(); |
| 1970 CHECK_ISOLATE(isolate); | 1963 CHECK_ISOLATE(isolate); |
| 1964 API_TIMELINE_DURATION; |
| 1971 if (Api::IsSmi(integer)) { | 1965 if (Api::IsSmi(integer)) { |
| 1972 *fits = (Api::SmiValue(integer) >= 0); | 1966 *fits = (Api::SmiValue(integer) >= 0); |
| 1973 return Api::Success(); | 1967 return Api::Success(); |
| 1974 } | 1968 } |
| 1975 // Slow path for Mints and Bigints. | 1969 // Slow path for Mints and Bigints. |
| 1976 DARTSCOPE(thread); | 1970 DARTSCOPE(thread); |
| 1977 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); | 1971 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
| 1978 if (int_obj.IsNull()) { | 1972 if (int_obj.IsNull()) { |
| 1979 RETURN_TYPE_ERROR(Z, integer, Integer); | 1973 RETURN_TYPE_ERROR(Z, integer, Integer); |
| 1980 } | 1974 } |
| 1981 ASSERT(!int_obj.IsSmi()); | 1975 ASSERT(!int_obj.IsSmi()); |
| 1982 if (int_obj.IsMint()) { | 1976 if (int_obj.IsMint()) { |
| 1983 *fits = !int_obj.IsNegative(); | 1977 *fits = !int_obj.IsNegative(); |
| 1984 } else { | 1978 } else { |
| 1985 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); | 1979 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); |
| 1986 } | 1980 } |
| 1987 return Api::Success(); | 1981 return Api::Success(); |
| 1988 } | 1982 } |
| 1989 | 1983 |
| 1990 | 1984 |
| 1991 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { | 1985 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { |
| 1992 // Fast path for Smis. | 1986 // Fast path for Smis. |
| 1993 Thread* thread = Thread::Current(); | 1987 Thread* thread = Thread::Current(); |
| 1994 Isolate* isolate = thread->isolate(); | 1988 Isolate* isolate = thread->isolate(); |
| 1995 CHECK_ISOLATE(isolate); | 1989 CHECK_ISOLATE(isolate); |
| 1990 API_TIMELINE_DURATION; |
| 1996 if (Smi::IsValid(value)) { | 1991 if (Smi::IsValid(value)) { |
| 1997 NOHANDLESCOPE(thread); | 1992 NOHANDLESCOPE(thread); |
| 1998 return Api::NewHandle(thread, Smi::New(static_cast<intptr_t>(value))); | 1993 return Api::NewHandle(thread, Smi::New(static_cast<intptr_t>(value))); |
| 1999 } | 1994 } |
| 2000 // Slow path for Mints and Bigints. | 1995 // Slow path for Mints and Bigints. |
| 2001 DARTSCOPE(thread); | 1996 DARTSCOPE(thread); |
| 2002 CHECK_CALLBACK_STATE(thread); | 1997 CHECK_CALLBACK_STATE(thread); |
| 2003 return Api::NewHandle(thread, Integer::New(value)); | 1998 return Api::NewHandle(thread, Integer::New(value)); |
| 2004 } | 1999 } |
| 2005 | 2000 |
| 2006 | 2001 |
| 2007 DART_EXPORT Dart_Handle Dart_NewIntegerFromUint64(uint64_t value) { | 2002 DART_EXPORT Dart_Handle Dart_NewIntegerFromUint64(uint64_t value) { |
| 2008 DARTSCOPE(Thread::Current()); | 2003 DARTSCOPE(Thread::Current()); |
| 2009 CHECK_CALLBACK_STATE(T); | 2004 CHECK_CALLBACK_STATE(T); |
| 2005 API_TIMELINE_DURATION; |
| 2010 return Api::NewHandle(T, Integer::NewFromUint64(value)); | 2006 return Api::NewHandle(T, Integer::NewFromUint64(value)); |
| 2011 } | 2007 } |
| 2012 | 2008 |
| 2013 | 2009 |
| 2014 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { | 2010 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { |
| 2015 DARTSCOPE(Thread::Current()); | 2011 DARTSCOPE(Thread::Current()); |
| 2016 CHECK_CALLBACK_STATE(T); | 2012 CHECK_CALLBACK_STATE(T); |
| 2013 API_TIMELINE_DURATION; |
| 2017 const String& str_obj = String::Handle(Z, String::New(str)); | 2014 const String& str_obj = String::Handle(Z, String::New(str)); |
| 2018 return Api::NewHandle(T, Integer::New(str_obj)); | 2015 return Api::NewHandle(T, Integer::New(str_obj)); |
| 2019 } | 2016 } |
| 2020 | 2017 |
| 2021 | 2018 |
| 2022 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, | 2019 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, |
| 2023 int64_t* value) { | 2020 int64_t* value) { |
| 2024 // Fast path for Smis. | 2021 // Fast path for Smis. |
| 2025 Thread* thread = Thread::Current(); | 2022 Thread* thread = Thread::Current(); |
| 2026 Isolate* isolate = thread->isolate(); | 2023 Isolate* isolate = thread->isolate(); |
| 2027 CHECK_ISOLATE(isolate); | 2024 CHECK_ISOLATE(isolate); |
| 2025 API_TIMELINE_DURATION; |
| 2028 if (Api::IsSmi(integer)) { | 2026 if (Api::IsSmi(integer)) { |
| 2029 *value = Api::SmiValue(integer); | 2027 *value = Api::SmiValue(integer); |
| 2030 return Api::Success(); | 2028 return Api::Success(); |
| 2031 } | 2029 } |
| 2032 // Slow path for Mints and Bigints. | 2030 // Slow path for Mints and Bigints. |
| 2033 DARTSCOPE(thread); | 2031 DARTSCOPE(thread); |
| 2034 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); | 2032 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
| 2035 if (int_obj.IsNull()) { | 2033 if (int_obj.IsNull()) { |
| 2036 RETURN_TYPE_ERROR(Z, integer, Integer); | 2034 RETURN_TYPE_ERROR(Z, integer, Integer); |
| 2037 } | 2035 } |
| 2038 ASSERT(!int_obj.IsSmi()); | 2036 ASSERT(!int_obj.IsSmi()); |
| 2039 if (int_obj.IsMint()) { | 2037 if (int_obj.IsMint()) { |
| 2040 *value = int_obj.AsInt64Value(); | 2038 *value = int_obj.AsInt64Value(); |
| 2041 return Api::Success(); | 2039 return Api::Success(); |
| 2042 } else { | 2040 } else { |
| 2043 const Bigint& bigint = Bigint::Cast(int_obj); | 2041 const Bigint& bigint = Bigint::Cast(int_obj); |
| 2044 if (bigint.FitsIntoInt64()) { | 2042 if (bigint.FitsIntoInt64()) { |
| 2045 *value = bigint.AsInt64Value(); | 2043 *value = bigint.AsInt64Value(); |
| 2046 return Api::Success(); | 2044 return Api::Success(); |
| 2047 } | 2045 } |
| 2048 } | 2046 } |
| 2049 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", | 2047 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", |
| 2050 CURRENT_FUNC, int_obj.ToCString()); | 2048 CURRENT_FUNC, int_obj.ToCString()); |
| 2051 } | 2049 } |
| 2052 | 2050 |
| 2053 | 2051 |
| 2054 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, | 2052 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, |
| 2055 uint64_t* value) { | 2053 uint64_t* value) { |
| 2054 API_TIMELINE_DURATION; |
| 2056 // Fast path for Smis. | 2055 // Fast path for Smis. |
| 2057 Thread* thread = Thread::Current(); | 2056 Thread* thread = Thread::Current(); |
| 2058 Isolate* isolate = thread->isolate(); | 2057 Isolate* isolate = thread->isolate(); |
| 2059 CHECK_ISOLATE(isolate); | 2058 CHECK_ISOLATE(isolate); |
| 2060 if (Api::IsSmi(integer)) { | 2059 if (Api::IsSmi(integer)) { |
| 2061 intptr_t smi_value = Api::SmiValue(integer); | 2060 intptr_t smi_value = Api::SmiValue(integer); |
| 2062 if (smi_value >= 0) { | 2061 if (smi_value >= 0) { |
| 2063 *value = smi_value; | 2062 *value = smi_value; |
| 2064 return Api::Success(); | 2063 return Api::Success(); |
| 2065 } | 2064 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2087 } | 2086 } |
| 2088 | 2087 |
| 2089 | 2088 |
| 2090 static uword BigintAllocate(intptr_t size) { | 2089 static uword BigintAllocate(intptr_t size) { |
| 2091 return Api::TopScope(Thread::Current())->zone()->AllocUnsafe(size); | 2090 return Api::TopScope(Thread::Current())->zone()->AllocUnsafe(size); |
| 2092 } | 2091 } |
| 2093 | 2092 |
| 2094 | 2093 |
| 2095 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, | 2094 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, |
| 2096 const char** value) { | 2095 const char** value) { |
| 2096 API_TIMELINE_DURATION; |
| 2097 DARTSCOPE(Thread::Current()); | 2097 DARTSCOPE(Thread::Current()); |
| 2098 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); | 2098 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
| 2099 if (int_obj.IsNull()) { | 2099 if (int_obj.IsNull()) { |
| 2100 RETURN_TYPE_ERROR(Z, integer, Integer); | 2100 RETURN_TYPE_ERROR(Z, integer, Integer); |
| 2101 } | 2101 } |
| 2102 if (int_obj.IsSmi() || int_obj.IsMint()) { | 2102 if (int_obj.IsSmi() || int_obj.IsMint()) { |
| 2103 const Bigint& bigint = Bigint::Handle(Z, | 2103 const Bigint& bigint = Bigint::Handle(Z, |
| 2104 Bigint::NewFromInt64(int_obj.AsInt64Value())); | 2104 Bigint::NewFromInt64(int_obj.AsInt64Value())); |
| 2105 *value = bigint.ToHexCString(BigintAllocate); | 2105 *value = bigint.ToHexCString(BigintAllocate); |
| 2106 } else { | 2106 } else { |
| 2107 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); | 2107 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); |
| 2108 } | 2108 } |
| 2109 return Api::Success(); | 2109 return Api::Success(); |
| 2110 } | 2110 } |
| 2111 | 2111 |
| 2112 | 2112 |
| 2113 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { | 2113 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { |
| 2114 API_TIMELINE_DURATION; |
| 2114 DARTSCOPE(Thread::Current()); | 2115 DARTSCOPE(Thread::Current()); |
| 2115 CHECK_CALLBACK_STATE(T); | 2116 CHECK_CALLBACK_STATE(T); |
| 2116 return Api::NewHandle(T, Double::New(value)); | 2117 return Api::NewHandle(T, Double::New(value)); |
| 2117 } | 2118 } |
| 2118 | 2119 |
| 2119 | 2120 |
| 2120 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, | 2121 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, |
| 2121 double* value) { | 2122 double* value) { |
| 2123 API_TIMELINE_DURATION; |
| 2122 DARTSCOPE(Thread::Current()); | 2124 DARTSCOPE(Thread::Current()); |
| 2123 const Double& obj = Api::UnwrapDoubleHandle(Z, double_obj); | 2125 const Double& obj = Api::UnwrapDoubleHandle(Z, double_obj); |
| 2124 if (obj.IsNull()) { | 2126 if (obj.IsNull()) { |
| 2125 RETURN_TYPE_ERROR(Z, double_obj, Double); | 2127 RETURN_TYPE_ERROR(Z, double_obj, Double); |
| 2126 } | 2128 } |
| 2127 *value = obj.value(); | 2129 *value = obj.value(); |
| 2128 return Api::Success(); | 2130 return Api::Success(); |
| 2129 } | 2131 } |
| 2130 | 2132 |
| 2131 | 2133 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2172 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); | 2174 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); |
| 2173 if (str_obj.IsNull()) { | 2175 if (str_obj.IsNull()) { |
| 2174 RETURN_TYPE_ERROR(thread->zone(), str, String); | 2176 RETURN_TYPE_ERROR(thread->zone(), str, String); |
| 2175 } | 2177 } |
| 2176 *len = str_obj.Length(); | 2178 *len = str_obj.Length(); |
| 2177 return Api::Success(); | 2179 return Api::Success(); |
| 2178 } | 2180 } |
| 2179 | 2181 |
| 2180 | 2182 |
| 2181 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { | 2183 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { |
| 2184 API_TIMELINE_DURATION; |
| 2182 DARTSCOPE(Thread::Current()); | 2185 DARTSCOPE(Thread::Current()); |
| 2183 if (str == NULL) { | 2186 if (str == NULL) { |
| 2184 RETURN_NULL_ERROR(str); | 2187 RETURN_NULL_ERROR(str); |
| 2185 } | 2188 } |
| 2186 CHECK_CALLBACK_STATE(T); | 2189 CHECK_CALLBACK_STATE(T); |
| 2187 return Api::NewHandle(T, String::New(str)); | 2190 return Api::NewHandle(T, String::New(str)); |
| 2188 } | 2191 } |
| 2189 | 2192 |
| 2190 | 2193 |
| 2191 DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array, | 2194 DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t* utf8_array, |
| 2192 intptr_t length) { | 2195 intptr_t length) { |
| 2196 API_TIMELINE_DURATION; |
| 2193 DARTSCOPE(Thread::Current()); | 2197 DARTSCOPE(Thread::Current()); |
| 2194 if (utf8_array == NULL && length != 0) { | 2198 if (utf8_array == NULL && length != 0) { |
| 2195 RETURN_NULL_ERROR(utf8_array); | 2199 RETURN_NULL_ERROR(utf8_array); |
| 2196 } | 2200 } |
| 2197 CHECK_LENGTH(length, String::kMaxElements); | 2201 CHECK_LENGTH(length, String::kMaxElements); |
| 2198 if (!Utf8::IsValid(utf8_array, length)) { | 2202 if (!Utf8::IsValid(utf8_array, length)) { |
| 2199 return Api::NewError("%s expects argument 'str' to be valid UTF-8.", | 2203 return Api::NewError("%s expects argument 'str' to be valid UTF-8.", |
| 2200 CURRENT_FUNC); | 2204 CURRENT_FUNC); |
| 2201 } | 2205 } |
| 2202 CHECK_CALLBACK_STATE(T); | 2206 CHECK_CALLBACK_STATE(T); |
| 2203 return Api::NewHandle(T, String::FromUTF8(utf8_array, length)); | 2207 return Api::NewHandle(T, String::FromUTF8(utf8_array, length)); |
| 2204 } | 2208 } |
| 2205 | 2209 |
| 2206 | 2210 |
| 2207 DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array, | 2211 DART_EXPORT Dart_Handle Dart_NewStringFromUTF16(const uint16_t* utf16_array, |
| 2208 intptr_t length) { | 2212 intptr_t length) { |
| 2209 DARTSCOPE(Thread::Current()); | 2213 DARTSCOPE(Thread::Current()); |
| 2210 if (utf16_array == NULL && length != 0) { | 2214 if (utf16_array == NULL && length != 0) { |
| 2211 RETURN_NULL_ERROR(utf16_array); | 2215 RETURN_NULL_ERROR(utf16_array); |
| 2212 } | 2216 } |
| 2213 CHECK_LENGTH(length, String::kMaxElements); | 2217 CHECK_LENGTH(length, String::kMaxElements); |
| 2214 CHECK_CALLBACK_STATE(T); | 2218 CHECK_CALLBACK_STATE(T); |
| 2215 return Api::NewHandle(T, String::FromUTF16(utf16_array, length)); | 2219 return Api::NewHandle(T, String::FromUTF16(utf16_array, length)); |
| 2216 } | 2220 } |
| 2217 | 2221 |
| 2218 | 2222 |
| 2219 DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array, | 2223 DART_EXPORT Dart_Handle Dart_NewStringFromUTF32(const int32_t* utf32_array, |
| 2220 intptr_t length) { | 2224 intptr_t length) { |
| 2225 API_TIMELINE_DURATION; |
| 2221 DARTSCOPE(Thread::Current()); | 2226 DARTSCOPE(Thread::Current()); |
| 2222 if (utf32_array == NULL && length != 0) { | 2227 if (utf32_array == NULL && length != 0) { |
| 2223 RETURN_NULL_ERROR(utf32_array); | 2228 RETURN_NULL_ERROR(utf32_array); |
| 2224 } | 2229 } |
| 2225 CHECK_LENGTH(length, String::kMaxElements); | 2230 CHECK_LENGTH(length, String::kMaxElements); |
| 2226 CHECK_CALLBACK_STATE(T); | 2231 CHECK_CALLBACK_STATE(T); |
| 2227 return Api::NewHandle(T, String::FromUTF32(utf32_array, length)); | 2232 return Api::NewHandle(T, String::FromUTF32(utf32_array, length)); |
| 2228 } | 2233 } |
| 2229 | 2234 |
| 2230 | 2235 |
| 2231 DART_EXPORT Dart_Handle Dart_NewExternalLatin1String( | 2236 DART_EXPORT Dart_Handle Dart_NewExternalLatin1String( |
| 2232 const uint8_t* latin1_array, | 2237 const uint8_t* latin1_array, |
| 2233 intptr_t length, | 2238 intptr_t length, |
| 2234 void* peer, | 2239 void* peer, |
| 2235 Dart_PeerFinalizer cback) { | 2240 Dart_PeerFinalizer cback) { |
| 2241 API_TIMELINE_DURATION; |
| 2236 DARTSCOPE(Thread::Current()); | 2242 DARTSCOPE(Thread::Current()); |
| 2237 if (latin1_array == NULL && length != 0) { | 2243 if (latin1_array == NULL && length != 0) { |
| 2238 RETURN_NULL_ERROR(latin1_array); | 2244 RETURN_NULL_ERROR(latin1_array); |
| 2239 } | 2245 } |
| 2240 CHECK_LENGTH(length, String::kMaxElements); | 2246 CHECK_LENGTH(length, String::kMaxElements); |
| 2241 CHECK_CALLBACK_STATE(T); | 2247 CHECK_CALLBACK_STATE(T); |
| 2242 return Api::NewHandle(T, String::NewExternal(latin1_array, | 2248 return Api::NewHandle(T, String::NewExternal(latin1_array, |
| 2243 length, | 2249 length, |
| 2244 peer, | 2250 peer, |
| 2245 cback, | 2251 cback, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2261 return Api::NewHandle(T, String::NewExternal(utf16_array, | 2267 return Api::NewHandle(T, String::NewExternal(utf16_array, |
| 2262 length, | 2268 length, |
| 2263 peer, | 2269 peer, |
| 2264 cback, | 2270 cback, |
| 2265 SpaceForExternal(T, bytes))); | 2271 SpaceForExternal(T, bytes))); |
| 2266 } | 2272 } |
| 2267 | 2273 |
| 2268 | 2274 |
| 2269 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, | 2275 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, |
| 2270 const char** cstr) { | 2276 const char** cstr) { |
| 2277 API_TIMELINE_DURATION; |
| 2271 DARTSCOPE(Thread::Current()); | 2278 DARTSCOPE(Thread::Current()); |
| 2272 if (cstr == NULL) { | 2279 if (cstr == NULL) { |
| 2273 RETURN_NULL_ERROR(cstr); | 2280 RETURN_NULL_ERROR(cstr); |
| 2274 } | 2281 } |
| 2275 const String& str_obj = Api::UnwrapStringHandle(Z, object); | 2282 const String& str_obj = Api::UnwrapStringHandle(Z, object); |
| 2276 if (str_obj.IsNull()) { | 2283 if (str_obj.IsNull()) { |
| 2277 RETURN_TYPE_ERROR(Z, object, String); | 2284 RETURN_TYPE_ERROR(Z, object, String); |
| 2278 } | 2285 } |
| 2279 intptr_t string_length = Utf8::Length(str_obj); | 2286 intptr_t string_length = Utf8::Length(str_obj); |
| 2280 char* res = Api::TopScope(T)->zone()->Alloc<char>(string_length + 1); | 2287 char* res = Api::TopScope(T)->zone()->Alloc<char>(string_length + 1); |
| 2281 if (res == NULL) { | 2288 if (res == NULL) { |
| 2282 return Api::NewError("Unable to allocate memory"); | 2289 return Api::NewError("Unable to allocate memory"); |
| 2283 } | 2290 } |
| 2284 const char* string_value = str_obj.ToCString(); | 2291 const char* string_value = str_obj.ToCString(); |
| 2285 memmove(res, string_value, string_length + 1); | 2292 memmove(res, string_value, string_length + 1); |
| 2286 ASSERT(res[string_length] == '\0'); | 2293 ASSERT(res[string_length] == '\0'); |
| 2287 *cstr = res; | 2294 *cstr = res; |
| 2288 return Api::Success(); | 2295 return Api::Success(); |
| 2289 } | 2296 } |
| 2290 | 2297 |
| 2291 | 2298 |
| 2292 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str, | 2299 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str, |
| 2293 uint8_t** utf8_array, | 2300 uint8_t** utf8_array, |
| 2294 intptr_t* length) { | 2301 intptr_t* length) { |
| 2302 API_TIMELINE_DURATION; |
| 2295 DARTSCOPE(Thread::Current()); | 2303 DARTSCOPE(Thread::Current()); |
| 2296 if (utf8_array == NULL) { | 2304 if (utf8_array == NULL) { |
| 2297 RETURN_NULL_ERROR(utf8_array); | 2305 RETURN_NULL_ERROR(utf8_array); |
| 2298 } | 2306 } |
| 2299 if (length == NULL) { | 2307 if (length == NULL) { |
| 2300 RETURN_NULL_ERROR(length); | 2308 RETURN_NULL_ERROR(length); |
| 2301 } | 2309 } |
| 2302 const String& str_obj = Api::UnwrapStringHandle(Z, str); | 2310 const String& str_obj = Api::UnwrapStringHandle(Z, str); |
| 2303 if (str_obj.IsNull()) { | 2311 if (str_obj.IsNull()) { |
| 2304 RETURN_TYPE_ERROR(Z, str, String); | 2312 RETURN_TYPE_ERROR(Z, str, String); |
| 2305 } | 2313 } |
| 2306 intptr_t str_len = Utf8::Length(str_obj); | 2314 intptr_t str_len = Utf8::Length(str_obj); |
| 2307 *utf8_array = Api::TopScope(T)->zone()->Alloc<uint8_t>(str_len); | 2315 *utf8_array = Api::TopScope(T)->zone()->Alloc<uint8_t>(str_len); |
| 2308 if (*utf8_array == NULL) { | 2316 if (*utf8_array == NULL) { |
| 2309 return Api::NewError("Unable to allocate memory"); | 2317 return Api::NewError("Unable to allocate memory"); |
| 2310 } | 2318 } |
| 2311 str_obj.ToUTF8(*utf8_array, str_len); | 2319 str_obj.ToUTF8(*utf8_array, str_len); |
| 2312 *length = str_len; | 2320 *length = str_len; |
| 2313 return Api::Success(); | 2321 return Api::Success(); |
| 2314 } | 2322 } |
| 2315 | 2323 |
| 2316 | 2324 |
| 2317 DART_EXPORT Dart_Handle Dart_StringToLatin1(Dart_Handle str, | 2325 DART_EXPORT Dart_Handle Dart_StringToLatin1(Dart_Handle str, |
| 2318 uint8_t* latin1_array, | 2326 uint8_t* latin1_array, |
| 2319 intptr_t* length) { | 2327 intptr_t* length) { |
| 2328 API_TIMELINE_DURATION; |
| 2320 DARTSCOPE(Thread::Current()); | 2329 DARTSCOPE(Thread::Current()); |
| 2321 if (latin1_array == NULL) { | 2330 if (latin1_array == NULL) { |
| 2322 RETURN_NULL_ERROR(latin1_array); | 2331 RETURN_NULL_ERROR(latin1_array); |
| 2323 } | 2332 } |
| 2324 if (length == NULL) { | 2333 if (length == NULL) { |
| 2325 RETURN_NULL_ERROR(length); | 2334 RETURN_NULL_ERROR(length); |
| 2326 } | 2335 } |
| 2327 const String& str_obj = Api::UnwrapStringHandle(Z, str); | 2336 const String& str_obj = Api::UnwrapStringHandle(Z, str); |
| 2328 if (str_obj.IsNull() || !str_obj.IsOneByteString()) { | 2337 if (str_obj.IsNull() || !str_obj.IsOneByteString()) { |
| 2329 RETURN_TYPE_ERROR(Z, str, String); | 2338 RETURN_TYPE_ERROR(Z, str, String); |
| 2330 } | 2339 } |
| 2331 intptr_t str_len = str_obj.Length(); | 2340 intptr_t str_len = str_obj.Length(); |
| 2332 intptr_t copy_len = (str_len > *length) ? *length : str_len; | 2341 intptr_t copy_len = (str_len > *length) ? *length : str_len; |
| 2333 | 2342 |
| 2334 // We have already asserted that the string object is a Latin-1 string | 2343 // We have already asserted that the string object is a Latin-1 string |
| 2335 // so we can copy the characters over using a simple loop. | 2344 // so we can copy the characters over using a simple loop. |
| 2336 for (intptr_t i = 0; i < copy_len; i++) { | 2345 for (intptr_t i = 0; i < copy_len; i++) { |
| 2337 latin1_array[i] = str_obj.CharAt(i); | 2346 latin1_array[i] = str_obj.CharAt(i); |
| 2338 } | 2347 } |
| 2339 *length = copy_len; | 2348 *length = copy_len; |
| 2340 return Api::Success(); | 2349 return Api::Success(); |
| 2341 } | 2350 } |
| 2342 | 2351 |
| 2343 | 2352 |
| 2344 DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str, | 2353 DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str, |
| 2345 uint16_t* utf16_array, | 2354 uint16_t* utf16_array, |
| 2346 intptr_t* length) { | 2355 intptr_t* length) { |
| 2356 API_TIMELINE_DURATION; |
| 2347 DARTSCOPE(Thread::Current()); | 2357 DARTSCOPE(Thread::Current()); |
| 2348 const String& str_obj = Api::UnwrapStringHandle(Z, str); | 2358 const String& str_obj = Api::UnwrapStringHandle(Z, str); |
| 2349 if (str_obj.IsNull()) { | 2359 if (str_obj.IsNull()) { |
| 2350 RETURN_TYPE_ERROR(Z, str, String); | 2360 RETURN_TYPE_ERROR(Z, str, String); |
| 2351 } | 2361 } |
| 2352 intptr_t str_len = str_obj.Length(); | 2362 intptr_t str_len = str_obj.Length(); |
| 2353 intptr_t copy_len = (str_len > *length) ? *length : str_len; | 2363 intptr_t copy_len = (str_len > *length) ? *length : str_len; |
| 2354 for (intptr_t i = 0; i < copy_len; i++) { | 2364 for (intptr_t i = 0; i < copy_len; i++) { |
| 2355 utf16_array[i] = str_obj.CharAt(i); | 2365 utf16_array[i] = str_obj.CharAt(i); |
| 2356 } | 2366 } |
| (...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3098 break; | 3108 break; |
| 3099 default: | 3109 default: |
| 3100 type = Dart_TypedData_kInvalid; | 3110 type = Dart_TypedData_kInvalid; |
| 3101 break; | 3111 break; |
| 3102 } | 3112 } |
| 3103 return type; | 3113 return type; |
| 3104 } | 3114 } |
| 3105 | 3115 |
| 3106 | 3116 |
| 3107 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) { | 3117 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) { |
| 3108 TRACE_API_CALL(CURRENT_FUNC); | 3118 API_TIMELINE_DURATION; |
| 3109 intptr_t class_id = Api::ClassId(object); | 3119 intptr_t class_id = Api::ClassId(object); |
| 3110 if (RawObject::IsTypedDataClassId(class_id) || | 3120 if (RawObject::IsTypedDataClassId(class_id) || |
| 3111 RawObject::IsTypedDataViewClassId(class_id)) { | 3121 RawObject::IsTypedDataViewClassId(class_id)) { |
| 3112 return GetType(class_id); | 3122 return GetType(class_id); |
| 3113 } | 3123 } |
| 3114 return Dart_TypedData_kInvalid; | 3124 return Dart_TypedData_kInvalid; |
| 3115 } | 3125 } |
| 3116 | 3126 |
| 3117 | 3127 |
| 3118 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData( | 3128 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData( |
| 3119 Dart_Handle object) { | 3129 Dart_Handle object) { |
| 3120 TRACE_API_CALL(CURRENT_FUNC); | 3130 API_TIMELINE_DURATION; |
| 3121 intptr_t class_id = Api::ClassId(object); | 3131 intptr_t class_id = Api::ClassId(object); |
| 3122 if (RawObject::IsExternalTypedDataClassId(class_id)) { | 3132 if (RawObject::IsExternalTypedDataClassId(class_id)) { |
| 3123 return GetType(class_id); | 3133 return GetType(class_id); |
| 3124 } | 3134 } |
| 3125 if (RawObject::IsTypedDataViewClassId(class_id)) { | 3135 if (RawObject::IsTypedDataViewClassId(class_id)) { |
| 3126 // Check if data object of the view is external. | 3136 // Check if data object of the view is external. |
| 3127 Zone* zone = Thread::Current()->zone(); | 3137 Zone* zone = Thread::Current()->zone(); |
| 3128 const Instance& view_obj = Api::UnwrapInstanceHandle(zone, object); | 3138 const Instance& view_obj = Api::UnwrapInstanceHandle(zone, object); |
| 3129 ASSERT(!view_obj.IsNull()); | 3139 ASSERT(!view_obj.IsNull()); |
| 3130 const Instance& data_obj = | 3140 const Instance& data_obj = |
| (...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3859 args->SetAt((i + extra_args), arg); | 3869 args->SetAt((i + extra_args), arg); |
| 3860 } | 3870 } |
| 3861 return Api::Success(); | 3871 return Api::Success(); |
| 3862 } | 3872 } |
| 3863 | 3873 |
| 3864 | 3874 |
| 3865 DART_EXPORT Dart_Handle Dart_InvokeConstructor(Dart_Handle object, | 3875 DART_EXPORT Dart_Handle Dart_InvokeConstructor(Dart_Handle object, |
| 3866 Dart_Handle name, | 3876 Dart_Handle name, |
| 3867 int number_of_arguments, | 3877 int number_of_arguments, |
| 3868 Dart_Handle* arguments) { | 3878 Dart_Handle* arguments) { |
| 3879 API_TIMELINE_DURATION; |
| 3869 DARTSCOPE(Thread::Current()); | 3880 DARTSCOPE(Thread::Current()); |
| 3870 CHECK_CALLBACK_STATE(T); | 3881 CHECK_CALLBACK_STATE(T); |
| 3871 | 3882 |
| 3872 if (number_of_arguments < 0) { | 3883 if (number_of_arguments < 0) { |
| 3873 return Api::NewError( | 3884 return Api::NewError( |
| 3874 "%s expects argument 'number_of_arguments' to be non-negative.", | 3885 "%s expects argument 'number_of_arguments' to be non-negative.", |
| 3875 CURRENT_FUNC); | 3886 CURRENT_FUNC); |
| 3876 } | 3887 } |
| 3877 const Instance& instance = Api::UnwrapInstanceHandle(Z, object); | 3888 const Instance& instance = Api::UnwrapInstanceHandle(Z, object); |
| 3878 if (instance.IsNull()) { | 3889 if (instance.IsNull()) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3937 return Api::NewError( | 3948 return Api::NewError( |
| 3938 "%s expects argument 'name' to be a valid constructor.", | 3949 "%s expects argument 'name' to be a valid constructor.", |
| 3939 CURRENT_FUNC); | 3950 CURRENT_FUNC); |
| 3940 } | 3951 } |
| 3941 | 3952 |
| 3942 | 3953 |
| 3943 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, | 3954 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, |
| 3944 Dart_Handle name, | 3955 Dart_Handle name, |
| 3945 int number_of_arguments, | 3956 int number_of_arguments, |
| 3946 Dart_Handle* arguments) { | 3957 Dart_Handle* arguments) { |
| 3958 API_TIMELINE_DURATION; |
| 3947 DARTSCOPE(Thread::Current()); | 3959 DARTSCOPE(Thread::Current()); |
| 3948 CHECK_CALLBACK_STATE(T); | 3960 CHECK_CALLBACK_STATE(T); |
| 3949 | 3961 |
| 3950 const String& function_name = Api::UnwrapStringHandle(Z, name); | 3962 const String& function_name = Api::UnwrapStringHandle(Z, name); |
| 3951 if (function_name.IsNull()) { | 3963 if (function_name.IsNull()) { |
| 3952 RETURN_TYPE_ERROR(Z, name, String); | 3964 RETURN_TYPE_ERROR(Z, name, String); |
| 3953 } | 3965 } |
| 3954 if (number_of_arguments < 0) { | 3966 if (number_of_arguments < 0) { |
| 3955 return Api::NewError( | 3967 return Api::NewError( |
| 3956 "%s expects argument 'number_of_arguments' to be non-negative.", | 3968 "%s expects argument 'number_of_arguments' to be non-negative.", |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4063 return Api::NewError( | 4075 return Api::NewError( |
| 4064 "%s expects argument 'target' to be an object, type, or library.", | 4076 "%s expects argument 'target' to be an object, type, or library.", |
| 4065 CURRENT_FUNC); | 4077 CURRENT_FUNC); |
| 4066 } | 4078 } |
| 4067 } | 4079 } |
| 4068 | 4080 |
| 4069 | 4081 |
| 4070 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, | 4082 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, |
| 4071 int number_of_arguments, | 4083 int number_of_arguments, |
| 4072 Dart_Handle* arguments) { | 4084 Dart_Handle* arguments) { |
| 4085 API_TIMELINE_DURATION; |
| 4073 DARTSCOPE(Thread::Current()); | 4086 DARTSCOPE(Thread::Current()); |
| 4074 CHECK_CALLBACK_STATE(T); | 4087 CHECK_CALLBACK_STATE(T); |
| 4075 const Instance& closure_obj = Api::UnwrapInstanceHandle(Z, closure); | 4088 const Instance& closure_obj = Api::UnwrapInstanceHandle(Z, closure); |
| 4076 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL)) { | 4089 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL)) { |
| 4077 RETURN_TYPE_ERROR(Z, closure, Instance); | 4090 RETURN_TYPE_ERROR(Z, closure, Instance); |
| 4078 } | 4091 } |
| 4079 if (number_of_arguments < 0) { | 4092 if (number_of_arguments < 0) { |
| 4080 return Api::NewError( | 4093 return Api::NewError( |
| 4081 "%s expects argument 'number_of_arguments' to be non-negative.", | 4094 "%s expects argument 'number_of_arguments' to be non-negative.", |
| 4082 CURRENT_FUNC); | 4095 CURRENT_FUNC); |
| 4083 } | 4096 } |
| 4084 | 4097 |
| 4085 // Set up arguments to include the closure as the first argument. | 4098 // Set up arguments to include the closure as the first argument. |
| 4086 const Array& args = Array::Handle(Z, Array::New(number_of_arguments + 1)); | 4099 const Array& args = Array::Handle(Z, Array::New(number_of_arguments + 1)); |
| 4087 Object& obj = Object::Handle(Z); | 4100 Object& obj = Object::Handle(Z); |
| 4088 args.SetAt(0, closure_obj); | 4101 args.SetAt(0, closure_obj); |
| 4089 for (int i = 0; i < number_of_arguments; i++) { | 4102 for (int i = 0; i < number_of_arguments; i++) { |
| 4090 obj = Api::UnwrapHandle(arguments[i]); | 4103 obj = Api::UnwrapHandle(arguments[i]); |
| 4091 if (!obj.IsNull() && !obj.IsInstance()) { | 4104 if (!obj.IsNull() && !obj.IsInstance()) { |
| 4092 RETURN_TYPE_ERROR(Z, arguments[i], Instance); | 4105 RETURN_TYPE_ERROR(Z, arguments[i], Instance); |
| 4093 } | 4106 } |
| 4094 args.SetAt(i + 1, obj); | 4107 args.SetAt(i + 1, obj); |
| 4095 } | 4108 } |
| 4096 // Now try to invoke the closure. | 4109 // Now try to invoke the closure. |
| 4097 return Api::NewHandle(T, DartEntry::InvokeClosure(args)); | 4110 return Api::NewHandle(T, DartEntry::InvokeClosure(args)); |
| 4098 } | 4111 } |
| 4099 | 4112 |
| 4100 | 4113 |
| 4101 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { | 4114 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { |
| 4115 API_TIMELINE_DURATION; |
| 4102 DARTSCOPE(Thread::Current()); | 4116 DARTSCOPE(Thread::Current()); |
| 4103 CHECK_CALLBACK_STATE(T); | 4117 CHECK_CALLBACK_STATE(T); |
| 4104 | 4118 |
| 4105 const String& field_name = Api::UnwrapStringHandle(Z, name); | 4119 const String& field_name = Api::UnwrapStringHandle(Z, name); |
| 4106 if (field_name.IsNull()) { | 4120 if (field_name.IsNull()) { |
| 4107 RETURN_TYPE_ERROR(Z, name, String); | 4121 RETURN_TYPE_ERROR(Z, name, String); |
| 4108 } | 4122 } |
| 4109 | 4123 |
| 4110 Field& field = Field::Handle(Z); | 4124 Field& field = Field::Handle(Z); |
| 4111 Function& getter = Function::Handle(Z); | 4125 Function& getter = Function::Handle(Z); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4212 return Api::NewError( | 4226 return Api::NewError( |
| 4213 "%s expects argument 'container' to be an object, type, or library.", | 4227 "%s expects argument 'container' to be an object, type, or library.", |
| 4214 CURRENT_FUNC); | 4228 CURRENT_FUNC); |
| 4215 } | 4229 } |
| 4216 } | 4230 } |
| 4217 | 4231 |
| 4218 | 4232 |
| 4219 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, | 4233 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, |
| 4220 Dart_Handle name, | 4234 Dart_Handle name, |
| 4221 Dart_Handle value) { | 4235 Dart_Handle value) { |
| 4236 API_TIMELINE_DURATION; |
| 4222 DARTSCOPE(Thread::Current()); | 4237 DARTSCOPE(Thread::Current()); |
| 4223 CHECK_CALLBACK_STATE(T); | 4238 CHECK_CALLBACK_STATE(T); |
| 4224 | 4239 |
| 4225 const String& field_name = Api::UnwrapStringHandle(Z, name); | 4240 const String& field_name = Api::UnwrapStringHandle(Z, name); |
| 4226 if (field_name.IsNull()) { | 4241 if (field_name.IsNull()) { |
| 4227 RETURN_TYPE_ERROR(Z, name, String); | 4242 RETURN_TYPE_ERROR(Z, name, String); |
| 4228 } | 4243 } |
| 4229 | 4244 |
| 4230 // Since null is allowed for value, we don't use UnwrapInstanceHandle. | 4245 // Since null is allowed for value, we don't use UnwrapInstanceHandle. |
| 4231 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); | 4246 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4663 return Api::NewError("%s: invalid argument type %d.", | 4678 return Api::NewError("%s: invalid argument type %d.", |
| 4664 CURRENT_FUNC, arg_type); | 4679 CURRENT_FUNC, arg_type); |
| 4665 } | 4680 } |
| 4666 } | 4681 } |
| 4667 return Api::Success(); | 4682 return Api::Success(); |
| 4668 } | 4683 } |
| 4669 | 4684 |
| 4670 | 4685 |
| 4671 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, | 4686 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, |
| 4672 int index) { | 4687 int index) { |
| 4673 TRACE_API_CALL(CURRENT_FUNC); | 4688 API_TIMELINE_DURATION; |
| 4674 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4689 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4675 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4690 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4676 return Api::NewError( | 4691 return Api::NewError( |
| 4677 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4692 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4678 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4693 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4679 } | 4694 } |
| 4680 return Api::NewHandle(arguments->thread(), | 4695 return Api::NewHandle(arguments->thread(), |
| 4681 arguments->NativeArgAt(index)); | 4696 arguments->NativeArgAt(index)); |
| 4682 } | 4697 } |
| 4683 | 4698 |
| 4684 | 4699 |
| 4685 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { | 4700 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { |
| 4686 TRACE_API_CALL(CURRENT_FUNC); | 4701 API_TIMELINE_DURATION; |
| 4687 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4702 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4688 return arguments->NativeArgCount(); | 4703 return arguments->NativeArgCount(); |
| 4689 } | 4704 } |
| 4690 | 4705 |
| 4691 | 4706 |
| 4692 DART_EXPORT Dart_Handle Dart_GetNativeFieldsOfArgument( | 4707 DART_EXPORT Dart_Handle Dart_GetNativeFieldsOfArgument( |
| 4693 Dart_NativeArguments args, | 4708 Dart_NativeArguments args, |
| 4694 int arg_index, | 4709 int arg_index, |
| 4695 int num_fields, | 4710 int num_fields, |
| 4696 intptr_t* field_values) { | 4711 intptr_t* field_values) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4735 return Api::NewError("%s expects argument at %d to be of" | 4750 return Api::NewError("%s expects argument at %d to be of" |
| 4736 " type String.", CURRENT_FUNC, arg_index); | 4751 " type String.", CURRENT_FUNC, arg_index); |
| 4737 } | 4752 } |
| 4738 return result; | 4753 return result; |
| 4739 } | 4754 } |
| 4740 | 4755 |
| 4741 | 4756 |
| 4742 DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, | 4757 DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, |
| 4743 int index, | 4758 int index, |
| 4744 int64_t* value) { | 4759 int64_t* value) { |
| 4745 TRACE_API_CALL(CURRENT_FUNC); | 4760 API_TIMELINE_DURATION; |
| 4746 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4761 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4747 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4762 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4748 return Api::NewError( | 4763 return Api::NewError( |
| 4749 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4764 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4750 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4765 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4751 } | 4766 } |
| 4752 if (!GetNativeIntegerArgument(arguments, index, value)) { | 4767 if (!GetNativeIntegerArgument(arguments, index, value)) { |
| 4753 return Api::NewError("%s: expects argument at %d to be of" | 4768 return Api::NewError("%s: expects argument at %d to be of" |
| 4754 " type Integer.", CURRENT_FUNC, index); | 4769 " type Integer.", CURRENT_FUNC, index); |
| 4755 } | 4770 } |
| 4756 return Api::Success(); | 4771 return Api::Success(); |
| 4757 } | 4772 } |
| 4758 | 4773 |
| 4759 | 4774 |
| 4760 DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, | 4775 DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, |
| 4761 int index, | 4776 int index, |
| 4762 bool* value) { | 4777 bool* value) { |
| 4763 TRACE_API_CALL(CURRENT_FUNC); | 4778 API_TIMELINE_DURATION; |
| 4764 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4779 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4765 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4780 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4766 return Api::NewError( | 4781 return Api::NewError( |
| 4767 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4782 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4768 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4783 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4769 } | 4784 } |
| 4770 if (!Api::GetNativeBooleanArgument(arguments, index, value)) { | 4785 if (!Api::GetNativeBooleanArgument(arguments, index, value)) { |
| 4771 return Api::NewError("%s: expects argument at %d to be of type Boolean.", | 4786 return Api::NewError("%s: expects argument at %d to be of type Boolean.", |
| 4772 CURRENT_FUNC, index); | 4787 CURRENT_FUNC, index); |
| 4773 } | 4788 } |
| 4774 return Api::Success(); | 4789 return Api::Success(); |
| 4775 } | 4790 } |
| 4776 | 4791 |
| 4777 | 4792 |
| 4778 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, | 4793 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, |
| 4779 int index, | 4794 int index, |
| 4780 double* value) { | 4795 double* value) { |
| 4781 TRACE_API_CALL(CURRENT_FUNC); | 4796 API_TIMELINE_DURATION; |
| 4782 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4797 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4783 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4798 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4784 return Api::NewError( | 4799 return Api::NewError( |
| 4785 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4800 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4786 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4801 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4787 } | 4802 } |
| 4788 if (!GetNativeDoubleArgument(arguments, index, value)) { | 4803 if (!GetNativeDoubleArgument(arguments, index, value)) { |
| 4789 return Api::NewError("%s: expects argument at %d to be of" | 4804 return Api::NewError("%s: expects argument at %d to be of" |
| 4790 " type Double.", CURRENT_FUNC, index); | 4805 " type Double.", CURRENT_FUNC, index); |
| 4791 } | 4806 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4859 Isolate* isolate = Isolate::Current(); | 4874 Isolate* isolate = Isolate::Current(); |
| 4860 CHECK_ISOLATE(isolate); | 4875 CHECK_ISOLATE(isolate); |
| 4861 isolate->set_environment_callback(callback); | 4876 isolate->set_environment_callback(callback); |
| 4862 return Api::Success(); | 4877 return Api::Success(); |
| 4863 } | 4878 } |
| 4864 | 4879 |
| 4865 | 4880 |
| 4866 // --- Scripts and Libraries --- | 4881 // --- Scripts and Libraries --- |
| 4867 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, | 4882 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, |
| 4868 bool retval) { | 4883 bool retval) { |
| 4869 TRACE_API_CALL(CURRENT_FUNC); | 4884 API_TIMELINE_DURATION; |
| 4870 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4885 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4871 arguments->SetReturn(Bool::Get(retval)); | 4886 arguments->SetReturn(Bool::Get(retval)); |
| 4872 } | 4887 } |
| 4873 | 4888 |
| 4874 | 4889 |
| 4875 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, | 4890 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, |
| 4876 int64_t retval) { | 4891 int64_t retval) { |
| 4877 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4892 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4878 ASSERT(arguments->thread()->isolate() == Isolate::Current()); | 4893 ASSERT(arguments->thread()->isolate() == Isolate::Current()); |
| 4879 if (Smi::IsValid(retval)) { | 4894 if (Smi::IsValid(retval)) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4928 // as having failed to load without providing an error instance. | 4943 // as having failed to load without providing an error instance. |
| 4929 lib.SetLoadError(Object::null_instance()); | 4944 lib.SetLoadError(Object::null_instance()); |
| 4930 } | 4945 } |
| 4931 } | 4946 } |
| 4932 | 4947 |
| 4933 | 4948 |
| 4934 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, | 4949 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, |
| 4935 Dart_Handle source, | 4950 Dart_Handle source, |
| 4936 intptr_t line_offset, | 4951 intptr_t line_offset, |
| 4937 intptr_t column_offset) { | 4952 intptr_t column_offset) { |
| 4953 API_TIMELINE_DURATION; |
| 4938 DARTSCOPE(Thread::Current()); | 4954 DARTSCOPE(Thread::Current()); |
| 4939 Isolate* I = T->isolate(); | 4955 Isolate* I = T->isolate(); |
| 4940 const String& url_str = Api::UnwrapStringHandle(Z, url); | 4956 const String& url_str = Api::UnwrapStringHandle(Z, url); |
| 4941 if (url_str.IsNull()) { | 4957 if (url_str.IsNull()) { |
| 4942 RETURN_TYPE_ERROR(Z, url, String); | 4958 RETURN_TYPE_ERROR(Z, url, String); |
| 4943 } | 4959 } |
| 4944 const String& source_str = Api::UnwrapStringHandle(Z, source); | 4960 const String& source_str = Api::UnwrapStringHandle(Z, source); |
| 4945 if (source_str.IsNull()) { | 4961 if (source_str.IsNull()) { |
| 4946 RETURN_TYPE_ERROR(Z, source, String); | 4962 RETURN_TYPE_ERROR(Z, source, String); |
| 4947 } | 4963 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 4973 Script::New(url_str, source_str, RawScript::kScriptTag)); | 4989 Script::New(url_str, source_str, RawScript::kScriptTag)); |
| 4974 script.SetLocationOffset(line_offset, column_offset); | 4990 script.SetLocationOffset(line_offset, column_offset); |
| 4975 Dart_Handle result; | 4991 Dart_Handle result; |
| 4976 CompileSource(T, library, script, &result); | 4992 CompileSource(T, library, script, &result); |
| 4977 return result; | 4993 return result; |
| 4978 } | 4994 } |
| 4979 | 4995 |
| 4980 | 4996 |
| 4981 DART_EXPORT Dart_Handle Dart_LoadScriptFromSnapshot(const uint8_t* buffer, | 4997 DART_EXPORT Dart_Handle Dart_LoadScriptFromSnapshot(const uint8_t* buffer, |
| 4982 intptr_t buffer_len) { | 4998 intptr_t buffer_len) { |
| 4999 API_TIMELINE_DURATION; |
| 4983 DARTSCOPE(Thread::Current()); | 5000 DARTSCOPE(Thread::Current()); |
| 4984 Isolate* I = T->isolate(); | 5001 Isolate* I = T->isolate(); |
| 4985 StackZone zone(T); | 5002 StackZone zone(T); |
| 4986 if (buffer == NULL) { | 5003 if (buffer == NULL) { |
| 4987 RETURN_NULL_ERROR(buffer); | 5004 RETURN_NULL_ERROR(buffer); |
| 4988 } | 5005 } |
| 4989 NoHeapGrowthControlScope no_growth_control; | 5006 NoHeapGrowthControlScope no_growth_control; |
| 4990 | 5007 |
| 4991 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 5008 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 4992 if (!snapshot->IsScriptSnapshot()) { | 5009 if (!snapshot->IsScriptSnapshot()) { |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5188 } | 5205 } |
| 5189 } | 5206 } |
| 5190 return error_in; | 5207 return error_in; |
| 5191 } | 5208 } |
| 5192 | 5209 |
| 5193 | 5210 |
| 5194 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url, | 5211 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url, |
| 5195 Dart_Handle source, | 5212 Dart_Handle source, |
| 5196 intptr_t line_offset, | 5213 intptr_t line_offset, |
| 5197 intptr_t column_offset) { | 5214 intptr_t column_offset) { |
| 5215 API_TIMELINE_DURATION; |
| 5198 DARTSCOPE(Thread::Current()); | 5216 DARTSCOPE(Thread::Current()); |
| 5199 Isolate* I = T->isolate(); | 5217 Isolate* I = T->isolate(); |
| 5200 const String& url_str = Api::UnwrapStringHandle(Z, url); | 5218 const String& url_str = Api::UnwrapStringHandle(Z, url); |
| 5201 if (url_str.IsNull()) { | 5219 if (url_str.IsNull()) { |
| 5202 RETURN_TYPE_ERROR(Z, url, String); | 5220 RETURN_TYPE_ERROR(Z, url, String); |
| 5203 } | 5221 } |
| 5204 const String& source_str = Api::UnwrapStringHandle(Z, source); | 5222 const String& source_str = Api::UnwrapStringHandle(Z, source); |
| 5205 if (source_str.IsNull()) { | 5223 if (source_str.IsNull()) { |
| 5206 RETURN_TYPE_ERROR(Z, source, String); | 5224 RETURN_TYPE_ERROR(Z, source, String); |
| 5207 } | 5225 } |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5293 } | 5311 } |
| 5294 return Api::Success(); | 5312 return Api::Success(); |
| 5295 } | 5313 } |
| 5296 | 5314 |
| 5297 | 5315 |
| 5298 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library, | 5316 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library, |
| 5299 Dart_Handle url, | 5317 Dart_Handle url, |
| 5300 Dart_Handle source, | 5318 Dart_Handle source, |
| 5301 intptr_t line_offset, | 5319 intptr_t line_offset, |
| 5302 intptr_t column_offset) { | 5320 intptr_t column_offset) { |
| 5321 API_TIMELINE_DURATION; |
| 5303 DARTSCOPE(Thread::Current()); | 5322 DARTSCOPE(Thread::Current()); |
| 5304 Isolate* I = T->isolate(); | 5323 Isolate* I = T->isolate(); |
| 5305 const Library& lib = Api::UnwrapLibraryHandle(Z, library); | 5324 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
| 5306 if (lib.IsNull()) { | 5325 if (lib.IsNull()) { |
| 5307 RETURN_TYPE_ERROR(Z, library, Library); | 5326 RETURN_TYPE_ERROR(Z, library, Library); |
| 5308 } | 5327 } |
| 5309 const String& url_str = Api::UnwrapStringHandle(Z, url); | 5328 const String& url_str = Api::UnwrapStringHandle(Z, url); |
| 5310 if (url_str.IsNull()) { | 5329 if (url_str.IsNull()) { |
| 5311 RETURN_TYPE_ERROR(Z, url, String); | 5330 RETURN_TYPE_ERROR(Z, url, String); |
| 5312 } | 5331 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 5332 script.SetLocationOffset(line_offset, column_offset); | 5351 script.SetLocationOffset(line_offset, column_offset); |
| 5333 Dart_Handle result; | 5352 Dart_Handle result; |
| 5334 CompileSource(T, lib, script, &result); | 5353 CompileSource(T, lib, script, &result); |
| 5335 return result; | 5354 return result; |
| 5336 } | 5355 } |
| 5337 | 5356 |
| 5338 | 5357 |
| 5339 DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library, | 5358 DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library, |
| 5340 Dart_Handle url, | 5359 Dart_Handle url, |
| 5341 Dart_Handle patch_source) { | 5360 Dart_Handle patch_source) { |
| 5361 API_TIMELINE_DURATION; |
| 5342 DARTSCOPE(Thread::Current()); | 5362 DARTSCOPE(Thread::Current()); |
| 5343 Isolate* I = T->isolate(); | 5363 Isolate* I = T->isolate(); |
| 5344 const Library& lib = Api::UnwrapLibraryHandle(Z, library); | 5364 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
| 5345 if (lib.IsNull()) { | 5365 if (lib.IsNull()) { |
| 5346 RETURN_TYPE_ERROR(Z, library, Library); | 5366 RETURN_TYPE_ERROR(Z, library, Library); |
| 5347 } | 5367 } |
| 5348 const String& url_str = Api::UnwrapStringHandle(Z, url); | 5368 const String& url_str = Api::UnwrapStringHandle(Z, url); |
| 5349 if (url_str.IsNull()) { | 5369 if (url_str.IsNull()) { |
| 5350 RETURN_TYPE_ERROR(Z, url, String); | 5370 RETURN_TYPE_ERROR(Z, url, String); |
| 5351 } | 5371 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 5362 Script::New(url_str, source_str, RawScript::kPatchTag)); | 5382 Script::New(url_str, source_str, RawScript::kPatchTag)); |
| 5363 Dart_Handle result; | 5383 Dart_Handle result; |
| 5364 CompileSource(T, lib, script, &result); | 5384 CompileSource(T, lib, script, &result); |
| 5365 return result; | 5385 return result; |
| 5366 } | 5386 } |
| 5367 | 5387 |
| 5368 | 5388 |
| 5369 // Finalizes classes and invokes Dart core library function that completes | 5389 // Finalizes classes and invokes Dart core library function that completes |
| 5370 // futures of loadLibrary calls (deferred library loading). | 5390 // futures of loadLibrary calls (deferred library loading). |
| 5371 DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures) { | 5391 DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures) { |
| 5392 API_TIMELINE_DURATION; |
| 5372 DARTSCOPE(Thread::Current()); | 5393 DARTSCOPE(Thread::Current()); |
| 5373 Isolate* I = T->isolate(); | 5394 Isolate* I = T->isolate(); |
| 5374 CHECK_CALLBACK_STATE(T); | 5395 CHECK_CALLBACK_STATE(T); |
| 5375 | 5396 |
| 5376 I->DoneLoading(); | 5397 I->DoneLoading(); |
| 5377 | 5398 |
| 5378 // TODO(hausner): move the remaining code below (finalization and | 5399 // TODO(hausner): move the remaining code below (finalization and |
| 5379 // invoing of _completeDeferredLoads) into Isolate::DoneLoading(). | 5400 // invoing of _completeDeferredLoads) into Isolate::DoneLoading(). |
| 5380 | 5401 |
| 5381 // Finalize all classes if needed. | 5402 // Finalize all classes if needed. |
| (...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5867 event->AsyncEnd(label, async_id); | 5888 event->AsyncEnd(label, async_id); |
| 5868 event->Complete(); | 5889 event->Complete(); |
| 5869 } | 5890 } |
| 5870 return Api::Success(); | 5891 return Api::Success(); |
| 5871 } | 5892 } |
| 5872 | 5893 |
| 5873 | 5894 |
| 5874 DART_EXPORT Dart_Handle Dart_Precompile( | 5895 DART_EXPORT Dart_Handle Dart_Precompile( |
| 5875 Dart_QualifiedFunctionName entry_points[], | 5896 Dart_QualifiedFunctionName entry_points[], |
| 5876 bool reset_fields) { | 5897 bool reset_fields) { |
| 5898 API_TIMELINE_BEGIN_END; |
| 5877 DARTSCOPE(Thread::Current()); | 5899 DARTSCOPE(Thread::Current()); |
| 5878 if (!FLAG_precompilation) { | 5900 if (!FLAG_precompilation) { |
| 5879 return Dart_NewApiError("Flag --precompilation was not specified."); | 5901 return Dart_NewApiError("Flag --precompilation was not specified."); |
| 5880 } | 5902 } |
| 5881 Dart_Handle result = Api::CheckAndFinalizePendingClasses(T); | 5903 Dart_Handle result = Api::CheckAndFinalizePendingClasses(T); |
| 5882 if (::Dart_IsError(result)) { | 5904 if (::Dart_IsError(result)) { |
| 5883 return result; | 5905 return result; |
| 5884 } | 5906 } |
| 5885 CHECK_CALLBACK_STATE(T); | 5907 CHECK_CALLBACK_STATE(T); |
| 5886 const Error& error = Error::Handle(Precompiler::CompileAll(entry_points, | 5908 const Error& error = Error::Handle(Precompiler::CompileAll(entry_points, |
| 5887 reset_fields)); | 5909 reset_fields)); |
| 5888 if (!error.IsNull()) { | 5910 if (!error.IsNull()) { |
| 5889 return Api::NewHandle(T, error.raw()); | 5911 return Api::NewHandle(T, error.raw()); |
| 5890 } | 5912 } |
| 5891 return Api::Success(); | 5913 return Api::Success(); |
| 5892 } | 5914 } |
| 5893 | 5915 |
| 5894 | 5916 |
| 5895 DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshot( | 5917 DART_EXPORT Dart_Handle Dart_CreatePrecompiledSnapshot( |
| 5896 uint8_t** vm_isolate_snapshot_buffer, | 5918 uint8_t** vm_isolate_snapshot_buffer, |
| 5897 intptr_t* vm_isolate_snapshot_size, | 5919 intptr_t* vm_isolate_snapshot_size, |
| 5898 uint8_t** isolate_snapshot_buffer, | 5920 uint8_t** isolate_snapshot_buffer, |
| 5899 intptr_t* isolate_snapshot_size, | 5921 intptr_t* isolate_snapshot_size, |
| 5900 uint8_t** instructions_snapshot_buffer, | 5922 uint8_t** instructions_snapshot_buffer, |
| 5901 intptr_t* instructions_snapshot_size) { | 5923 intptr_t* instructions_snapshot_size) { |
| 5902 ASSERT(FLAG_load_deferred_eagerly); | 5924 ASSERT(FLAG_load_deferred_eagerly); |
| 5925 API_TIMELINE_DURATION; |
| 5903 DARTSCOPE(Thread::Current()); | 5926 DARTSCOPE(Thread::Current()); |
| 5904 Isolate* I = T->isolate(); | 5927 Isolate* I = T->isolate(); |
| 5905 if (I->compilation_allowed()) { | 5928 if (I->compilation_allowed()) { |
| 5906 return Dart_NewApiError("Isolate is not precompiled. " | 5929 return Dart_NewApiError("Isolate is not precompiled. " |
| 5907 "Did you forget to call Dart_Precompile?"); | 5930 "Did you forget to call Dart_Precompile?"); |
| 5908 } | 5931 } |
| 5909 if (vm_isolate_snapshot_buffer == NULL) { | 5932 if (vm_isolate_snapshot_buffer == NULL) { |
| 5910 RETURN_NULL_ERROR(vm_isolate_snapshot_buffer); | 5933 RETURN_NULL_ERROR(vm_isolate_snapshot_buffer); |
| 5911 } | 5934 } |
| 5912 if (vm_isolate_snapshot_size == NULL) { | 5935 if (vm_isolate_snapshot_size == NULL) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 5936 ApiReallocate); | 5959 ApiReallocate); |
| 5937 writer.WriteFullSnapshot(); | 5960 writer.WriteFullSnapshot(); |
| 5938 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); | 5961 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); |
| 5939 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 5962 *isolate_snapshot_size = writer.IsolateSnapshotSize(); |
| 5940 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); | 5963 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); |
| 5941 | 5964 |
| 5942 return Api::Success(); | 5965 return Api::Success(); |
| 5943 } | 5966 } |
| 5944 | 5967 |
| 5945 } // namespace dart | 5968 } // namespace dart |
| OLD | NEW |