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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } | 78 } |
79 } | 79 } |
80 | 80 |
81 | 81 |
82 #if defined(DEBUG) | 82 #if defined(DEBUG) |
83 // An object visitor which will iterate over all the function objects in the | 83 // An object visitor which will iterate over all the function objects in the |
84 // heap and check if the result type and parameter types are canonicalized | 84 // heap and check if the result type and parameter types are canonicalized |
85 // or not. An assertion is raised if a type is not canonicalized. | 85 // or not. An assertion is raised if a type is not canonicalized. |
86 class FunctionVisitor : public ObjectVisitor { | 86 class FunctionVisitor : public ObjectVisitor { |
87 public: | 87 public: |
88 explicit FunctionVisitor(Isolate* isolate) : | 88 explicit FunctionVisitor(Thread* thread) : |
89 ObjectVisitor(isolate), | 89 ObjectVisitor(thread->isolate()), |
90 classHandle_(Class::Handle(isolate)), | 90 classHandle_(Class::Handle(thread->zone())), |
91 funcHandle_(Function::Handle(isolate)), | 91 funcHandle_(Function::Handle(thread->zone())), |
92 typeHandle_(AbstractType::Handle(isolate)) {} | 92 typeHandle_(AbstractType::Handle(thread->zone())) {} |
93 | 93 |
94 void VisitObject(RawObject* obj) { | 94 void VisitObject(RawObject* obj) { |
95 if (obj->IsFunction()) { | 95 if (obj->IsFunction()) { |
96 funcHandle_ ^= obj; | 96 funcHandle_ ^= obj; |
97 classHandle_ ^= funcHandle_.Owner(); | 97 classHandle_ ^= funcHandle_.Owner(); |
98 // Verify that the result type of a function is canonical or a | 98 // Verify that the result type of a function is canonical or a |
99 // TypeParameter. | 99 // TypeParameter. |
100 typeHandle_ ^= funcHandle_.result_type(); | 100 typeHandle_ ^= funcHandle_.result_type(); |
101 ASSERT(typeHandle_.IsNull() || | 101 ASSERT(typeHandle_.IsNull() || |
102 !typeHandle_.IsResolved() || | 102 !typeHandle_.IsResolved() || |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 Dart::IsReadOnlyApiHandle(object)); | 390 Dart::IsReadOnlyApiHandle(object)); |
391 ASSERT(FinalizablePersistentHandle::raw_offset() == 0 && | 391 ASSERT(FinalizablePersistentHandle::raw_offset() == 0 && |
392 PersistentHandle::raw_offset() == 0 && | 392 PersistentHandle::raw_offset() == 0 && |
393 LocalHandle::raw_offset() == 0); | 393 LocalHandle::raw_offset() == 0); |
394 #endif | 394 #endif |
395 return (reinterpret_cast<LocalHandle*>(object))->raw(); | 395 return (reinterpret_cast<LocalHandle*>(object))->raw(); |
396 } | 396 } |
397 | 397 |
398 | 398 |
399 #define DEFINE_UNWRAP(type) \ | 399 #define DEFINE_UNWRAP(type) \ |
400 const type& Api::Unwrap##type##Handle(Isolate* iso, \ | 400 const type& Api::Unwrap##type##Handle(Zone* zone, \ |
401 Dart_Handle dart_handle) { \ | 401 Dart_Handle dart_handle) { \ |
402 const Object& obj = Object::Handle(iso, Api::UnwrapHandle(dart_handle)); \ | 402 const Object& obj = Object::Handle(zone, Api::UnwrapHandle(dart_handle)); \ |
403 if (obj.Is##type()) { \ | 403 if (obj.Is##type()) { \ |
404 return type::Cast(obj); \ | 404 return type::Cast(obj); \ |
405 } \ | 405 } \ |
406 return type::Handle(iso); \ | 406 return type::Handle(zone ); \ |
407 } | 407 } |
408 CLASS_LIST_FOR_HANDLES(DEFINE_UNWRAP) | 408 CLASS_LIST_FOR_HANDLES(DEFINE_UNWRAP) |
409 #undef DEFINE_UNWRAP | 409 #undef DEFINE_UNWRAP |
410 | 410 |
411 | 411 |
412 const String& Api::UnwrapStringHandle(const ReusableObjectHandleScope& reuse, | 412 const String& Api::UnwrapStringHandle(const ReusableObjectHandleScope& reuse, |
413 Dart_Handle dart_handle) { | 413 Dart_Handle dart_handle) { |
414 Object& ref = reuse.Handle(); | 414 Object& ref = reuse.Handle(); |
415 ref = Api::UnwrapHandle(dart_handle); | 415 ref = Api::UnwrapHandle(dart_handle); |
416 if (ref.IsString()) { | 416 if (ref.IsString()) { |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 | 823 |
824 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { | 824 DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { |
825 DARTSCOPE(Thread::Current()); | 825 DARTSCOPE(Thread::Current()); |
826 CHECK_CALLBACK_STATE(I); | 826 CHECK_CALLBACK_STATE(I); |
827 | 827 |
828 Instance& obj = Instance::Handle(Z); | 828 Instance& obj = Instance::Handle(Z); |
829 intptr_t class_id = Api::ClassId(exception); | 829 intptr_t class_id = Api::ClassId(exception); |
830 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) { | 830 if ((class_id == kApiErrorCid) || (class_id == kLanguageErrorCid)) { |
831 obj = String::New(::Dart_GetError(exception)); | 831 obj = String::New(::Dart_GetError(exception)); |
832 } else { | 832 } else { |
833 obj = Api::UnwrapInstanceHandle(I, exception).raw(); | 833 obj = Api::UnwrapInstanceHandle(Z, exception).raw(); |
834 if (obj.IsNull()) { | 834 if (obj.IsNull()) { |
835 RETURN_TYPE_ERROR(I, exception, Instance); | 835 RETURN_TYPE_ERROR(Z, exception, Instance); |
836 } | 836 } |
837 } | 837 } |
838 const Stacktrace& stacktrace = Stacktrace::Handle(Z); | 838 const Stacktrace& stacktrace = Stacktrace::Handle(Z); |
839 return Api::NewHandle(I, UnhandledException::New(obj, stacktrace)); | 839 return Api::NewHandle(I, UnhandledException::New(obj, stacktrace)); |
840 } | 840 } |
841 | 841 |
842 | 842 |
843 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { | 843 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { |
844 Isolate* isolate = Isolate::Current(); | 844 Thread* thread = Thread::Current(); |
| 845 Isolate* isolate = thread->isolate(); |
845 { | 846 { |
846 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle)); | 847 const Object& obj = Object::Handle(thread->zone(), |
| 848 Api::UnwrapHandle(handle)); |
847 if (!obj.IsError()) { | 849 if (!obj.IsError()) { |
848 return Api::NewError( | 850 return Api::NewError( |
849 "%s expects argument 'handle' to be an error handle. " | 851 "%s expects argument 'handle' to be an error handle. " |
850 "Did you forget to check Dart_IsError first?", | 852 "Did you forget to check Dart_IsError first?", |
851 CURRENT_FUNC); | 853 CURRENT_FUNC); |
852 } | 854 } |
853 } | 855 } |
854 if (isolate->top_exit_frame_info() == 0) { | 856 if (isolate->top_exit_frame_info() == 0) { |
855 // There are no dart frames on the stack so it would be illegal to | 857 // There are no dart frames on the stack so it would be illegal to |
856 // propagate an error here. | 858 // propagate an error here. |
857 return Api::NewError("No Dart frames on stack, cannot propagate error."); | 859 return Api::NewError("No Dart frames on stack, cannot propagate error."); |
858 } | 860 } |
859 | 861 |
860 // Unwind all the API scopes till the exit frame before propagating. | 862 // Unwind all the API scopes till the exit frame before propagating. |
861 ApiState* state = isolate->api_state(); | 863 ApiState* state = isolate->api_state(); |
862 ASSERT(state != NULL); | 864 ASSERT(state != NULL); |
863 const Error* error; | 865 const Error* error; |
864 { | 866 { |
865 // We need to preserve the error object across the destruction of zones | 867 // We need to preserve the error object across the destruction of zones |
866 // when the ApiScopes are unwound. By using NoSafepointScope, we can ensure | 868 // when the ApiScopes are unwound. By using NoSafepointScope, we can ensure |
867 // that GC won't touch the raw error object before creating a valid | 869 // that GC won't touch the raw error object before creating a valid |
868 // handle for it in the surviving zone. | 870 // handle for it in the surviving zone. |
869 NoSafepointScope no_safepoint; | 871 NoSafepointScope no_safepoint; |
870 RawError* raw_error = Api::UnwrapErrorHandle(isolate, handle).raw(); | 872 RawError* raw_error = Api::UnwrapErrorHandle(thread->zone(), handle).raw(); |
871 state->UnwindScopes(isolate->top_exit_frame_info()); | 873 state->UnwindScopes(isolate->top_exit_frame_info()); |
872 error = &Error::Handle(isolate, raw_error); | 874 // Note that thread's zone is different here than at the beginning of this |
| 875 // function. |
| 876 error = &Error::Handle(thread->zone(), raw_error); |
873 } | 877 } |
874 Exceptions::PropagateError(*error); | 878 Exceptions::PropagateError(*error); |
875 UNREACHABLE(); | 879 UNREACHABLE(); |
876 return Api::NewError("Cannot reach here. Internal error."); | 880 return Api::NewError("Cannot reach here. Internal error."); |
877 } | 881 } |
878 | 882 |
879 | 883 |
880 DART_EXPORT void _Dart_ReportErrorHandle(const char* file, | 884 DART_EXPORT void _Dart_ReportErrorHandle(const char* file, |
881 int line, | 885 int line, |
882 const char* handle, | 886 const char* handle, |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1523 if (isolate_snapshot_size == NULL) { | 1527 if (isolate_snapshot_size == NULL) { |
1524 RETURN_NULL_ERROR(isolate_snapshot_size); | 1528 RETURN_NULL_ERROR(isolate_snapshot_size); |
1525 } | 1529 } |
1526 // Finalize all classes if needed. | 1530 // Finalize all classes if needed. |
1527 Dart_Handle state = Api::CheckAndFinalizePendingClasses(I); | 1531 Dart_Handle state = Api::CheckAndFinalizePendingClasses(I); |
1528 if (::Dart_IsError(state)) { | 1532 if (::Dart_IsError(state)) { |
1529 return state; | 1533 return state; |
1530 } | 1534 } |
1531 I->heap()->CollectAllGarbage(); | 1535 I->heap()->CollectAllGarbage(); |
1532 #if defined(DEBUG) | 1536 #if defined(DEBUG) |
1533 FunctionVisitor check_canonical(I); | 1537 FunctionVisitor check_canonical(T); |
1534 I->heap()->IterateObjects(&check_canonical); | 1538 I->heap()->IterateObjects(&check_canonical); |
1535 #endif // #if defined(DEBUG). | 1539 #endif // #if defined(DEBUG). |
1536 | 1540 |
1537 // Since this is only a snapshot the root library should not be set. | 1541 // Since this is only a snapshot the root library should not be set. |
1538 I->object_store()->set_root_library(Library::Handle(Z)); | 1542 I->object_store()->set_root_library(Library::Handle(Z)); |
1539 FullSnapshotWriter writer(vm_isolate_snapshot_buffer, | 1543 FullSnapshotWriter writer(vm_isolate_snapshot_buffer, |
1540 isolate_snapshot_buffer, | 1544 isolate_snapshot_buffer, |
1541 NULL, /* instructions_snapshot_buffer */ | 1545 NULL, /* instructions_snapshot_buffer */ |
1542 ApiReallocate, | 1546 ApiReallocate, |
1543 false, /* snapshot_code */ | 1547 false, /* snapshot_code */ |
(...skipping 21 matching lines...) Expand all Loading... |
1565 return state; | 1569 return state; |
1566 } | 1570 } |
1567 Library& lib = Library::Handle(Z); | 1571 Library& lib = Library::Handle(Z); |
1568 if (library == Dart_Null()) { | 1572 if (library == Dart_Null()) { |
1569 lib ^= I->object_store()->root_library(); | 1573 lib ^= I->object_store()->root_library(); |
1570 } else { | 1574 } else { |
1571 lib ^= Api::UnwrapHandle(library); | 1575 lib ^= Api::UnwrapHandle(library); |
1572 } | 1576 } |
1573 I->heap()->CollectAllGarbage(); | 1577 I->heap()->CollectAllGarbage(); |
1574 #if defined(DEBUG) | 1578 #if defined(DEBUG) |
1575 FunctionVisitor check_canonical(I); | 1579 FunctionVisitor check_canonical(T); |
1576 I->heap()->IterateObjects(&check_canonical); | 1580 I->heap()->IterateObjects(&check_canonical); |
1577 #endif // #if defined(DEBUG). | 1581 #endif // #if defined(DEBUG). |
1578 ScriptSnapshotWriter writer(buffer, ApiReallocate); | 1582 ScriptSnapshotWriter writer(buffer, ApiReallocate); |
1579 writer.WriteScriptSnapshot(lib); | 1583 writer.WriteScriptSnapshot(lib); |
1580 *size = writer.BytesWritten(); | 1584 *size = writer.BytesWritten(); |
1581 return Api::Success(); | 1585 return Api::Success(); |
1582 } | 1586 } |
1583 | 1587 |
1584 | 1588 |
1585 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer, | 1589 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer, |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1750 port_id); | 1754 port_id); |
1751 } | 1755 } |
1752 return Api::NewHandle(I, SendPort::New(port_id)); | 1756 return Api::NewHandle(I, SendPort::New(port_id)); |
1753 } | 1757 } |
1754 | 1758 |
1755 | 1759 |
1756 DART_EXPORT Dart_Handle Dart_SendPortGetId(Dart_Handle port, | 1760 DART_EXPORT Dart_Handle Dart_SendPortGetId(Dart_Handle port, |
1757 Dart_Port* port_id) { | 1761 Dart_Port* port_id) { |
1758 DARTSCOPE(Thread::Current()); | 1762 DARTSCOPE(Thread::Current()); |
1759 CHECK_CALLBACK_STATE(I); | 1763 CHECK_CALLBACK_STATE(I); |
1760 const SendPort& send_port = Api::UnwrapSendPortHandle(I, port); | 1764 const SendPort& send_port = Api::UnwrapSendPortHandle(Z, port); |
1761 if (send_port.IsNull()) { | 1765 if (send_port.IsNull()) { |
1762 RETURN_TYPE_ERROR(I, port, SendPort); | 1766 RETURN_TYPE_ERROR(Z, port, SendPort); |
1763 } | 1767 } |
1764 if (port_id == NULL) { | 1768 if (port_id == NULL) { |
1765 RETURN_NULL_ERROR(port_id); | 1769 RETURN_NULL_ERROR(port_id); |
1766 } | 1770 } |
1767 *port_id = send_port.Id(); | 1771 *port_id = send_port.Id(); |
1768 return Api::Success(); | 1772 return Api::Success(); |
1769 } | 1773 } |
1770 | 1774 |
1771 | 1775 |
1772 DART_EXPORT Dart_Port Dart_GetMainPortId() { | 1776 DART_EXPORT Dart_Port Dart_GetMainPortId() { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1875 | 1879 |
1876 | 1880 |
1877 // TODO(iposva): This call actually implements IsInstanceOfClass. | 1881 // TODO(iposva): This call actually implements IsInstanceOfClass. |
1878 // Do we also need a real Dart_IsInstanceOf, which should take an instance | 1882 // Do we also need a real Dart_IsInstanceOf, which should take an instance |
1879 // rather than an object? | 1883 // rather than an object? |
1880 DART_EXPORT Dart_Handle Dart_ObjectIsType(Dart_Handle object, | 1884 DART_EXPORT Dart_Handle Dart_ObjectIsType(Dart_Handle object, |
1881 Dart_Handle type, | 1885 Dart_Handle type, |
1882 bool* value) { | 1886 bool* value) { |
1883 DARTSCOPE(Thread::Current()); | 1887 DARTSCOPE(Thread::Current()); |
1884 | 1888 |
1885 const Type& type_obj = Api::UnwrapTypeHandle(I, type); | 1889 const Type& type_obj = Api::UnwrapTypeHandle(Z, type); |
1886 if (type_obj.IsNull()) { | 1890 if (type_obj.IsNull()) { |
1887 *value = false; | 1891 *value = false; |
1888 RETURN_TYPE_ERROR(I, type, Type); | 1892 RETURN_TYPE_ERROR(Z, type, Type); |
1889 } | 1893 } |
1890 if (!type_obj.IsFinalized()) { | 1894 if (!type_obj.IsFinalized()) { |
1891 return Api::NewError( | 1895 return Api::NewError( |
1892 "%s expects argument 'type' to be a fully resolved type.", | 1896 "%s expects argument 'type' to be a fully resolved type.", |
1893 CURRENT_FUNC); | 1897 CURRENT_FUNC); |
1894 } | 1898 } |
1895 if (object == Api::Null()) { | 1899 if (object == Api::Null()) { |
1896 *value = false; | 1900 *value = false; |
1897 return Api::Success(); | 1901 return Api::Success(); |
1898 } | 1902 } |
1899 const Instance& instance = Api::UnwrapInstanceHandle(I, object); | 1903 const Instance& instance = Api::UnwrapInstanceHandle(Z, object); |
1900 if (instance.IsNull()) { | 1904 if (instance.IsNull()) { |
1901 *value = false; | 1905 *value = false; |
1902 RETURN_TYPE_ERROR(I, object, Instance); | 1906 RETURN_TYPE_ERROR(Z, object, Instance); |
1903 } | 1907 } |
1904 CHECK_CALLBACK_STATE(I); | 1908 CHECK_CALLBACK_STATE(I); |
1905 Error& malformed_type_error = Error::Handle(Z); | 1909 Error& malformed_type_error = Error::Handle(Z); |
1906 *value = instance.IsInstanceOf(type_obj, | 1910 *value = instance.IsInstanceOf(type_obj, |
1907 Object::null_type_arguments(), | 1911 Object::null_type_arguments(), |
1908 &malformed_type_error); | 1912 &malformed_type_error); |
1909 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. | 1913 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. |
1910 return Api::Success(); | 1914 return Api::Success(); |
1911 } | 1915 } |
1912 | 1916 |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2062 | 2066 |
2063 // --- Instances ---- | 2067 // --- Instances ---- |
2064 | 2068 |
2065 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) { | 2069 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) { |
2066 DARTSCOPE(Thread::Current()); | 2070 DARTSCOPE(Thread::Current()); |
2067 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(instance)); | 2071 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(instance)); |
2068 if (obj.IsNull()) { | 2072 if (obj.IsNull()) { |
2069 return Api::NewHandle(I, I->object_store()->null_type()); | 2073 return Api::NewHandle(I, I->object_store()->null_type()); |
2070 } | 2074 } |
2071 if (!obj.IsInstance()) { | 2075 if (!obj.IsInstance()) { |
2072 RETURN_TYPE_ERROR(I, instance, Instance); | 2076 RETURN_TYPE_ERROR(Z, instance, Instance); |
2073 } | 2077 } |
2074 const Type& type = Type::Handle(Instance::Cast(obj).GetType()); | 2078 const Type& type = Type::Handle(Instance::Cast(obj).GetType()); |
2075 return Api::NewHandle(I, type.Canonicalize()); | 2079 return Api::NewHandle(I, type.Canonicalize()); |
2076 } | 2080 } |
2077 | 2081 |
2078 | 2082 |
2079 // --- Numbers, Integers and Doubles ---- | 2083 // --- Numbers, Integers and Doubles ---- |
2080 | 2084 |
2081 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, | 2085 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, |
2082 bool* fits) { | 2086 bool* fits) { |
2083 // Fast path for Smis and Mints. | 2087 // Fast path for Smis and Mints. |
2084 Thread* thread = Thread::Current(); | 2088 Thread* thread = Thread::Current(); |
2085 Isolate* isolate = thread->isolate(); | 2089 Isolate* isolate = thread->isolate(); |
2086 CHECK_ISOLATE(isolate); | 2090 CHECK_ISOLATE(isolate); |
2087 intptr_t class_id = Api::ClassId(integer); | 2091 intptr_t class_id = Api::ClassId(integer); |
2088 if (class_id == kSmiCid || class_id == kMintCid) { | 2092 if (class_id == kSmiCid || class_id == kMintCid) { |
2089 *fits = true; | 2093 *fits = true; |
2090 return Api::Success(); | 2094 return Api::Success(); |
2091 } | 2095 } |
2092 // Slow path for Mints and Bigints. | 2096 // Slow path for Mints and Bigints. |
2093 DARTSCOPE(thread); | 2097 DARTSCOPE(thread); |
2094 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 2098 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
2095 if (int_obj.IsNull()) { | 2099 if (int_obj.IsNull()) { |
2096 RETURN_TYPE_ERROR(isolate, integer, Integer); | 2100 RETURN_TYPE_ERROR(Z, integer, Integer); |
2097 } | 2101 } |
2098 ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64()); | 2102 ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64()); |
2099 *fits = false; | 2103 *fits = false; |
2100 return Api::Success(); | 2104 return Api::Success(); |
2101 } | 2105 } |
2102 | 2106 |
2103 | 2107 |
2104 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, | 2108 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, |
2105 bool* fits) { | 2109 bool* fits) { |
2106 // Fast path for Smis. | 2110 // Fast path for Smis. |
2107 Thread* thread = Thread::Current(); | 2111 Thread* thread = Thread::Current(); |
2108 Isolate* isolate = thread->isolate(); | 2112 Isolate* isolate = thread->isolate(); |
2109 CHECK_ISOLATE(isolate); | 2113 CHECK_ISOLATE(isolate); |
2110 if (Api::IsSmi(integer)) { | 2114 if (Api::IsSmi(integer)) { |
2111 *fits = (Api::SmiValue(integer) >= 0); | 2115 *fits = (Api::SmiValue(integer) >= 0); |
2112 return Api::Success(); | 2116 return Api::Success(); |
2113 } | 2117 } |
2114 // Slow path for Mints and Bigints. | 2118 // Slow path for Mints and Bigints. |
2115 DARTSCOPE(thread); | 2119 DARTSCOPE(thread); |
2116 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 2120 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
2117 if (int_obj.IsNull()) { | 2121 if (int_obj.IsNull()) { |
2118 RETURN_TYPE_ERROR(isolate, integer, Integer); | 2122 RETURN_TYPE_ERROR(Z, integer, Integer); |
2119 } | 2123 } |
2120 ASSERT(!int_obj.IsSmi()); | 2124 ASSERT(!int_obj.IsSmi()); |
2121 if (int_obj.IsMint()) { | 2125 if (int_obj.IsMint()) { |
2122 *fits = !int_obj.IsNegative(); | 2126 *fits = !int_obj.IsNegative(); |
2123 } else { | 2127 } else { |
2124 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); | 2128 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); |
2125 } | 2129 } |
2126 return Api::Success(); | 2130 return Api::Success(); |
2127 } | 2131 } |
2128 | 2132 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2163 // Fast path for Smis. | 2167 // Fast path for Smis. |
2164 Thread* thread = Thread::Current(); | 2168 Thread* thread = Thread::Current(); |
2165 Isolate* isolate = thread->isolate(); | 2169 Isolate* isolate = thread->isolate(); |
2166 CHECK_ISOLATE(isolate); | 2170 CHECK_ISOLATE(isolate); |
2167 if (Api::IsSmi(integer)) { | 2171 if (Api::IsSmi(integer)) { |
2168 *value = Api::SmiValue(integer); | 2172 *value = Api::SmiValue(integer); |
2169 return Api::Success(); | 2173 return Api::Success(); |
2170 } | 2174 } |
2171 // Slow path for Mints and Bigints. | 2175 // Slow path for Mints and Bigints. |
2172 DARTSCOPE(thread); | 2176 DARTSCOPE(thread); |
2173 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 2177 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
2174 if (int_obj.IsNull()) { | 2178 if (int_obj.IsNull()) { |
2175 RETURN_TYPE_ERROR(isolate, integer, Integer); | 2179 RETURN_TYPE_ERROR(Z, integer, Integer); |
2176 } | 2180 } |
2177 ASSERT(!int_obj.IsSmi()); | 2181 ASSERT(!int_obj.IsSmi()); |
2178 if (int_obj.IsMint()) { | 2182 if (int_obj.IsMint()) { |
2179 *value = int_obj.AsInt64Value(); | 2183 *value = int_obj.AsInt64Value(); |
2180 return Api::Success(); | 2184 return Api::Success(); |
2181 } else { | 2185 } else { |
2182 const Bigint& bigint = Bigint::Cast(int_obj); | 2186 const Bigint& bigint = Bigint::Cast(int_obj); |
2183 if (bigint.FitsIntoInt64()) { | 2187 if (bigint.FitsIntoInt64()) { |
2184 *value = bigint.AsInt64Value(); | 2188 *value = bigint.AsInt64Value(); |
2185 return Api::Success(); | 2189 return Api::Success(); |
(...skipping 12 matching lines...) Expand all Loading... |
2198 CHECK_ISOLATE(isolate); | 2202 CHECK_ISOLATE(isolate); |
2199 if (Api::IsSmi(integer)) { | 2203 if (Api::IsSmi(integer)) { |
2200 intptr_t smi_value = Api::SmiValue(integer); | 2204 intptr_t smi_value = Api::SmiValue(integer); |
2201 if (smi_value >= 0) { | 2205 if (smi_value >= 0) { |
2202 *value = smi_value; | 2206 *value = smi_value; |
2203 return Api::Success(); | 2207 return Api::Success(); |
2204 } | 2208 } |
2205 } | 2209 } |
2206 // Slow path for Mints and Bigints. | 2210 // Slow path for Mints and Bigints. |
2207 DARTSCOPE(thread); | 2211 DARTSCOPE(thread); |
2208 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 2212 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
2209 if (int_obj.IsNull()) { | 2213 if (int_obj.IsNull()) { |
2210 RETURN_TYPE_ERROR(isolate, integer, Integer); | 2214 RETURN_TYPE_ERROR(Z, integer, Integer); |
2211 } | 2215 } |
2212 if (int_obj.IsSmi()) { | 2216 if (int_obj.IsSmi()) { |
2213 ASSERT(int_obj.IsNegative()); | 2217 ASSERT(int_obj.IsNegative()); |
2214 } else if (int_obj.IsMint() && !int_obj.IsNegative()) { | 2218 } else if (int_obj.IsMint() && !int_obj.IsNegative()) { |
2215 *value = int_obj.AsInt64Value(); | 2219 *value = int_obj.AsInt64Value(); |
2216 return Api::Success(); | 2220 return Api::Success(); |
2217 } else { | 2221 } else { |
2218 const Bigint& bigint = Bigint::Cast(int_obj); | 2222 const Bigint& bigint = Bigint::Cast(int_obj); |
2219 if (bigint.FitsIntoUint64()) { | 2223 if (bigint.FitsIntoUint64()) { |
2220 *value = bigint.AsUint64Value(); | 2224 *value = bigint.AsUint64Value(); |
2221 return Api::Success(); | 2225 return Api::Success(); |
2222 } | 2226 } |
2223 } | 2227 } |
2224 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.", | 2228 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.", |
2225 CURRENT_FUNC, int_obj.ToCString()); | 2229 CURRENT_FUNC, int_obj.ToCString()); |
2226 } | 2230 } |
2227 | 2231 |
2228 | 2232 |
2229 static uword BigintAllocate(intptr_t size) { | 2233 static uword BigintAllocate(intptr_t size) { |
2230 return Api::TopScope(Isolate::Current())->zone()->AllocUnsafe(size); | 2234 return Api::TopScope(Isolate::Current())->zone()->AllocUnsafe(size); |
2231 } | 2235 } |
2232 | 2236 |
2233 | 2237 |
2234 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, | 2238 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, |
2235 const char** value) { | 2239 const char** value) { |
2236 DARTSCOPE(Thread::Current()); | 2240 DARTSCOPE(Thread::Current()); |
2237 const Integer& int_obj = Api::UnwrapIntegerHandle(I, integer); | 2241 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
2238 if (int_obj.IsNull()) { | 2242 if (int_obj.IsNull()) { |
2239 RETURN_TYPE_ERROR(I, integer, Integer); | 2243 RETURN_TYPE_ERROR(Z, integer, Integer); |
2240 } | 2244 } |
2241 if (int_obj.IsSmi() || int_obj.IsMint()) { | 2245 if (int_obj.IsSmi() || int_obj.IsMint()) { |
2242 const Bigint& bigint = Bigint::Handle(Z, | 2246 const Bigint& bigint = Bigint::Handle(Z, |
2243 Bigint::NewFromInt64(int_obj.AsInt64Value())); | 2247 Bigint::NewFromInt64(int_obj.AsInt64Value())); |
2244 *value = bigint.ToHexCString(BigintAllocate); | 2248 *value = bigint.ToHexCString(BigintAllocate); |
2245 } else { | 2249 } else { |
2246 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); | 2250 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); |
2247 } | 2251 } |
2248 return Api::Success(); | 2252 return Api::Success(); |
2249 } | 2253 } |
2250 | 2254 |
2251 | 2255 |
2252 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { | 2256 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { |
2253 DARTSCOPE(Thread::Current()); | 2257 DARTSCOPE(Thread::Current()); |
2254 CHECK_CALLBACK_STATE(I); | 2258 CHECK_CALLBACK_STATE(I); |
2255 return Api::NewHandle(I, Double::New(value)); | 2259 return Api::NewHandle(I, Double::New(value)); |
2256 } | 2260 } |
2257 | 2261 |
2258 | 2262 |
2259 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, | 2263 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, |
2260 double* value) { | 2264 double* value) { |
2261 DARTSCOPE(Thread::Current()); | 2265 DARTSCOPE(Thread::Current()); |
2262 const Double& obj = Api::UnwrapDoubleHandle(I, double_obj); | 2266 const Double& obj = Api::UnwrapDoubleHandle(Z, double_obj); |
2263 if (obj.IsNull()) { | 2267 if (obj.IsNull()) { |
2264 RETURN_TYPE_ERROR(I, double_obj, Double); | 2268 RETURN_TYPE_ERROR(Z, double_obj, Double); |
2265 } | 2269 } |
2266 *value = obj.value(); | 2270 *value = obj.value(); |
2267 return Api::Success(); | 2271 return Api::Success(); |
2268 } | 2272 } |
2269 | 2273 |
2270 | 2274 |
2271 // --- Booleans ---- | 2275 // --- Booleans ---- |
2272 | 2276 |
2273 DART_EXPORT Dart_Handle Dart_True() { | 2277 DART_EXPORT Dart_Handle Dart_True() { |
2274 ASSERT(Isolate::Current() != NULL); | 2278 ASSERT(Isolate::Current() != NULL); |
(...skipping 10 matching lines...) Expand all Loading... |
2285 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) { | 2289 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) { |
2286 Isolate* isolate = Isolate::Current(); | 2290 Isolate* isolate = Isolate::Current(); |
2287 CHECK_ISOLATE(isolate); | 2291 CHECK_ISOLATE(isolate); |
2288 return value ? Api::True() : Api::False(); | 2292 return value ? Api::True() : Api::False(); |
2289 } | 2293 } |
2290 | 2294 |
2291 | 2295 |
2292 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, | 2296 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, |
2293 bool* value) { | 2297 bool* value) { |
2294 DARTSCOPE(Thread::Current()); | 2298 DARTSCOPE(Thread::Current()); |
2295 const Bool& obj = Api::UnwrapBoolHandle(I, boolean_obj); | 2299 const Bool& obj = Api::UnwrapBoolHandle(Z, boolean_obj); |
2296 if (obj.IsNull()) { | 2300 if (obj.IsNull()) { |
2297 RETURN_TYPE_ERROR(I, boolean_obj, Bool); | 2301 RETURN_TYPE_ERROR(Z, boolean_obj, Bool); |
2298 } | 2302 } |
2299 *value = obj.value(); | 2303 *value = obj.value(); |
2300 return Api::Success(); | 2304 return Api::Success(); |
2301 } | 2305 } |
2302 | 2306 |
2303 | 2307 |
2304 // --- Strings --- | 2308 // --- Strings --- |
2305 | 2309 |
2306 | 2310 |
2307 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { | 2311 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { |
2308 Thread* thread = Thread::Current(); | 2312 Thread* thread = Thread::Current(); |
2309 CHECK_ISOLATE(thread->isolate()); | 2313 CHECK_ISOLATE(thread->isolate()); |
2310 ReusableObjectHandleScope reused_obj_handle(thread); | 2314 ReusableObjectHandleScope reused_obj_handle(thread); |
2311 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); | 2315 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); |
2312 if (str_obj.IsNull()) { | 2316 if (str_obj.IsNull()) { |
2313 RETURN_TYPE_ERROR(thread->isolate(), str, String); | 2317 RETURN_TYPE_ERROR(thread->zone(), str, String); |
2314 } | 2318 } |
2315 *len = str_obj.Length(); | 2319 *len = str_obj.Length(); |
2316 return Api::Success(); | 2320 return Api::Success(); |
2317 } | 2321 } |
2318 | 2322 |
2319 | 2323 |
2320 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { | 2324 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { |
2321 DARTSCOPE(Thread::Current()); | 2325 DARTSCOPE(Thread::Current()); |
2322 if (str == NULL) { | 2326 if (str == NULL) { |
2323 RETURN_NULL_ERROR(str); | 2327 RETURN_NULL_ERROR(str); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2406 SpaceForExternal(I, bytes))); | 2410 SpaceForExternal(I, bytes))); |
2407 } | 2411 } |
2408 | 2412 |
2409 | 2413 |
2410 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, | 2414 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, |
2411 const char** cstr) { | 2415 const char** cstr) { |
2412 DARTSCOPE(Thread::Current()); | 2416 DARTSCOPE(Thread::Current()); |
2413 if (cstr == NULL) { | 2417 if (cstr == NULL) { |
2414 RETURN_NULL_ERROR(cstr); | 2418 RETURN_NULL_ERROR(cstr); |
2415 } | 2419 } |
2416 const String& str_obj = Api::UnwrapStringHandle(I, object); | 2420 const String& str_obj = Api::UnwrapStringHandle(Z, object); |
2417 if (str_obj.IsNull()) { | 2421 if (str_obj.IsNull()) { |
2418 RETURN_TYPE_ERROR(I, object, String); | 2422 RETURN_TYPE_ERROR(Z, object, String); |
2419 } | 2423 } |
2420 intptr_t string_length = Utf8::Length(str_obj); | 2424 intptr_t string_length = Utf8::Length(str_obj); |
2421 char* res = Api::TopScope(I)->zone()->Alloc<char>(string_length + 1); | 2425 char* res = Api::TopScope(I)->zone()->Alloc<char>(string_length + 1); |
2422 if (res == NULL) { | 2426 if (res == NULL) { |
2423 return Api::NewError("Unable to allocate memory"); | 2427 return Api::NewError("Unable to allocate memory"); |
2424 } | 2428 } |
2425 const char* string_value = str_obj.ToCString(); | 2429 const char* string_value = str_obj.ToCString(); |
2426 memmove(res, string_value, string_length + 1); | 2430 memmove(res, string_value, string_length + 1); |
2427 ASSERT(res[string_length] == '\0'); | 2431 ASSERT(res[string_length] == '\0'); |
2428 *cstr = res; | 2432 *cstr = res; |
2429 return Api::Success(); | 2433 return Api::Success(); |
2430 } | 2434 } |
2431 | 2435 |
2432 | 2436 |
2433 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str, | 2437 DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str, |
2434 uint8_t** utf8_array, | 2438 uint8_t** utf8_array, |
2435 intptr_t* length) { | 2439 intptr_t* length) { |
2436 DARTSCOPE(Thread::Current()); | 2440 DARTSCOPE(Thread::Current()); |
2437 if (utf8_array == NULL) { | 2441 if (utf8_array == NULL) { |
2438 RETURN_NULL_ERROR(utf8_array); | 2442 RETURN_NULL_ERROR(utf8_array); |
2439 } | 2443 } |
2440 if (length == NULL) { | 2444 if (length == NULL) { |
2441 RETURN_NULL_ERROR(length); | 2445 RETURN_NULL_ERROR(length); |
2442 } | 2446 } |
2443 const String& str_obj = Api::UnwrapStringHandle(I, str); | 2447 const String& str_obj = Api::UnwrapStringHandle(Z, str); |
2444 if (str_obj.IsNull()) { | 2448 if (str_obj.IsNull()) { |
2445 RETURN_TYPE_ERROR(I, str, String); | 2449 RETURN_TYPE_ERROR(Z, str, String); |
2446 } | 2450 } |
2447 intptr_t str_len = Utf8::Length(str_obj); | 2451 intptr_t str_len = Utf8::Length(str_obj); |
2448 *utf8_array = Api::TopScope(I)->zone()->Alloc<uint8_t>(str_len); | 2452 *utf8_array = Api::TopScope(I)->zone()->Alloc<uint8_t>(str_len); |
2449 if (*utf8_array == NULL) { | 2453 if (*utf8_array == NULL) { |
2450 return Api::NewError("Unable to allocate memory"); | 2454 return Api::NewError("Unable to allocate memory"); |
2451 } | 2455 } |
2452 str_obj.ToUTF8(*utf8_array, str_len); | 2456 str_obj.ToUTF8(*utf8_array, str_len); |
2453 *length = str_len; | 2457 *length = str_len; |
2454 return Api::Success(); | 2458 return Api::Success(); |
2455 } | 2459 } |
2456 | 2460 |
2457 | 2461 |
2458 DART_EXPORT Dart_Handle Dart_StringToLatin1(Dart_Handle str, | 2462 DART_EXPORT Dart_Handle Dart_StringToLatin1(Dart_Handle str, |
2459 uint8_t* latin1_array, | 2463 uint8_t* latin1_array, |
2460 intptr_t* length) { | 2464 intptr_t* length) { |
2461 DARTSCOPE(Thread::Current()); | 2465 DARTSCOPE(Thread::Current()); |
2462 if (latin1_array == NULL) { | 2466 if (latin1_array == NULL) { |
2463 RETURN_NULL_ERROR(latin1_array); | 2467 RETURN_NULL_ERROR(latin1_array); |
2464 } | 2468 } |
2465 if (length == NULL) { | 2469 if (length == NULL) { |
2466 RETURN_NULL_ERROR(length); | 2470 RETURN_NULL_ERROR(length); |
2467 } | 2471 } |
2468 const String& str_obj = Api::UnwrapStringHandle(I, str); | 2472 const String& str_obj = Api::UnwrapStringHandle(Z, str); |
2469 if (str_obj.IsNull() || !str_obj.IsOneByteString()) { | 2473 if (str_obj.IsNull() || !str_obj.IsOneByteString()) { |
2470 RETURN_TYPE_ERROR(I, str, String); | 2474 RETURN_TYPE_ERROR(Z, str, String); |
2471 } | 2475 } |
2472 intptr_t str_len = str_obj.Length(); | 2476 intptr_t str_len = str_obj.Length(); |
2473 intptr_t copy_len = (str_len > *length) ? *length : str_len; | 2477 intptr_t copy_len = (str_len > *length) ? *length : str_len; |
2474 | 2478 |
2475 // We have already asserted that the string object is a Latin-1 string | 2479 // We have already asserted that the string object is a Latin-1 string |
2476 // so we can copy the characters over using a simple loop. | 2480 // so we can copy the characters over using a simple loop. |
2477 for (intptr_t i = 0; i < copy_len; i++) { | 2481 for (intptr_t i = 0; i < copy_len; i++) { |
2478 latin1_array[i] = str_obj.CharAt(i); | 2482 latin1_array[i] = str_obj.CharAt(i); |
2479 } | 2483 } |
2480 *length = copy_len; | 2484 *length = copy_len; |
2481 return Api::Success(); | 2485 return Api::Success(); |
2482 } | 2486 } |
2483 | 2487 |
2484 | 2488 |
2485 DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str, | 2489 DART_EXPORT Dart_Handle Dart_StringToUTF16(Dart_Handle str, |
2486 uint16_t* utf16_array, | 2490 uint16_t* utf16_array, |
2487 intptr_t* length) { | 2491 intptr_t* length) { |
2488 DARTSCOPE(Thread::Current()); | 2492 DARTSCOPE(Thread::Current()); |
2489 const String& str_obj = Api::UnwrapStringHandle(I, str); | 2493 const String& str_obj = Api::UnwrapStringHandle(Z, str); |
2490 if (str_obj.IsNull()) { | 2494 if (str_obj.IsNull()) { |
2491 RETURN_TYPE_ERROR(I, str, String); | 2495 RETURN_TYPE_ERROR(Z, str, String); |
2492 } | 2496 } |
2493 intptr_t str_len = str_obj.Length(); | 2497 intptr_t str_len = str_obj.Length(); |
2494 intptr_t copy_len = (str_len > *length) ? *length : str_len; | 2498 intptr_t copy_len = (str_len > *length) ? *length : str_len; |
2495 for (intptr_t i = 0; i < copy_len; i++) { | 2499 for (intptr_t i = 0; i < copy_len; i++) { |
2496 utf16_array[i] = str_obj.CharAt(i); | 2500 utf16_array[i] = str_obj.CharAt(i); |
2497 } | 2501 } |
2498 *length = copy_len; | 2502 *length = copy_len; |
2499 return Api::Success(); | 2503 return Api::Success(); |
2500 } | 2504 } |
2501 | 2505 |
2502 | 2506 |
2503 DART_EXPORT Dart_Handle Dart_StringStorageSize(Dart_Handle str, | 2507 DART_EXPORT Dart_Handle Dart_StringStorageSize(Dart_Handle str, |
2504 intptr_t* size) { | 2508 intptr_t* size) { |
2505 Thread* thread = Thread::Current(); | 2509 Thread* thread = Thread::Current(); |
2506 CHECK_ISOLATE(thread->isolate()); | 2510 CHECK_ISOLATE(thread->isolate()); |
2507 ReusableObjectHandleScope reused_obj_handle(thread); | 2511 ReusableObjectHandleScope reused_obj_handle(thread); |
2508 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); | 2512 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); |
2509 if (str_obj.IsNull()) { | 2513 if (str_obj.IsNull()) { |
2510 RETURN_TYPE_ERROR(thread->isolate(), str, String); | 2514 RETURN_TYPE_ERROR(thread->zone(), str, String); |
2511 } | 2515 } |
2512 if (size == NULL) { | 2516 if (size == NULL) { |
2513 RETURN_NULL_ERROR(size); | 2517 RETURN_NULL_ERROR(size); |
2514 } | 2518 } |
2515 *size = (str_obj.Length() * str_obj.CharSize()); | 2519 *size = (str_obj.Length() * str_obj.CharSize()); |
2516 return Api::Success(); | 2520 return Api::Success(); |
2517 } | 2521 } |
2518 | 2522 |
2519 | 2523 |
2520 DART_EXPORT Dart_Handle Dart_MakeExternalString(Dart_Handle str, | 2524 DART_EXPORT Dart_Handle Dart_MakeExternalString(Dart_Handle str, |
2521 void* array, | 2525 void* array, |
2522 intptr_t length, | 2526 intptr_t length, |
2523 void* peer, | 2527 void* peer, |
2524 Dart_PeerFinalizer cback) { | 2528 Dart_PeerFinalizer cback) { |
2525 DARTSCOPE(Thread::Current()); | 2529 DARTSCOPE(Thread::Current()); |
2526 const String& str_obj = Api::UnwrapStringHandle(I, str); | 2530 const String& str_obj = Api::UnwrapStringHandle(Z, str); |
2527 if (str_obj.IsExternal()) { | 2531 if (str_obj.IsExternal()) { |
2528 return str; // String is already an external string. | 2532 return str; // String is already an external string. |
2529 } | 2533 } |
2530 if (str_obj.IsNull()) { | 2534 if (str_obj.IsNull()) { |
2531 RETURN_TYPE_ERROR(I, str, String); | 2535 RETURN_TYPE_ERROR(Z, str, String); |
2532 } | 2536 } |
2533 if (array == NULL) { | 2537 if (array == NULL) { |
2534 RETURN_NULL_ERROR(array); | 2538 RETURN_NULL_ERROR(array); |
2535 } | 2539 } |
2536 intptr_t str_size = (str_obj.Length() * str_obj.CharSize()); | 2540 intptr_t str_size = (str_obj.Length() * str_obj.CharSize()); |
2537 if ((length < str_size) || (length > String::kMaxElements)) { | 2541 if ((length < str_size) || (length > String::kMaxElements)) { |
2538 return Api::NewError("Dart_MakeExternalString " | 2542 return Api::NewError("Dart_MakeExternalString " |
2539 "expects argument length to be in the range" | 2543 "expects argument length to be in the range" |
2540 "[%" Pd "..%" Pd "].", | 2544 "[%" Pd "..%" Pd "].", |
2541 str_size, String::kMaxElements); | 2545 str_size, String::kMaxElements); |
(...skipping 29 matching lines...) Expand all Loading... |
2571 | 2575 |
2572 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, | 2576 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, |
2573 intptr_t* char_size, | 2577 intptr_t* char_size, |
2574 intptr_t* str_len, | 2578 intptr_t* str_len, |
2575 void** peer) { | 2579 void** peer) { |
2576 Thread* thread = Thread::Current(); | 2580 Thread* thread = Thread::Current(); |
2577 CHECK_ISOLATE(thread->isolate()); | 2581 CHECK_ISOLATE(thread->isolate()); |
2578 ReusableObjectHandleScope reused_obj_handle(thread); | 2582 ReusableObjectHandleScope reused_obj_handle(thread); |
2579 const String& str = Api::UnwrapStringHandle(reused_obj_handle, object); | 2583 const String& str = Api::UnwrapStringHandle(reused_obj_handle, object); |
2580 if (str.IsNull()) { | 2584 if (str.IsNull()) { |
2581 RETURN_TYPE_ERROR(thread->isolate(), object, String); | 2585 RETURN_TYPE_ERROR(thread->zone(), object, String); |
2582 } | 2586 } |
2583 if (str.IsExternal()) { | 2587 if (str.IsExternal()) { |
2584 *peer = str.GetPeer(); | 2588 *peer = str.GetPeer(); |
2585 ASSERT(*peer != NULL); | 2589 ASSERT(*peer != NULL); |
2586 } else { | 2590 } else { |
2587 NoSafepointScope no_safepoint_scope; | 2591 NoSafepointScope no_safepoint_scope; |
2588 *peer = thread->isolate()->heap()->GetPeer(str.raw()); | 2592 *peer = thread->isolate()->heap()->GetPeer(str.raw()); |
2589 } | 2593 } |
2590 *char_size = str.CharSize(); | 2594 *char_size = str.CharSize(); |
2591 *str_len = str.Length(); | 2595 *str_len = str.Length(); |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2768 } | 2772 } |
2769 return Api::NewError("Object does not implement the 'List' interface"); | 2773 return Api::NewError("Object does not implement the 'List' interface"); |
2770 } | 2774 } |
2771 } | 2775 } |
2772 | 2776 |
2773 | 2777 |
2774 #define SET_LIST_ELEMENT(type, obj, index, value) \ | 2778 #define SET_LIST_ELEMENT(type, obj, index, value) \ |
2775 const type& array = type::Cast(obj); \ | 2779 const type& array = type::Cast(obj); \ |
2776 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); \ | 2780 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); \ |
2777 if (!value_obj.IsNull() && !value_obj.IsInstance()) { \ | 2781 if (!value_obj.IsNull() && !value_obj.IsInstance()) { \ |
2778 RETURN_TYPE_ERROR(I, value, Instance); \ | 2782 RETURN_TYPE_ERROR(Z, value, Instance); \ |
2779 } \ | 2783 } \ |
2780 if ((index >= 0) && (index < array.Length())) { \ | 2784 if ((index >= 0) && (index < array.Length())) { \ |
2781 array.SetAt(index, value_obj); \ | 2785 array.SetAt(index, value_obj); \ |
2782 return Api::Success(); \ | 2786 return Api::Success(); \ |
2783 } \ | 2787 } \ |
2784 return Api::NewError("Invalid index passed in to set list element"); \ | 2788 return Api::NewError("Invalid index passed in to set list element"); \ |
2785 | 2789 |
2786 | 2790 |
2787 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, | 2791 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, |
2788 intptr_t index, | 2792 intptr_t index, |
(...skipping 18 matching lines...) Expand all Loading... |
2807 ArgumentsDescriptor args_desc( | 2811 ArgumentsDescriptor args_desc( |
2808 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); | 2812 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); |
2809 const Function& function = Function::Handle(Z, | 2813 const Function& function = Function::Handle(Z, |
2810 Resolver::ResolveDynamic(instance, | 2814 Resolver::ResolveDynamic(instance, |
2811 Symbols::AssignIndexToken(), | 2815 Symbols::AssignIndexToken(), |
2812 args_desc)); | 2816 args_desc)); |
2813 if (!function.IsNull()) { | 2817 if (!function.IsNull()) { |
2814 const Integer& index_obj = Integer::Handle(Z, Integer::New(index)); | 2818 const Integer& index_obj = Integer::Handle(Z, Integer::New(index)); |
2815 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); | 2819 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); |
2816 if (!value_obj.IsNull() && !value_obj.IsInstance()) { | 2820 if (!value_obj.IsNull() && !value_obj.IsInstance()) { |
2817 RETURN_TYPE_ERROR(I, value, Instance); | 2821 RETURN_TYPE_ERROR(Z, value, Instance); |
2818 } | 2822 } |
2819 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); | 2823 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); |
2820 args.SetAt(0, instance); | 2824 args.SetAt(0, instance); |
2821 args.SetAt(1, index_obj); | 2825 args.SetAt(1, index_obj); |
2822 args.SetAt(2, value_obj); | 2826 args.SetAt(2, value_obj); |
2823 return Api::NewHandle(I, DartEntry::InvokeFunction(function, | 2827 return Api::NewHandle(I, DartEntry::InvokeFunction(function, |
2824 args)); | 2828 args)); |
2825 } | 2829 } |
2826 } | 2830 } |
2827 return Api::NewError("Object does not implement the 'List' interface"); | 2831 return Api::NewError("Object does not implement the 'List' interface"); |
2828 } | 2832 } |
2829 } | 2833 } |
2830 | 2834 |
2831 | 2835 |
2832 static RawObject* ResolveConstructor(const char* current_func, | 2836 static RawObject* ResolveConstructor(const char* current_func, |
2833 const Class& cls, | 2837 const Class& cls, |
2834 const String& class_name, | 2838 const String& class_name, |
2835 const String& dotted_name, | 2839 const String& dotted_name, |
2836 int num_args); | 2840 int num_args); |
2837 | 2841 |
2838 | 2842 |
2839 static RawObject* ThrowArgumentError(const char* exception_message) { | 2843 static RawObject* ThrowArgumentError(const char* exception_message) { |
2840 Thread* thread = Thread::Current(); | 2844 Thread* thread = Thread::Current(); |
2841 Isolate* isolate = thread->isolate(); | 2845 Isolate* isolate = thread->isolate(); |
| 2846 Zone* zone = thread->zone(); |
2842 // Lookup the class ArgumentError in dart:core. | 2847 // Lookup the class ArgumentError in dart:core. |
2843 const String& lib_url = String::Handle(String::New("dart:core")); | 2848 const String& lib_url = String::Handle(String::New("dart:core")); |
2844 const String& class_name = String::Handle(String::New("ArgumentError")); | 2849 const String& class_name = String::Handle(String::New("ArgumentError")); |
2845 const Library& lib = | 2850 const Library& lib = |
2846 Library::Handle(isolate, Library::LookupLibrary(lib_url)); | 2851 Library::Handle(zone, Library::LookupLibrary(lib_url)); |
2847 if (lib.IsNull()) { | 2852 if (lib.IsNull()) { |
2848 const String& message = String::Handle( | 2853 const String& message = String::Handle( |
2849 String::NewFormatted("%s: library '%s' not found.", | 2854 String::NewFormatted("%s: library '%s' not found.", |
2850 CURRENT_FUNC, lib_url.ToCString())); | 2855 CURRENT_FUNC, lib_url.ToCString())); |
2851 return ApiError::New(message); | 2856 return ApiError::New(message); |
2852 } | 2857 } |
2853 const Class& cls = Class::Handle( | 2858 const Class& cls = Class::Handle( |
2854 isolate, lib.LookupClassAllowPrivate(class_name)); | 2859 zone, lib.LookupClassAllowPrivate(class_name)); |
2855 ASSERT(!cls.IsNull()); | 2860 ASSERT(!cls.IsNull()); |
2856 Object& result = Object::Handle(isolate); | 2861 Object& result = Object::Handle(zone); |
2857 String& dot_name = String::Handle(String::New(".")); | 2862 String& dot_name = String::Handle(String::New(".")); |
2858 String& constr_name = String::Handle(String::Concat(class_name, dot_name)); | 2863 String& constr_name = String::Handle(String::Concat(class_name, dot_name)); |
2859 result = ResolveConstructor(CURRENT_FUNC, cls, class_name, constr_name, 1); | 2864 result = ResolveConstructor(CURRENT_FUNC, cls, class_name, constr_name, 1); |
2860 if (result.IsError()) return result.raw(); | 2865 if (result.IsError()) return result.raw(); |
2861 ASSERT(result.IsFunction()); | 2866 ASSERT(result.IsFunction()); |
2862 Function& constructor = Function::Handle(isolate); | 2867 Function& constructor = Function::Handle(zone); |
2863 constructor ^= result.raw(); | 2868 constructor ^= result.raw(); |
2864 if (!constructor.IsGenerativeConstructor()) { | 2869 if (!constructor.IsGenerativeConstructor()) { |
2865 const String& message = String::Handle( | 2870 const String& message = String::Handle( |
2866 String::NewFormatted("%s: class '%s' is not a constructor.", | 2871 String::NewFormatted("%s: class '%s' is not a constructor.", |
2867 CURRENT_FUNC, class_name.ToCString())); | 2872 CURRENT_FUNC, class_name.ToCString())); |
2868 return ApiError::New(message); | 2873 return ApiError::New(message); |
2869 } | 2874 } |
2870 Instance& exception = Instance::Handle(isolate); | 2875 Instance& exception = Instance::Handle(zone); |
2871 exception = Instance::New(cls); | 2876 exception = Instance::New(cls); |
2872 const Array& args = Array::Handle(isolate, Array::New(3)); | 2877 const Array& args = Array::Handle(zone, Array::New(3)); |
2873 args.SetAt(0, exception); | 2878 args.SetAt(0, exception); |
2874 args.SetAt(1, | 2879 args.SetAt(1, Smi::Handle(zone, Smi::New(Function::kCtorPhaseAll))); |
2875 Smi::Handle(isolate, Smi::New(Function::kCtorPhaseAll))); | |
2876 args.SetAt(2, String::Handle(String::New(exception_message))); | 2880 args.SetAt(2, String::Handle(String::New(exception_message))); |
2877 result = DartEntry::InvokeFunction(constructor, args); | 2881 result = DartEntry::InvokeFunction(constructor, args); |
2878 if (result.IsError()) return result.raw(); | 2882 if (result.IsError()) return result.raw(); |
2879 ASSERT(result.IsNull()); | 2883 ASSERT(result.IsNull()); |
2880 | 2884 |
2881 if (isolate->top_exit_frame_info() == 0) { | 2885 if (isolate->top_exit_frame_info() == 0) { |
2882 // There are no dart frames on the stack so it would be illegal to | 2886 // There are no dart frames on the stack so it would be illegal to |
2883 // throw an exception here. | 2887 // throw an exception here. |
2884 const String& message = String::Handle( | 2888 const String& message = String::Handle( |
2885 String::New("No Dart frames on stack, cannot throw exception")); | 2889 String::New("No Dart frames on stack, cannot throw exception")); |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3261 | 3265 |
3262 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData( | 3266 DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData( |
3263 Dart_Handle object) { | 3267 Dart_Handle object) { |
3264 TRACE_API_CALL(CURRENT_FUNC); | 3268 TRACE_API_CALL(CURRENT_FUNC); |
3265 intptr_t class_id = Api::ClassId(object); | 3269 intptr_t class_id = Api::ClassId(object); |
3266 if (RawObject::IsExternalTypedDataClassId(class_id)) { | 3270 if (RawObject::IsExternalTypedDataClassId(class_id)) { |
3267 return GetType(class_id); | 3271 return GetType(class_id); |
3268 } | 3272 } |
3269 if (RawObject::IsTypedDataViewClassId(class_id)) { | 3273 if (RawObject::IsTypedDataViewClassId(class_id)) { |
3270 // Check if data object of the view is external. | 3274 // Check if data object of the view is external. |
3271 Isolate* isolate = Isolate::Current(); | 3275 Zone* zone = Thread::Current()->zone(); |
3272 const Instance& view_obj = Api::UnwrapInstanceHandle(isolate, object); | 3276 const Instance& view_obj = Api::UnwrapInstanceHandle(zone, object); |
3273 ASSERT(!view_obj.IsNull()); | 3277 ASSERT(!view_obj.IsNull()); |
3274 const Instance& data_obj = | 3278 const Instance& data_obj = |
3275 Instance::Handle(isolate, TypedDataView::Data(view_obj)); | 3279 Instance::Handle(zone, TypedDataView::Data(view_obj)); |
3276 if (ExternalTypedData::IsExternalTypedData(data_obj)) { | 3280 if (ExternalTypedData::IsExternalTypedData(data_obj)) { |
3277 return GetType(class_id); | 3281 return GetType(class_id); |
3278 } | 3282 } |
3279 } | 3283 } |
3280 return Dart_TypedData_kInvalid; | 3284 return Dart_TypedData_kInvalid; |
3281 } | 3285 } |
3282 | 3286 |
3283 | 3287 |
3284 static RawObject* GetByteDataConstructor(Isolate* isolate, | 3288 static RawObject* GetByteDataConstructor(Thread* thread, |
3285 const String& constructor_name, | 3289 const String& constructor_name, |
3286 intptr_t num_args) { | 3290 intptr_t num_args) { |
3287 const Library& lib = | 3291 const Library& lib = |
3288 Library::Handle(isolate->object_store()->typed_data_library()); | 3292 Library::Handle(thread->isolate()->object_store()->typed_data_library()); |
3289 ASSERT(!lib.IsNull()); | 3293 ASSERT(!lib.IsNull()); |
3290 const Class& cls = Class::Handle( | 3294 const Class& cls = Class::Handle( |
3291 isolate, lib.LookupClassAllowPrivate(Symbols::ByteData())); | 3295 thread->zone(), lib.LookupClassAllowPrivate(Symbols::ByteData())); |
3292 ASSERT(!cls.IsNull()); | 3296 ASSERT(!cls.IsNull()); |
3293 return ResolveConstructor(CURRENT_FUNC, | 3297 return ResolveConstructor(CURRENT_FUNC, |
3294 cls, | 3298 cls, |
3295 Symbols::ByteData(), | 3299 Symbols::ByteData(), |
3296 constructor_name, | 3300 constructor_name, |
3297 num_args); | 3301 num_args); |
3298 } | 3302 } |
3299 | 3303 |
3300 | 3304 |
3301 static Dart_Handle NewByteData(Isolate* isolate, intptr_t length) { | 3305 static Dart_Handle NewByteData(Thread* thread, intptr_t length) { |
3302 CHECK_LENGTH(length, TypedData::MaxElements(kTypedDataInt8ArrayCid)); | 3306 CHECK_LENGTH(length, TypedData::MaxElements(kTypedDataInt8ArrayCid)); |
3303 Object& result = Object::Handle(isolate); | 3307 Isolate* isolate = thread->isolate(); |
3304 result = GetByteDataConstructor(isolate, Symbols::ByteDataDot(), 1); | 3308 Zone* zone = thread->zone(); |
| 3309 Object& result = Object::Handle(zone); |
| 3310 result = GetByteDataConstructor(thread, Symbols::ByteDataDot(), 1); |
3305 ASSERT(!result.IsNull()); | 3311 ASSERT(!result.IsNull()); |
3306 ASSERT(result.IsFunction()); | 3312 ASSERT(result.IsFunction()); |
3307 const Function& factory = Function::Cast(result); | 3313 const Function& factory = Function::Cast(result); |
3308 ASSERT(!factory.IsGenerativeConstructor()); | 3314 ASSERT(!factory.IsGenerativeConstructor()); |
3309 | 3315 |
3310 // Create the argument list. | 3316 // Create the argument list. |
3311 const Array& args = Array::Handle(isolate, Array::New(2)); | 3317 const Array& args = Array::Handle(zone, Array::New(2)); |
3312 // Factories get type arguments. | 3318 // Factories get type arguments. |
3313 args.SetAt(0, Object::null_type_arguments()); | 3319 args.SetAt(0, Object::null_type_arguments()); |
3314 args.SetAt(1, Smi::Handle(isolate, Smi::New(length))); | 3320 args.SetAt(1, Smi::Handle(zone, Smi::New(length))); |
3315 | 3321 |
3316 // Invoke the constructor and return the new object. | 3322 // Invoke the constructor and return the new object. |
3317 result = DartEntry::InvokeFunction(factory, args); | 3323 result = DartEntry::InvokeFunction(factory, args); |
3318 ASSERT(result.IsInstance() || result.IsNull() || result.IsError()); | 3324 ASSERT(result.IsInstance() || result.IsNull() || result.IsError()); |
3319 return Api::NewHandle(isolate, result.raw()); | 3325 return Api::NewHandle(isolate, result.raw()); |
3320 } | 3326 } |
3321 | 3327 |
3322 | 3328 |
3323 static Dart_Handle NewTypedData(Isolate* isolate, | 3329 static Dart_Handle NewTypedData(Isolate* isolate, |
3324 intptr_t cid, | 3330 intptr_t cid, |
3325 intptr_t length) { | 3331 intptr_t length) { |
3326 CHECK_LENGTH(length, TypedData::MaxElements(cid)); | 3332 CHECK_LENGTH(length, TypedData::MaxElements(cid)); |
3327 return Api::NewHandle(isolate, TypedData::New(cid, length)); | 3333 return Api::NewHandle(isolate, TypedData::New(cid, length)); |
3328 } | 3334 } |
3329 | 3335 |
3330 | 3336 |
3331 static Dart_Handle NewExternalTypedData( | 3337 static Dart_Handle NewExternalTypedData( |
3332 Isolate* isolate, intptr_t cid, void* data, intptr_t length) { | 3338 Thread* thread, intptr_t cid, void* data, intptr_t length) { |
3333 CHECK_LENGTH(length, ExternalTypedData::MaxElements(cid)); | 3339 CHECK_LENGTH(length, ExternalTypedData::MaxElements(cid)); |
| 3340 Isolate* isolate = thread->isolate(); |
| 3341 Zone* zone = thread->zone(); |
3334 intptr_t bytes = length * ExternalTypedData::ElementSizeInBytes(cid); | 3342 intptr_t bytes = length * ExternalTypedData::ElementSizeInBytes(cid); |
3335 const ExternalTypedData& result = ExternalTypedData::Handle( | 3343 const ExternalTypedData& result = ExternalTypedData::Handle( |
3336 isolate, | 3344 zone, |
3337 ExternalTypedData::New(cid, | 3345 ExternalTypedData::New(cid, |
3338 reinterpret_cast<uint8_t*>(data), | 3346 reinterpret_cast<uint8_t*>(data), |
3339 length, | 3347 length, |
3340 SpaceForExternal(isolate, bytes))); | 3348 SpaceForExternal(isolate, bytes))); |
3341 return Api::NewHandle(isolate, result.raw()); | 3349 return Api::NewHandle(isolate, result.raw()); |
3342 } | 3350 } |
3343 | 3351 |
3344 | 3352 |
3345 static Dart_Handle NewExternalByteData( | 3353 static Dart_Handle NewExternalByteData( |
3346 Isolate* isolate, void* data, intptr_t length) { | 3354 Thread* thread, void* data, intptr_t length) { |
| 3355 Zone* zone = thread->zone(); |
| 3356 Isolate* isolate = thread->isolate(); |
3347 Dart_Handle ext_data = NewExternalTypedData( | 3357 Dart_Handle ext_data = NewExternalTypedData( |
3348 isolate, kExternalTypedDataUint8ArrayCid, data, length); | 3358 thread, kExternalTypedDataUint8ArrayCid, data, length); |
3349 if (::Dart_IsError(ext_data)) { | 3359 if (::Dart_IsError(ext_data)) { |
3350 return ext_data; | 3360 return ext_data; |
3351 } | 3361 } |
3352 Object& result = Object::Handle(isolate); | 3362 Object& result = Object::Handle(zone); |
3353 result = GetByteDataConstructor(isolate, Symbols::ByteDataDot_view(), 3); | 3363 result = GetByteDataConstructor(thread, Symbols::ByteDataDot_view(), 3); |
3354 ASSERT(!result.IsNull()); | 3364 ASSERT(!result.IsNull()); |
3355 ASSERT(result.IsFunction()); | 3365 ASSERT(result.IsFunction()); |
3356 const Function& factory = Function::Cast(result); | 3366 const Function& factory = Function::Cast(result); |
3357 ASSERT(!factory.IsGenerativeConstructor()); | 3367 ASSERT(!factory.IsGenerativeConstructor()); |
3358 | 3368 |
3359 // Create the argument list. | 3369 // Create the argument list. |
3360 const intptr_t num_args = 3; | 3370 const intptr_t num_args = 3; |
3361 const Array& args = Array::Handle(isolate, Array::New(num_args + 1)); | 3371 const Array& args = Array::Handle(zone, Array::New(num_args + 1)); |
3362 // Factories get type arguments. | 3372 // Factories get type arguments. |
3363 args.SetAt(0, Object::null_type_arguments()); | 3373 args.SetAt(0, Object::null_type_arguments()); |
3364 const ExternalTypedData& array = | 3374 const ExternalTypedData& array = |
3365 Api::UnwrapExternalTypedDataHandle(isolate, ext_data); | 3375 Api::UnwrapExternalTypedDataHandle(zone, ext_data); |
3366 args.SetAt(1, array); | 3376 args.SetAt(1, array); |
3367 Smi& smi = Smi::Handle(isolate); | 3377 Smi& smi = Smi::Handle(zone); |
3368 smi = Smi::New(0); | 3378 smi = Smi::New(0); |
3369 args.SetAt(2, smi); | 3379 args.SetAt(2, smi); |
3370 smi = Smi::New(length); | 3380 smi = Smi::New(length); |
3371 args.SetAt(3, smi); | 3381 args.SetAt(3, smi); |
3372 | 3382 |
3373 // Invoke the constructor and return the new object. | 3383 // Invoke the constructor and return the new object. |
3374 result = DartEntry::InvokeFunction(factory, args); | 3384 result = DartEntry::InvokeFunction(factory, args); |
3375 ASSERT(result.IsNull() || result.IsInstance() || result.IsError()); | 3385 ASSERT(result.IsNull() || result.IsInstance() || result.IsError()); |
3376 return Api::NewHandle(isolate, result.raw()); | 3386 return Api::NewHandle(isolate, result.raw()); |
3377 } | 3387 } |
3378 | 3388 |
3379 | 3389 |
3380 DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type, | 3390 DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type, |
3381 intptr_t length) { | 3391 intptr_t length) { |
3382 DARTSCOPE(Thread::Current()); | 3392 DARTSCOPE(Thread::Current()); |
3383 CHECK_CALLBACK_STATE(I); | 3393 CHECK_CALLBACK_STATE(I); |
3384 switch (type) { | 3394 switch (type) { |
3385 case Dart_TypedData_kByteData : | 3395 case Dart_TypedData_kByteData : |
3386 return NewByteData(I, length); | 3396 return NewByteData(T, length); |
3387 case Dart_TypedData_kInt8 : | 3397 case Dart_TypedData_kInt8 : |
3388 return NewTypedData(I, kTypedDataInt8ArrayCid, length); | 3398 return NewTypedData(I, kTypedDataInt8ArrayCid, length); |
3389 case Dart_TypedData_kUint8 : | 3399 case Dart_TypedData_kUint8 : |
3390 return NewTypedData(I, kTypedDataUint8ArrayCid, length); | 3400 return NewTypedData(I, kTypedDataUint8ArrayCid, length); |
3391 case Dart_TypedData_kUint8Clamped : | 3401 case Dart_TypedData_kUint8Clamped : |
3392 return NewTypedData(I, kTypedDataUint8ClampedArrayCid, length); | 3402 return NewTypedData(I, kTypedDataUint8ClampedArrayCid, length); |
3393 case Dart_TypedData_kInt16 : | 3403 case Dart_TypedData_kInt16 : |
3394 return NewTypedData(I, kTypedDataInt16ArrayCid, length); | 3404 return NewTypedData(I, kTypedDataInt16ArrayCid, length); |
3395 case Dart_TypedData_kUint16 : | 3405 case Dart_TypedData_kUint16 : |
3396 return NewTypedData(I, kTypedDataUint16ArrayCid, length); | 3406 return NewTypedData(I, kTypedDataUint16ArrayCid, length); |
(...skipping 24 matching lines...) Expand all Loading... |
3421 Dart_TypedData_Type type, | 3431 Dart_TypedData_Type type, |
3422 void* data, | 3432 void* data, |
3423 intptr_t length) { | 3433 intptr_t length) { |
3424 DARTSCOPE(Thread::Current()); | 3434 DARTSCOPE(Thread::Current()); |
3425 if (data == NULL && length != 0) { | 3435 if (data == NULL && length != 0) { |
3426 RETURN_NULL_ERROR(data); | 3436 RETURN_NULL_ERROR(data); |
3427 } | 3437 } |
3428 CHECK_CALLBACK_STATE(I); | 3438 CHECK_CALLBACK_STATE(I); |
3429 switch (type) { | 3439 switch (type) { |
3430 case Dart_TypedData_kByteData: | 3440 case Dart_TypedData_kByteData: |
3431 return NewExternalByteData(I, data, length); | 3441 return NewExternalByteData(T, data, length); |
3432 case Dart_TypedData_kInt8: | 3442 case Dart_TypedData_kInt8: |
3433 return NewExternalTypedData(I, | 3443 return NewExternalTypedData(T, |
3434 kExternalTypedDataInt8ArrayCid, data, length); | 3444 kExternalTypedDataInt8ArrayCid, data, length); |
3435 case Dart_TypedData_kUint8: | 3445 case Dart_TypedData_kUint8: |
3436 return NewExternalTypedData(I, | 3446 return NewExternalTypedData(T, |
3437 kExternalTypedDataUint8ArrayCid, data, length); | 3447 kExternalTypedDataUint8ArrayCid, data, length); |
3438 case Dart_TypedData_kUint8Clamped: | 3448 case Dart_TypedData_kUint8Clamped: |
3439 return NewExternalTypedData(I, | 3449 return NewExternalTypedData(T, |
3440 kExternalTypedDataUint8ClampedArrayCid, data, length); | 3450 kExternalTypedDataUint8ClampedArrayCid, data, length); |
3441 case Dart_TypedData_kInt16: | 3451 case Dart_TypedData_kInt16: |
3442 return NewExternalTypedData(I, | 3452 return NewExternalTypedData(T, |
3443 kExternalTypedDataInt16ArrayCid, data, length); | 3453 kExternalTypedDataInt16ArrayCid, data, length); |
3444 case Dart_TypedData_kUint16: | 3454 case Dart_TypedData_kUint16: |
3445 return NewExternalTypedData(I, | 3455 return NewExternalTypedData(T, |
3446 kExternalTypedDataUint16ArrayCid, data, length); | 3456 kExternalTypedDataUint16ArrayCid, data, length); |
3447 case Dart_TypedData_kInt32: | 3457 case Dart_TypedData_kInt32: |
3448 return NewExternalTypedData(I, | 3458 return NewExternalTypedData(T, |
3449 kExternalTypedDataInt32ArrayCid, data, length); | 3459 kExternalTypedDataInt32ArrayCid, data, length); |
3450 case Dart_TypedData_kUint32: | 3460 case Dart_TypedData_kUint32: |
3451 return NewExternalTypedData(I, | 3461 return NewExternalTypedData(T, |
3452 kExternalTypedDataUint32ArrayCid, data, length); | 3462 kExternalTypedDataUint32ArrayCid, data, length); |
3453 case Dart_TypedData_kInt64: | 3463 case Dart_TypedData_kInt64: |
3454 return NewExternalTypedData(I, | 3464 return NewExternalTypedData(T, |
3455 kExternalTypedDataInt64ArrayCid, data, length); | 3465 kExternalTypedDataInt64ArrayCid, data, length); |
3456 case Dart_TypedData_kUint64: | 3466 case Dart_TypedData_kUint64: |
3457 return NewExternalTypedData(I, | 3467 return NewExternalTypedData(T, |
3458 kExternalTypedDataUint64ArrayCid, data, length); | 3468 kExternalTypedDataUint64ArrayCid, data, length); |
3459 case Dart_TypedData_kFloat32: | 3469 case Dart_TypedData_kFloat32: |
3460 return NewExternalTypedData(I, | 3470 return NewExternalTypedData(T, |
3461 kExternalTypedDataFloat32ArrayCid, data, length); | 3471 kExternalTypedDataFloat32ArrayCid, data, length); |
3462 case Dart_TypedData_kFloat64: | 3472 case Dart_TypedData_kFloat64: |
3463 return NewExternalTypedData(I, | 3473 return NewExternalTypedData(T, |
3464 kExternalTypedDataFloat64ArrayCid, data, length); | 3474 kExternalTypedDataFloat64ArrayCid, data, length); |
3465 case Dart_TypedData_kFloat32x4: | 3475 case Dart_TypedData_kFloat32x4: |
3466 return NewExternalTypedData(I, | 3476 return NewExternalTypedData(T, |
3467 kExternalTypedDataFloat32x4ArrayCid, data, length); | 3477 kExternalTypedDataFloat32x4ArrayCid, data, length); |
3468 default: | 3478 default: |
3469 return Api::NewError("%s expects argument 'type' to be of" | 3479 return Api::NewError("%s expects argument 'type' to be of" |
3470 " 'external TypedData'", CURRENT_FUNC); | 3480 " 'external TypedData'", CURRENT_FUNC); |
3471 } | 3481 } |
3472 UNREACHABLE(); | 3482 UNREACHABLE(); |
3473 return Api::Null(); | 3483 return Api::Null(); |
3474 } | 3484 } |
3475 | 3485 |
3476 | 3486 |
3477 static RawObject* GetByteBufferConstructor(Isolate* isolate, | 3487 static RawObject* GetByteBufferConstructor(Thread* thread, |
3478 const String& class_name, | 3488 const String& class_name, |
3479 const String& constructor_name, | 3489 const String& constructor_name, |
3480 intptr_t num_args) { | 3490 intptr_t num_args) { |
3481 const Library& lib = | 3491 const Library& lib = |
3482 Library::Handle(isolate->object_store()->typed_data_library()); | 3492 Library::Handle(thread->isolate()->object_store()->typed_data_library()); |
3483 ASSERT(!lib.IsNull()); | 3493 ASSERT(!lib.IsNull()); |
3484 const Class& cls = Class::Handle( | 3494 const Class& cls = Class::Handle( |
3485 isolate, lib.LookupClassAllowPrivate(class_name)); | 3495 thread->zone(), lib.LookupClassAllowPrivate(class_name)); |
3486 ASSERT(!cls.IsNull()); | 3496 ASSERT(!cls.IsNull()); |
3487 return ResolveConstructor(CURRENT_FUNC, | 3497 return ResolveConstructor(CURRENT_FUNC, |
3488 cls, | 3498 cls, |
3489 class_name, | 3499 class_name, |
3490 constructor_name, | 3500 constructor_name, |
3491 num_args); | 3501 num_args); |
3492 } | 3502 } |
3493 | 3503 |
3494 | 3504 |
3495 DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data) { | 3505 DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data) { |
3496 DARTSCOPE(Thread::Current()); | 3506 DARTSCOPE(Thread::Current()); |
3497 intptr_t class_id = Api::ClassId(typed_data); | 3507 intptr_t class_id = Api::ClassId(typed_data); |
3498 if (!RawObject::IsExternalTypedDataClassId(class_id) && | 3508 if (!RawObject::IsExternalTypedDataClassId(class_id) && |
3499 !RawObject::IsTypedDataViewClassId(class_id) && | 3509 !RawObject::IsTypedDataViewClassId(class_id) && |
3500 !RawObject::IsTypedDataClassId(class_id)) { | 3510 !RawObject::IsTypedDataClassId(class_id)) { |
3501 RETURN_TYPE_ERROR(I, typed_data, 'TypedData'); | 3511 RETURN_TYPE_ERROR(Z, typed_data, 'TypedData'); |
3502 } | 3512 } |
3503 Object& result = Object::Handle(Z); | 3513 Object& result = Object::Handle(Z); |
3504 result = GetByteBufferConstructor(I, | 3514 result = GetByteBufferConstructor(T, |
3505 Symbols::_ByteBuffer(), | 3515 Symbols::_ByteBuffer(), |
3506 Symbols::_ByteBufferDot_New(), | 3516 Symbols::_ByteBufferDot_New(), |
3507 1); | 3517 1); |
3508 ASSERT(!result.IsNull()); | 3518 ASSERT(!result.IsNull()); |
3509 ASSERT(result.IsFunction()); | 3519 ASSERT(result.IsFunction()); |
3510 const Function& factory = Function::Cast(result); | 3520 const Function& factory = Function::Cast(result); |
3511 ASSERT(!factory.IsGenerativeConstructor()); | 3521 ASSERT(!factory.IsGenerativeConstructor()); |
3512 | 3522 |
3513 // Create the argument list. | 3523 // Create the argument list. |
3514 const Array& args = Array::Handle(Z, Array::New(2)); | 3524 const Array& args = Array::Handle(Z, Array::New(2)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3559 | 3569 |
3560 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, | 3570 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, |
3561 Dart_TypedData_Type* type, | 3571 Dart_TypedData_Type* type, |
3562 void** data, | 3572 void** data, |
3563 intptr_t* len) { | 3573 intptr_t* len) { |
3564 DARTSCOPE(Thread::Current()); | 3574 DARTSCOPE(Thread::Current()); |
3565 intptr_t class_id = Api::ClassId(object); | 3575 intptr_t class_id = Api::ClassId(object); |
3566 if (!RawObject::IsExternalTypedDataClassId(class_id) && | 3576 if (!RawObject::IsExternalTypedDataClassId(class_id) && |
3567 !RawObject::IsTypedDataViewClassId(class_id) && | 3577 !RawObject::IsTypedDataViewClassId(class_id) && |
3568 !RawObject::IsTypedDataClassId(class_id)) { | 3578 !RawObject::IsTypedDataClassId(class_id)) { |
3569 RETURN_TYPE_ERROR(I, object, 'TypedData'); | 3579 RETURN_TYPE_ERROR(Z, object, 'TypedData'); |
3570 } | 3580 } |
3571 if (type == NULL) { | 3581 if (type == NULL) { |
3572 RETURN_NULL_ERROR(type); | 3582 RETURN_NULL_ERROR(type); |
3573 } | 3583 } |
3574 if (data == NULL) { | 3584 if (data == NULL) { |
3575 RETURN_NULL_ERROR(data); | 3585 RETURN_NULL_ERROR(data); |
3576 } | 3586 } |
3577 if (len == NULL) { | 3587 if (len == NULL) { |
3578 RETURN_NULL_ERROR(len); | 3588 RETURN_NULL_ERROR(len); |
3579 } | 3589 } |
3580 // Get the type of typed data object. | 3590 // Get the type of typed data object. |
3581 *type = GetType(class_id); | 3591 *type = GetType(class_id); |
3582 intptr_t length = 0; | 3592 intptr_t length = 0; |
3583 intptr_t size_in_bytes = 0; | 3593 intptr_t size_in_bytes = 0; |
3584 void* data_tmp = NULL; | 3594 void* data_tmp = NULL; |
3585 bool external = false; | 3595 bool external = false; |
3586 // If it is an external typed data object just return the data field. | 3596 // If it is an external typed data object just return the data field. |
3587 if (RawObject::IsExternalTypedDataClassId(class_id)) { | 3597 if (RawObject::IsExternalTypedDataClassId(class_id)) { |
3588 const ExternalTypedData& obj = | 3598 const ExternalTypedData& obj = |
3589 Api::UnwrapExternalTypedDataHandle(I, object); | 3599 Api::UnwrapExternalTypedDataHandle(Z, object); |
3590 ASSERT(!obj.IsNull()); | 3600 ASSERT(!obj.IsNull()); |
3591 length = obj.Length(); | 3601 length = obj.Length(); |
3592 size_in_bytes = length * ExternalTypedData::ElementSizeInBytes(class_id); | 3602 size_in_bytes = length * ExternalTypedData::ElementSizeInBytes(class_id); |
3593 data_tmp = obj.DataAddr(0); | 3603 data_tmp = obj.DataAddr(0); |
3594 external = true; | 3604 external = true; |
3595 } else if (RawObject::IsTypedDataClassId(class_id)) { | 3605 } else if (RawObject::IsTypedDataClassId(class_id)) { |
3596 // Regular typed data object, set up some GC and API callback guards. | 3606 // Regular typed data object, set up some GC and API callback guards. |
3597 const TypedData& obj = Api::UnwrapTypedDataHandle(I, object); | 3607 const TypedData& obj = Api::UnwrapTypedDataHandle(Z, object); |
3598 ASSERT(!obj.IsNull()); | 3608 ASSERT(!obj.IsNull()); |
3599 length = obj.Length(); | 3609 length = obj.Length(); |
3600 size_in_bytes = length * TypedData::ElementSizeInBytes(class_id); | 3610 size_in_bytes = length * TypedData::ElementSizeInBytes(class_id); |
3601 T->IncrementNoSafepointScopeDepth(); | 3611 T->IncrementNoSafepointScopeDepth(); |
3602 START_NO_CALLBACK_SCOPE(I); | 3612 START_NO_CALLBACK_SCOPE(I); |
3603 data_tmp = obj.DataAddr(0); | 3613 data_tmp = obj.DataAddr(0); |
3604 } else { | 3614 } else { |
3605 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); | 3615 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); |
3606 const Instance& view_obj = Api::UnwrapInstanceHandle(I, object); | 3616 const Instance& view_obj = Api::UnwrapInstanceHandle(Z, object); |
3607 ASSERT(!view_obj.IsNull()); | 3617 ASSERT(!view_obj.IsNull()); |
3608 Smi& val = Smi::Handle(); | 3618 Smi& val = Smi::Handle(); |
3609 val ^= TypedDataView::Length(view_obj); | 3619 val ^= TypedDataView::Length(view_obj); |
3610 length = val.Value(); | 3620 length = val.Value(); |
3611 size_in_bytes = length * TypedDataView::ElementSizeInBytes(class_id); | 3621 size_in_bytes = length * TypedDataView::ElementSizeInBytes(class_id); |
3612 val ^= TypedDataView::OffsetInBytes(view_obj); | 3622 val ^= TypedDataView::OffsetInBytes(view_obj); |
3613 intptr_t offset_in_bytes = val.Value(); | 3623 intptr_t offset_in_bytes = val.Value(); |
3614 const Instance& obj = Instance::Handle(TypedDataView::Data(view_obj)); | 3624 const Instance& obj = Instance::Handle(TypedDataView::Data(view_obj)); |
3615 T->IncrementNoSafepointScopeDepth(); | 3625 T->IncrementNoSafepointScopeDepth(); |
3616 START_NO_CALLBACK_SCOPE(I); | 3626 START_NO_CALLBACK_SCOPE(I); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3648 return Api::Success(); | 3658 return Api::Success(); |
3649 } | 3659 } |
3650 | 3660 |
3651 | 3661 |
3652 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) { | 3662 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object) { |
3653 DARTSCOPE(Thread::Current()); | 3663 DARTSCOPE(Thread::Current()); |
3654 intptr_t class_id = Api::ClassId(object); | 3664 intptr_t class_id = Api::ClassId(object); |
3655 if (!RawObject::IsExternalTypedDataClassId(class_id) && | 3665 if (!RawObject::IsExternalTypedDataClassId(class_id) && |
3656 !RawObject::IsTypedDataViewClassId(class_id) && | 3666 !RawObject::IsTypedDataViewClassId(class_id) && |
3657 !RawObject::IsTypedDataClassId(class_id)) { | 3667 !RawObject::IsTypedDataClassId(class_id)) { |
3658 RETURN_TYPE_ERROR(I, object, 'TypedData'); | 3668 RETURN_TYPE_ERROR(Z, object, 'TypedData'); |
3659 } | 3669 } |
3660 if (!RawObject::IsExternalTypedDataClassId(class_id)) { | 3670 if (!RawObject::IsExternalTypedDataClassId(class_id)) { |
3661 T->DecrementNoSafepointScopeDepth(); | 3671 T->DecrementNoSafepointScopeDepth(); |
3662 END_NO_CALLBACK_SCOPE(I); | 3672 END_NO_CALLBACK_SCOPE(I); |
3663 } | 3673 } |
3664 if (FLAG_verify_acquired_data) { | 3674 if (FLAG_verify_acquired_data) { |
3665 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object)); | 3675 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object)); |
3666 WeakTable* table = I->api_state()->acquired_table(); | 3676 WeakTable* table = I->api_state()->acquired_table(); |
3667 intptr_t current = table->GetValue(obj.raw()); | 3677 intptr_t current = table->GetValue(obj.raw()); |
3668 if (current == 0) { | 3678 if (current == 0) { |
3669 return Api::NewError("Data was not acquired for this object."); | 3679 return Api::NewError("Data was not acquired for this object."); |
3670 } | 3680 } |
3671 AcquiredData* ad = reinterpret_cast<AcquiredData*>(current); | 3681 AcquiredData* ad = reinterpret_cast<AcquiredData*>(current); |
3672 table->SetValue(obj.raw(), 0); // Delete entry from table. | 3682 table->SetValue(obj.raw(), 0); // Delete entry from table. |
3673 delete ad; | 3683 delete ad; |
3674 } | 3684 } |
3675 return Api::Success(); | 3685 return Api::Success(); |
3676 } | 3686 } |
3677 | 3687 |
3678 | 3688 |
3679 DART_EXPORT Dart_Handle Dart_GetDataFromByteBuffer(Dart_Handle object) { | 3689 DART_EXPORT Dart_Handle Dart_GetDataFromByteBuffer(Dart_Handle object) { |
3680 Isolate* isolate = Isolate::Current(); | 3690 Thread* thread = Thread::Current(); |
| 3691 Zone* zone = thread->zone(); |
| 3692 Isolate* isolate = thread->isolate(); |
3681 CHECK_ISOLATE(isolate); | 3693 CHECK_ISOLATE(isolate); |
3682 intptr_t class_id = Api::ClassId(object); | 3694 intptr_t class_id = Api::ClassId(object); |
3683 if (class_id != kByteBufferCid) { | 3695 if (class_id != kByteBufferCid) { |
3684 RETURN_TYPE_ERROR(isolate, object, 'ByteBuffer'); | 3696 RETURN_TYPE_ERROR(zone, object, 'ByteBuffer'); |
3685 } | 3697 } |
3686 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object); | 3698 const Instance& instance = Api::UnwrapInstanceHandle(zone, object); |
3687 ASSERT(!instance.IsNull()); | 3699 ASSERT(!instance.IsNull()); |
3688 return Api::NewHandle(isolate, ByteBuffer::Data(instance)); | 3700 return Api::NewHandle(isolate, ByteBuffer::Data(instance)); |
3689 } | 3701 } |
3690 | 3702 |
3691 | 3703 |
3692 // --- Invoking Constructors, Methods, and Field accessors --- | 3704 // --- Invoking Constructors, Methods, and Field accessors --- |
3693 | 3705 |
3694 static RawObject* ResolveConstructor(const char* current_func, | 3706 static RawObject* ResolveConstructor(const char* current_func, |
3695 const Class& cls, | 3707 const Class& cls, |
3696 const String& class_name, | 3708 const String& class_name, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3749 | 3761 |
3750 if (number_of_arguments < 0) { | 3762 if (number_of_arguments < 0) { |
3751 return Api::NewError( | 3763 return Api::NewError( |
3752 "%s expects argument 'number_of_arguments' to be non-negative.", | 3764 "%s expects argument 'number_of_arguments' to be non-negative.", |
3753 CURRENT_FUNC); | 3765 CURRENT_FUNC); |
3754 } | 3766 } |
3755 | 3767 |
3756 // Get the class to instantiate. | 3768 // Get the class to instantiate. |
3757 Object& unchecked_type = Object::Handle(Api::UnwrapHandle(type)); | 3769 Object& unchecked_type = Object::Handle(Api::UnwrapHandle(type)); |
3758 if (unchecked_type.IsNull() || !unchecked_type.IsType()) { | 3770 if (unchecked_type.IsNull() || !unchecked_type.IsType()) { |
3759 RETURN_TYPE_ERROR(I, type, Type); | 3771 RETURN_TYPE_ERROR(Z, type, Type); |
3760 } | 3772 } |
3761 Type& type_obj = Type::Handle(); | 3773 Type& type_obj = Type::Handle(); |
3762 type_obj ^= unchecked_type.raw(); | 3774 type_obj ^= unchecked_type.raw(); |
3763 if (!type_obj.IsFinalized()) { | 3775 if (!type_obj.IsFinalized()) { |
3764 return Api::NewError( | 3776 return Api::NewError( |
3765 "%s expects argument 'type' to be a fully resolved type.", | 3777 "%s expects argument 'type' to be a fully resolved type.", |
3766 CURRENT_FUNC); | 3778 CURRENT_FUNC); |
3767 } | 3779 } |
3768 Class& cls = Class::Handle(Z, type_obj.type_class()); | 3780 Class& cls = Class::Handle(Z, type_obj.type_class()); |
3769 TypeArguments& type_arguments = | 3781 TypeArguments& type_arguments = |
3770 TypeArguments::Handle(Z, type_obj.arguments()); | 3782 TypeArguments::Handle(Z, type_obj.arguments()); |
3771 | 3783 |
3772 const String& base_constructor_name = String::Handle(Z, cls.Name()); | 3784 const String& base_constructor_name = String::Handle(Z, cls.Name()); |
3773 | 3785 |
3774 // And get the name of the constructor to invoke. | 3786 // And get the name of the constructor to invoke. |
3775 String& dot_name = String::Handle(Z); | 3787 String& dot_name = String::Handle(Z); |
3776 result = Api::UnwrapHandle(constructor_name); | 3788 result = Api::UnwrapHandle(constructor_name); |
3777 if (result.IsNull()) { | 3789 if (result.IsNull()) { |
3778 dot_name = Symbols::Dot().raw(); | 3790 dot_name = Symbols::Dot().raw(); |
3779 } else if (result.IsString()) { | 3791 } else if (result.IsString()) { |
3780 dot_name = String::Concat(Symbols::Dot(), String::Cast(result)); | 3792 dot_name = String::Concat(Symbols::Dot(), String::Cast(result)); |
3781 } else { | 3793 } else { |
3782 RETURN_TYPE_ERROR(I, constructor_name, String); | 3794 RETURN_TYPE_ERROR(Z, constructor_name, String); |
3783 } | 3795 } |
3784 | 3796 |
3785 // Resolve the constructor. | 3797 // Resolve the constructor. |
3786 String& constr_name = | 3798 String& constr_name = |
3787 String::Handle(String::Concat(base_constructor_name, dot_name)); | 3799 String::Handle(String::Concat(base_constructor_name, dot_name)); |
3788 result = ResolveConstructor("Dart_New", | 3800 result = ResolveConstructor("Dart_New", |
3789 cls, | 3801 cls, |
3790 base_constructor_name, | 3802 base_constructor_name, |
3791 constr_name, | 3803 constr_name, |
3792 number_of_arguments); | 3804 number_of_arguments); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3872 if (constructor.IsGenerativeConstructor()) { | 3884 if (constructor.IsGenerativeConstructor()) { |
3873 ASSERT(result.IsNull()); | 3885 ASSERT(result.IsNull()); |
3874 } else { | 3886 } else { |
3875 ASSERT(result.IsNull() || result.IsInstance()); | 3887 ASSERT(result.IsNull() || result.IsInstance()); |
3876 new_object ^= result.raw(); | 3888 new_object ^= result.raw(); |
3877 } | 3889 } |
3878 return Api::NewHandle(I, new_object.raw()); | 3890 return Api::NewHandle(I, new_object.raw()); |
3879 } | 3891 } |
3880 | 3892 |
3881 | 3893 |
3882 static RawInstance* AllocateObject(Isolate* isolate, const Class& cls) { | 3894 static RawInstance* AllocateObject(Thread* thread, const Class& cls) { |
3883 if (!cls.is_fields_marked_nullable()) { | 3895 if (!cls.is_fields_marked_nullable()) { |
3884 // Mark all fields as nullable. | 3896 // Mark all fields as nullable. |
3885 Class& iterate_cls = Class::Handle(isolate, cls.raw()); | 3897 Zone* zone = thread->zone(); |
3886 Field& field = Field::Handle(isolate); | 3898 Class& iterate_cls = Class::Handle(zone, cls.raw()); |
3887 Array& fields = Array::Handle(isolate); | 3899 Field& field = Field::Handle(zone); |
| 3900 Array& fields = Array::Handle(zone); |
3888 while (!iterate_cls.IsNull()) { | 3901 while (!iterate_cls.IsNull()) { |
3889 ASSERT(iterate_cls.is_finalized()); | 3902 ASSERT(iterate_cls.is_finalized()); |
3890 iterate_cls.set_is_fields_marked_nullable(); | 3903 iterate_cls.set_is_fields_marked_nullable(); |
3891 fields = iterate_cls.fields(); | 3904 fields = iterate_cls.fields(); |
3892 iterate_cls = iterate_cls.SuperClass(); | 3905 iterate_cls = iterate_cls.SuperClass(); |
3893 for (int field_num = 0; field_num < fields.Length(); field_num++) { | 3906 for (int field_num = 0; field_num < fields.Length(); field_num++) { |
3894 field ^= fields.At(field_num); | 3907 field ^= fields.At(field_num); |
3895 if (field.is_static()) { | 3908 if (field.is_static()) { |
3896 continue; | 3909 continue; |
3897 } | 3910 } |
3898 field.RecordStore(Object::null_object()); | 3911 field.RecordStore(Object::null_object()); |
3899 } | 3912 } |
3900 } | 3913 } |
3901 } | 3914 } |
3902 | 3915 |
3903 // Allocate an object for the given class. | 3916 // Allocate an object for the given class. |
3904 return Instance::New(cls); | 3917 return Instance::New(cls); |
3905 } | 3918 } |
3906 | 3919 |
3907 | 3920 |
3908 DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) { | 3921 DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) { |
3909 DARTSCOPE(Thread::Current()); | 3922 DARTSCOPE(Thread::Current()); |
3910 CHECK_CALLBACK_STATE(I); | 3923 CHECK_CALLBACK_STATE(I); |
3911 | 3924 |
3912 const Type& type_obj = Api::UnwrapTypeHandle(I, type); | 3925 const Type& type_obj = Api::UnwrapTypeHandle(Z, type); |
3913 // Get the class to instantiate. | 3926 // Get the class to instantiate. |
3914 if (type_obj.IsNull()) { | 3927 if (type_obj.IsNull()) { |
3915 RETURN_TYPE_ERROR(I, type, Type); | 3928 RETURN_TYPE_ERROR(Z, type, Type); |
3916 } | 3929 } |
3917 const Class& cls = Class::Handle(Z, type_obj.type_class()); | 3930 const Class& cls = Class::Handle(Z, type_obj.type_class()); |
3918 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); | 3931 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); |
3919 if (!error.IsNull()) { | 3932 if (!error.IsNull()) { |
3920 // An error occurred, return error object. | 3933 // An error occurred, return error object. |
3921 return Api::NewHandle(I, error.raw()); | 3934 return Api::NewHandle(I, error.raw()); |
3922 } | 3935 } |
3923 return Api::NewHandle(I, AllocateObject(I, cls)); | 3936 return Api::NewHandle(I, AllocateObject(T, cls)); |
3924 } | 3937 } |
3925 | 3938 |
3926 | 3939 |
3927 DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields( | 3940 DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields( |
3928 Dart_Handle type, | 3941 Dart_Handle type, |
3929 intptr_t num_native_fields, | 3942 intptr_t num_native_fields, |
3930 const intptr_t* native_fields) { | 3943 const intptr_t* native_fields) { |
3931 DARTSCOPE(Thread::Current()); | 3944 DARTSCOPE(Thread::Current()); |
3932 CHECK_CALLBACK_STATE(I); | 3945 CHECK_CALLBACK_STATE(I); |
3933 | 3946 |
3934 const Type& type_obj = Api::UnwrapTypeHandle(I, type); | 3947 const Type& type_obj = Api::UnwrapTypeHandle(Z, type); |
3935 // Get the class to instantiate. | 3948 // Get the class to instantiate. |
3936 if (type_obj.IsNull()) { | 3949 if (type_obj.IsNull()) { |
3937 RETURN_TYPE_ERROR(I, type, Type); | 3950 RETURN_TYPE_ERROR(Z, type, Type); |
3938 } | 3951 } |
3939 if (native_fields == NULL) { | 3952 if (native_fields == NULL) { |
3940 RETURN_NULL_ERROR(native_fields); | 3953 RETURN_NULL_ERROR(native_fields); |
3941 } | 3954 } |
3942 const Class& cls = Class::Handle(Z, type_obj.type_class()); | 3955 const Class& cls = Class::Handle(Z, type_obj.type_class()); |
3943 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); | 3956 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); |
3944 if (!error.IsNull()) { | 3957 if (!error.IsNull()) { |
3945 // An error occurred, return error object. | 3958 // An error occurred, return error object. |
3946 return Api::NewHandle(I, error.raw()); | 3959 return Api::NewHandle(I, error.raw()); |
3947 } | 3960 } |
3948 if (num_native_fields != cls.num_native_fields()) { | 3961 if (num_native_fields != cls.num_native_fields()) { |
3949 return Api::NewError( | 3962 return Api::NewError( |
3950 "%s: invalid number of native fields %" Pd " passed in, expected %d", | 3963 "%s: invalid number of native fields %" Pd " passed in, expected %d", |
3951 CURRENT_FUNC, num_native_fields, cls.num_native_fields()); | 3964 CURRENT_FUNC, num_native_fields, cls.num_native_fields()); |
3952 } | 3965 } |
3953 const Instance& instance = Instance::Handle(Z, AllocateObject(I, cls)); | 3966 const Instance& instance = Instance::Handle(Z, AllocateObject(T, cls)); |
3954 instance.SetNativeFields(num_native_fields, native_fields); | 3967 instance.SetNativeFields(num_native_fields, native_fields); |
3955 return Api::NewHandle(I, instance.raw()); | 3968 return Api::NewHandle(I, instance.raw()); |
3956 } | 3969 } |
3957 | 3970 |
3958 | 3971 |
3959 static Dart_Handle SetupArguments(Isolate* isolate, | 3972 static Dart_Handle SetupArguments(Thread* thread, |
3960 int num_args, | 3973 int num_args, |
3961 Dart_Handle* arguments, | 3974 Dart_Handle* arguments, |
3962 int extra_args, | 3975 int extra_args, |
3963 Array* args) { | 3976 Array* args) { |
| 3977 Zone* zone = thread->zone(); |
| 3978 Isolate* isolate = thread->isolate(); |
3964 // Check for malformed arguments in the arguments list. | 3979 // Check for malformed arguments in the arguments list. |
3965 *args = Array::New(num_args + extra_args); | 3980 *args = Array::New(num_args + extra_args); |
3966 Object& arg = Object::Handle(isolate); | 3981 Object& arg = Object::Handle(zone); |
3967 for (int i = 0; i < num_args; i++) { | 3982 for (int i = 0; i < num_args; i++) { |
3968 arg = Api::UnwrapHandle(arguments[i]); | 3983 arg = Api::UnwrapHandle(arguments[i]); |
3969 if (!arg.IsNull() && !arg.IsInstance()) { | 3984 if (!arg.IsNull() && !arg.IsInstance()) { |
3970 *args = Array::null(); | 3985 *args = Array::null(); |
3971 if (arg.IsError()) { | 3986 if (arg.IsError()) { |
3972 return Api::NewHandle(isolate, arg.raw()); | 3987 return Api::NewHandle(isolate, arg.raw()); |
3973 } else { | 3988 } else { |
3974 return Api::NewError( | 3989 return Api::NewError( |
3975 "%s expects arguments[%d] to be an Instance handle.", | 3990 "%s expects arguments[%d] to be an Instance handle.", |
3976 "Dart_Invoke", i); | 3991 "Dart_Invoke", i); |
(...skipping 10 matching lines...) Expand all Loading... |
3987 int number_of_arguments, | 4002 int number_of_arguments, |
3988 Dart_Handle* arguments) { | 4003 Dart_Handle* arguments) { |
3989 DARTSCOPE(Thread::Current()); | 4004 DARTSCOPE(Thread::Current()); |
3990 CHECK_CALLBACK_STATE(I); | 4005 CHECK_CALLBACK_STATE(I); |
3991 | 4006 |
3992 if (number_of_arguments < 0) { | 4007 if (number_of_arguments < 0) { |
3993 return Api::NewError( | 4008 return Api::NewError( |
3994 "%s expects argument 'number_of_arguments' to be non-negative.", | 4009 "%s expects argument 'number_of_arguments' to be non-negative.", |
3995 CURRENT_FUNC); | 4010 CURRENT_FUNC); |
3996 } | 4011 } |
3997 const String& constructor_name = Api::UnwrapStringHandle(I, name); | 4012 const String& constructor_name = Api::UnwrapStringHandle(Z, name); |
3998 if (constructor_name.IsNull()) { | 4013 if (constructor_name.IsNull()) { |
3999 RETURN_TYPE_ERROR(I, name, String); | 4014 RETURN_TYPE_ERROR(Z, name, String); |
4000 } | 4015 } |
4001 const Instance& instance = Api::UnwrapInstanceHandle(I, object); | 4016 const Instance& instance = Api::UnwrapInstanceHandle(Z, object); |
4002 if (instance.IsNull()) { | 4017 if (instance.IsNull()) { |
4003 RETURN_TYPE_ERROR(I, object, Instance); | 4018 RETURN_TYPE_ERROR(Z, object, Instance); |
4004 } | 4019 } |
4005 | 4020 |
4006 // Since we have allocated an object it would mean that the type | 4021 // Since we have allocated an object it would mean that the type |
4007 // is finalized. | 4022 // is finalized. |
4008 // TODO(asiva): How do we ensure that a constructor is not called more than | 4023 // TODO(asiva): How do we ensure that a constructor is not called more than |
4009 // once for the same object. | 4024 // once for the same object. |
4010 | 4025 |
4011 // Construct name of the constructor to invoke. | 4026 // Construct name of the constructor to invoke. |
4012 const Type& type_obj = Type::Handle(Z, instance.GetType()); | 4027 const Type& type_obj = Type::Handle(Z, instance.GetType()); |
4013 const Class& cls = Class::Handle(Z, type_obj.type_class()); | 4028 const Class& cls = Class::Handle(Z, type_obj.type_class()); |
(...skipping 17 matching lines...) Expand all Loading... |
4031 // Constructors get the uninitialized object and a constructor phase. | 4046 // Constructors get the uninitialized object and a constructor phase. |
4032 if (!type_arguments.IsNull()) { | 4047 if (!type_arguments.IsNull()) { |
4033 // The type arguments will be null if the class has no type | 4048 // The type arguments will be null if the class has no type |
4034 // parameters, in which case the following call would fail | 4049 // parameters, in which case the following call would fail |
4035 // because there is no slot reserved in the object for the | 4050 // because there is no slot reserved in the object for the |
4036 // type vector. | 4051 // type vector. |
4037 instance.SetTypeArguments(type_arguments); | 4052 instance.SetTypeArguments(type_arguments); |
4038 } | 4053 } |
4039 Dart_Handle result; | 4054 Dart_Handle result; |
4040 Array& args = Array::Handle(Z); | 4055 Array& args = Array::Handle(Z); |
4041 result = SetupArguments(I, | 4056 result = SetupArguments(T, |
4042 number_of_arguments, arguments, extra_args, &args); | 4057 number_of_arguments, arguments, extra_args, &args); |
4043 if (!::Dart_IsError(result)) { | 4058 if (!::Dart_IsError(result)) { |
4044 args.SetAt(0, instance); | 4059 args.SetAt(0, instance); |
4045 args.SetAt(1, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll))); | 4060 args.SetAt(1, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll))); |
4046 const Object& retval = Object::Handle(Z, | 4061 const Object& retval = Object::Handle(Z, |
4047 DartEntry::InvokeFunction(constructor, args)); | 4062 DartEntry::InvokeFunction(constructor, args)); |
4048 if (retval.IsError()) { | 4063 if (retval.IsError()) { |
4049 result = Api::NewHandle(I, retval.raw()); | 4064 result = Api::NewHandle(I, retval.raw()); |
4050 } else { | 4065 } else { |
4051 result = Api::NewHandle(I, instance.raw()); | 4066 result = Api::NewHandle(I, instance.raw()); |
4052 } | 4067 } |
4053 } | 4068 } |
4054 return result; | 4069 return result; |
4055 } | 4070 } |
4056 return Api::NewError( | 4071 return Api::NewError( |
4057 "%s expects argument 'name' to be a valid constructor.", | 4072 "%s expects argument 'name' to be a valid constructor.", |
4058 CURRENT_FUNC); | 4073 CURRENT_FUNC); |
4059 } | 4074 } |
4060 | 4075 |
4061 | 4076 |
4062 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, | 4077 DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, |
4063 Dart_Handle name, | 4078 Dart_Handle name, |
4064 int number_of_arguments, | 4079 int number_of_arguments, |
4065 Dart_Handle* arguments) { | 4080 Dart_Handle* arguments) { |
4066 DARTSCOPE(Thread::Current()); | 4081 DARTSCOPE(Thread::Current()); |
4067 CHECK_CALLBACK_STATE(I); | 4082 CHECK_CALLBACK_STATE(I); |
4068 | 4083 |
4069 const String& function_name = Api::UnwrapStringHandle(I, name); | 4084 const String& function_name = Api::UnwrapStringHandle(Z, name); |
4070 if (function_name.IsNull()) { | 4085 if (function_name.IsNull()) { |
4071 RETURN_TYPE_ERROR(I, name, String); | 4086 RETURN_TYPE_ERROR(Z, name, String); |
4072 } | 4087 } |
4073 if (number_of_arguments < 0) { | 4088 if (number_of_arguments < 0) { |
4074 return Api::NewError( | 4089 return Api::NewError( |
4075 "%s expects argument 'number_of_arguments' to be non-negative.", | 4090 "%s expects argument 'number_of_arguments' to be non-negative.", |
4076 CURRENT_FUNC); | 4091 CURRENT_FUNC); |
4077 } | 4092 } |
4078 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(target)); | 4093 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(target)); |
4079 if (obj.IsError()) { | 4094 if (obj.IsError()) { |
4080 return target; | 4095 return target; |
4081 } | 4096 } |
(...skipping 13 matching lines...) Expand all Loading... |
4095 number_of_arguments, | 4110 number_of_arguments, |
4096 Object::empty_array())); | 4111 Object::empty_array())); |
4097 if (function.IsNull()) { | 4112 if (function.IsNull()) { |
4098 const String& cls_name = String::Handle(Z, cls.Name()); | 4113 const String& cls_name = String::Handle(Z, cls.Name()); |
4099 return Api::NewError("%s: did not find static method '%s.%s'.", | 4114 return Api::NewError("%s: did not find static method '%s.%s'.", |
4100 CURRENT_FUNC, | 4115 CURRENT_FUNC, |
4101 cls_name.ToCString(), | 4116 cls_name.ToCString(), |
4102 function_name.ToCString()); | 4117 function_name.ToCString()); |
4103 } | 4118 } |
4104 // Setup args and check for malformed arguments in the arguments list. | 4119 // Setup args and check for malformed arguments in the arguments list. |
4105 result = SetupArguments(I, number_of_arguments, arguments, 0, &args); | 4120 result = SetupArguments(T, number_of_arguments, arguments, 0, &args); |
4106 if (!::Dart_IsError(result)) { | 4121 if (!::Dart_IsError(result)) { |
4107 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args)); | 4122 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args)); |
4108 } | 4123 } |
4109 return result; | 4124 return result; |
4110 } else if (obj.IsNull() || obj.IsInstance()) { | 4125 } else if (obj.IsNull() || obj.IsInstance()) { |
4111 // Since we have allocated an object it would mean that the type of the | 4126 // Since we have allocated an object it would mean that the type of the |
4112 // receiver is already resolved and finalized, hence it is not necessary | 4127 // receiver is already resolved and finalized, hence it is not necessary |
4113 // to check here. | 4128 // to check here. |
4114 Instance& instance = Instance::Handle(Z); | 4129 Instance& instance = Instance::Handle(Z); |
4115 instance ^= obj.raw(); | 4130 instance ^= obj.raw(); |
4116 ArgumentsDescriptor args_desc( | 4131 ArgumentsDescriptor args_desc( |
4117 Array::Handle(Z, ArgumentsDescriptor::New(number_of_arguments + 1))); | 4132 Array::Handle(Z, ArgumentsDescriptor::New(number_of_arguments + 1))); |
4118 const Function& function = Function::Handle(Z, | 4133 const Function& function = Function::Handle(Z, |
4119 Resolver::ResolveDynamic(instance, function_name, args_desc)); | 4134 Resolver::ResolveDynamic(instance, function_name, args_desc)); |
4120 if (function.IsNull()) { | 4135 if (function.IsNull()) { |
4121 // Setup args and check for malformed arguments in the arguments list. | 4136 // Setup args and check for malformed arguments in the arguments list. |
4122 result = SetupArguments(I, | 4137 result = SetupArguments(T, |
4123 number_of_arguments, | 4138 number_of_arguments, |
4124 arguments, | 4139 arguments, |
4125 1, | 4140 1, |
4126 &args); | 4141 &args); |
4127 if (!::Dart_IsError(result)) { | 4142 if (!::Dart_IsError(result)) { |
4128 args.SetAt(0, instance); | 4143 args.SetAt(0, instance); |
4129 const Array& args_descriptor = | 4144 const Array& args_descriptor = |
4130 Array::Handle(Z, ArgumentsDescriptor::New(args.Length())); | 4145 Array::Handle(Z, ArgumentsDescriptor::New(args.Length())); |
4131 result = Api::NewHandle(I, | 4146 result = Api::NewHandle(I, |
4132 DartEntry::InvokeNoSuchMethod(instance, | 4147 DartEntry::InvokeNoSuchMethod(instance, |
4133 function_name, | 4148 function_name, |
4134 args, | 4149 args, |
4135 args_descriptor)); | 4150 args_descriptor)); |
4136 } | 4151 } |
4137 return result; | 4152 return result; |
4138 } | 4153 } |
4139 // Setup args and check for malformed arguments in the arguments list. | 4154 // Setup args and check for malformed arguments in the arguments list. |
4140 result = SetupArguments(I, number_of_arguments, arguments, 1, &args); | 4155 result = SetupArguments(T, number_of_arguments, arguments, 1, &args); |
4141 if (!::Dart_IsError(result)) { | 4156 if (!::Dart_IsError(result)) { |
4142 args.SetAt(0, instance); | 4157 args.SetAt(0, instance); |
4143 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args)); | 4158 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args)); |
4144 } | 4159 } |
4145 return result; | 4160 return result; |
4146 } else if (obj.IsLibrary()) { | 4161 } else if (obj.IsLibrary()) { |
4147 // Check whether class finalization is needed. | 4162 // Check whether class finalization is needed. |
4148 const Library& lib = Library::Cast(obj); | 4163 const Library& lib = Library::Cast(obj); |
4149 | 4164 |
4150 // Check that the library is loaded. | 4165 // Check that the library is loaded. |
(...skipping 15 matching lines...) Expand all Loading... |
4166 String& error_message = String::Handle(Z); | 4181 String& error_message = String::Handle(Z); |
4167 if (!function.AreValidArgumentCounts(number_of_arguments, | 4182 if (!function.AreValidArgumentCounts(number_of_arguments, |
4168 0, | 4183 0, |
4169 &error_message)) { | 4184 &error_message)) { |
4170 return Api::NewError("%s: wrong argument count for function '%s': %s.", | 4185 return Api::NewError("%s: wrong argument count for function '%s': %s.", |
4171 CURRENT_FUNC, | 4186 CURRENT_FUNC, |
4172 function_name.ToCString(), | 4187 function_name.ToCString(), |
4173 error_message.ToCString()); | 4188 error_message.ToCString()); |
4174 } | 4189 } |
4175 // Setup args and check for malformed arguments in the arguments list. | 4190 // Setup args and check for malformed arguments in the arguments list. |
4176 result = SetupArguments(I, number_of_arguments, arguments, 0, &args); | 4191 result = SetupArguments(T, number_of_arguments, arguments, 0, &args); |
4177 if (!::Dart_IsError(result)) { | 4192 if (!::Dart_IsError(result)) { |
4178 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args)); | 4193 result = Api::NewHandle(I, DartEntry::InvokeFunction(function, args)); |
4179 } | 4194 } |
4180 return result; | 4195 return result; |
4181 } else { | 4196 } else { |
4182 return Api::NewError( | 4197 return Api::NewError( |
4183 "%s expects argument 'target' to be an object, type, or library.", | 4198 "%s expects argument 'target' to be an object, type, or library.", |
4184 CURRENT_FUNC); | 4199 CURRENT_FUNC); |
4185 } | 4200 } |
4186 } | 4201 } |
4187 | 4202 |
4188 | 4203 |
4189 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, | 4204 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, |
4190 int number_of_arguments, | 4205 int number_of_arguments, |
4191 Dart_Handle* arguments) { | 4206 Dart_Handle* arguments) { |
4192 DARTSCOPE(Thread::Current()); | 4207 DARTSCOPE(Thread::Current()); |
4193 CHECK_CALLBACK_STATE(I); | 4208 CHECK_CALLBACK_STATE(I); |
4194 const Instance& closure_obj = Api::UnwrapInstanceHandle(I, closure); | 4209 const Instance& closure_obj = Api::UnwrapInstanceHandle(Z, closure); |
4195 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL)) { | 4210 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL)) { |
4196 RETURN_TYPE_ERROR(I, closure, Instance); | 4211 RETURN_TYPE_ERROR(Z, closure, Instance); |
4197 } | 4212 } |
4198 if (number_of_arguments < 0) { | 4213 if (number_of_arguments < 0) { |
4199 return Api::NewError( | 4214 return Api::NewError( |
4200 "%s expects argument 'number_of_arguments' to be non-negative.", | 4215 "%s expects argument 'number_of_arguments' to be non-negative.", |
4201 CURRENT_FUNC); | 4216 CURRENT_FUNC); |
4202 } | 4217 } |
4203 | 4218 |
4204 // Set up arguments to include the closure as the first argument. | 4219 // Set up arguments to include the closure as the first argument. |
4205 const Array& args = Array::Handle(Z, Array::New(number_of_arguments + 1)); | 4220 const Array& args = Array::Handle(Z, Array::New(number_of_arguments + 1)); |
4206 Object& obj = Object::Handle(Z); | 4221 Object& obj = Object::Handle(Z); |
4207 args.SetAt(0, closure_obj); | 4222 args.SetAt(0, closure_obj); |
4208 for (int i = 0; i < number_of_arguments; i++) { | 4223 for (int i = 0; i < number_of_arguments; i++) { |
4209 obj = Api::UnwrapHandle(arguments[i]); | 4224 obj = Api::UnwrapHandle(arguments[i]); |
4210 if (!obj.IsNull() && !obj.IsInstance()) { | 4225 if (!obj.IsNull() && !obj.IsInstance()) { |
4211 RETURN_TYPE_ERROR(I, arguments[i], Instance); | 4226 RETURN_TYPE_ERROR(Z, arguments[i], Instance); |
4212 } | 4227 } |
4213 args.SetAt(i + 1, obj); | 4228 args.SetAt(i + 1, obj); |
4214 } | 4229 } |
4215 // Now try to invoke the closure. | 4230 // Now try to invoke the closure. |
4216 return Api::NewHandle(I, DartEntry::InvokeClosure(args)); | 4231 return Api::NewHandle(I, DartEntry::InvokeClosure(args)); |
4217 } | 4232 } |
4218 | 4233 |
4219 | 4234 |
4220 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { | 4235 DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { |
4221 DARTSCOPE(Thread::Current()); | 4236 DARTSCOPE(Thread::Current()); |
4222 CHECK_CALLBACK_STATE(I); | 4237 CHECK_CALLBACK_STATE(I); |
4223 | 4238 |
4224 const String& field_name = Api::UnwrapStringHandle(I, name); | 4239 const String& field_name = Api::UnwrapStringHandle(Z, name); |
4225 if (field_name.IsNull()) { | 4240 if (field_name.IsNull()) { |
4226 RETURN_TYPE_ERROR(I, name, String); | 4241 RETURN_TYPE_ERROR(Z, name, String); |
4227 } | 4242 } |
4228 | 4243 |
4229 Field& field = Field::Handle(Z); | 4244 Field& field = Field::Handle(Z); |
4230 Function& getter = Function::Handle(Z); | 4245 Function& getter = Function::Handle(Z); |
4231 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(container)); | 4246 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(container)); |
4232 if (obj.IsNull()) { | 4247 if (obj.IsNull()) { |
4233 return Api::NewError("%s expects argument 'container' to be non-null.", | 4248 return Api::NewError("%s expects argument 'container' to be non-null.", |
4234 CURRENT_FUNC); | 4249 CURRENT_FUNC); |
4235 } else if (obj.IsType()) { | 4250 } else if (obj.IsType()) { |
4236 if (!Type::Cast(obj).IsFinalized()) { | 4251 if (!Type::Cast(obj).IsFinalized()) { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4335 } | 4350 } |
4336 } | 4351 } |
4337 | 4352 |
4338 | 4353 |
4339 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, | 4354 DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, |
4340 Dart_Handle name, | 4355 Dart_Handle name, |
4341 Dart_Handle value) { | 4356 Dart_Handle value) { |
4342 DARTSCOPE(Thread::Current()); | 4357 DARTSCOPE(Thread::Current()); |
4343 CHECK_CALLBACK_STATE(I); | 4358 CHECK_CALLBACK_STATE(I); |
4344 | 4359 |
4345 const String& field_name = Api::UnwrapStringHandle(I, name); | 4360 const String& field_name = Api::UnwrapStringHandle(Z, name); |
4346 if (field_name.IsNull()) { | 4361 if (field_name.IsNull()) { |
4347 RETURN_TYPE_ERROR(I, name, String); | 4362 RETURN_TYPE_ERROR(Z, name, String); |
4348 } | 4363 } |
4349 | 4364 |
4350 // Since null is allowed for value, we don't use UnwrapInstanceHandle. | 4365 // Since null is allowed for value, we don't use UnwrapInstanceHandle. |
4351 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); | 4366 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); |
4352 if (!value_obj.IsNull() && !value_obj.IsInstance()) { | 4367 if (!value_obj.IsNull() && !value_obj.IsInstance()) { |
4353 RETURN_TYPE_ERROR(I, value, Instance); | 4368 RETURN_TYPE_ERROR(Z, value, Instance); |
4354 } | 4369 } |
4355 Instance& value_instance = Instance::Handle(Z); | 4370 Instance& value_instance = Instance::Handle(Z); |
4356 value_instance ^= value_obj.raw(); | 4371 value_instance ^= value_obj.raw(); |
4357 | 4372 |
4358 Field& field = Field::Handle(Z); | 4373 Field& field = Field::Handle(Z); |
4359 Function& setter = Function::Handle(Z); | 4374 Function& setter = Function::Handle(Z); |
4360 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(container)); | 4375 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(container)); |
4361 if (obj.IsNull()) { | 4376 if (obj.IsNull()) { |
4362 return Api::NewError("%s expects argument 'container' to be non-null.", | 4377 return Api::NewError("%s expects argument 'container' to be non-null.", |
4363 CURRENT_FUNC); | 4378 CURRENT_FUNC); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4485 return Api::NewError( | 4500 return Api::NewError( |
4486 "%s expects argument 'container' to be an object, type, or library.", | 4501 "%s expects argument 'container' to be an object, type, or library.", |
4487 CURRENT_FUNC); | 4502 CURRENT_FUNC); |
4488 } | 4503 } |
4489 | 4504 |
4490 | 4505 |
4491 // --- Exceptions ---- | 4506 // --- Exceptions ---- |
4492 | 4507 |
4493 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { | 4508 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { |
4494 Thread* thread = Thread::Current(); | 4509 Thread* thread = Thread::Current(); |
| 4510 Zone* zone = thread->zone(); |
4495 Isolate* isolate = thread->isolate(); | 4511 Isolate* isolate = thread->isolate(); |
4496 CHECK_ISOLATE(isolate); | 4512 CHECK_ISOLATE(isolate); |
4497 CHECK_CALLBACK_STATE(isolate); | 4513 CHECK_CALLBACK_STATE(isolate); |
4498 { | 4514 { |
4499 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); | 4515 const Instance& excp = Api::UnwrapInstanceHandle(zone, exception); |
4500 if (excp.IsNull()) { | 4516 if (excp.IsNull()) { |
4501 RETURN_TYPE_ERROR(isolate, exception, Instance); | 4517 RETURN_TYPE_ERROR(zone, exception, Instance); |
4502 } | 4518 } |
4503 } | 4519 } |
4504 if (isolate->top_exit_frame_info() == 0) { | 4520 if (isolate->top_exit_frame_info() == 0) { |
4505 // There are no dart frames on the stack so it would be illegal to | 4521 // There are no dart frames on the stack so it would be illegal to |
4506 // throw an exception here. | 4522 // throw an exception here. |
4507 return Api::NewError("No Dart frames on stack, cannot throw exception"); | 4523 return Api::NewError("No Dart frames on stack, cannot throw exception"); |
4508 } | 4524 } |
4509 | 4525 |
4510 // Unwind all the API scopes till the exit frame before throwing an | 4526 // Unwind all the API scopes till the exit frame before throwing an |
4511 // exception. | 4527 // exception. |
4512 ApiState* state = isolate->api_state(); | 4528 ApiState* state = isolate->api_state(); |
4513 ASSERT(state != NULL); | 4529 ASSERT(state != NULL); |
4514 const Instance* saved_exception; | 4530 const Instance* saved_exception; |
4515 { | 4531 { |
4516 NoSafepointScope no_safepoint; | 4532 NoSafepointScope no_safepoint; |
4517 RawInstance* raw_exception = | 4533 RawInstance* raw_exception = |
4518 Api::UnwrapInstanceHandle(isolate, exception).raw(); | 4534 Api::UnwrapInstanceHandle(zone, exception).raw(); |
4519 state->UnwindScopes(isolate->top_exit_frame_info()); | 4535 state->UnwindScopes(isolate->top_exit_frame_info()); |
4520 saved_exception = &Instance::Handle(raw_exception); | 4536 saved_exception = &Instance::Handle(raw_exception); |
4521 } | 4537 } |
4522 Exceptions::Throw(thread, *saved_exception); | 4538 Exceptions::Throw(thread, *saved_exception); |
4523 return Api::NewError("Exception was not thrown, internal error"); | 4539 return Api::NewError("Exception was not thrown, internal error"); |
4524 } | 4540 } |
4525 | 4541 |
4526 | 4542 |
4527 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, | 4543 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, |
4528 Dart_Handle stacktrace) { | 4544 Dart_Handle stacktrace) { |
4529 Thread* thread = Thread::Current(); | 4545 Thread* thread = Thread::Current(); |
| 4546 Zone* zone = thread->zone(); |
4530 Isolate* isolate = thread->isolate(); | 4547 Isolate* isolate = thread->isolate(); |
4531 CHECK_ISOLATE(isolate); | 4548 CHECK_ISOLATE(isolate); |
4532 CHECK_CALLBACK_STATE(isolate); | 4549 CHECK_CALLBACK_STATE(isolate); |
4533 { | 4550 { |
4534 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); | 4551 const Instance& excp = Api::UnwrapInstanceHandle(zone, exception); |
4535 if (excp.IsNull()) { | 4552 if (excp.IsNull()) { |
4536 RETURN_TYPE_ERROR(isolate, exception, Instance); | 4553 RETURN_TYPE_ERROR(zone, exception, Instance); |
4537 } | 4554 } |
4538 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace); | 4555 const Instance& stk = Api::UnwrapInstanceHandle(zone, stacktrace); |
4539 if (stk.IsNull()) { | 4556 if (stk.IsNull()) { |
4540 RETURN_TYPE_ERROR(isolate, stacktrace, Instance); | 4557 RETURN_TYPE_ERROR(zone, stacktrace, Instance); |
4541 } | 4558 } |
4542 } | 4559 } |
4543 if (isolate->top_exit_frame_info() == 0) { | 4560 if (isolate->top_exit_frame_info() == 0) { |
4544 // There are no dart frames on the stack so it would be illegal to | 4561 // There are no dart frames on the stack so it would be illegal to |
4545 // throw an exception here. | 4562 // throw an exception here. |
4546 return Api::NewError("No Dart frames on stack, cannot throw exception"); | 4563 return Api::NewError("No Dart frames on stack, cannot throw exception"); |
4547 } | 4564 } |
4548 | 4565 |
4549 // Unwind all the API scopes till the exit frame before throwing an | 4566 // Unwind all the API scopes till the exit frame before throwing an |
4550 // exception. | 4567 // exception. |
4551 ApiState* state = isolate->api_state(); | 4568 ApiState* state = isolate->api_state(); |
4552 ASSERT(state != NULL); | 4569 ASSERT(state != NULL); |
4553 const Instance* saved_exception; | 4570 const Instance* saved_exception; |
4554 const Stacktrace* saved_stacktrace; | 4571 const Stacktrace* saved_stacktrace; |
4555 { | 4572 { |
4556 NoSafepointScope no_safepoint; | 4573 NoSafepointScope no_safepoint; |
4557 RawInstance* raw_exception = | 4574 RawInstance* raw_exception = |
4558 Api::UnwrapInstanceHandle(isolate, exception).raw(); | 4575 Api::UnwrapInstanceHandle(zone, exception).raw(); |
4559 RawStacktrace* raw_stacktrace = | 4576 RawStacktrace* raw_stacktrace = |
4560 Api::UnwrapStacktraceHandle(isolate, stacktrace).raw(); | 4577 Api::UnwrapStacktraceHandle(zone, stacktrace).raw(); |
4561 state->UnwindScopes(isolate->top_exit_frame_info()); | 4578 state->UnwindScopes(isolate->top_exit_frame_info()); |
4562 saved_exception = &Instance::Handle(raw_exception); | 4579 saved_exception = &Instance::Handle(raw_exception); |
4563 saved_stacktrace = &Stacktrace::Handle(raw_stacktrace); | 4580 saved_stacktrace = &Stacktrace::Handle(raw_stacktrace); |
4564 } | 4581 } |
4565 Exceptions::ReThrow(thread, *saved_exception, *saved_stacktrace); | 4582 Exceptions::ReThrow(thread, *saved_exception, *saved_stacktrace); |
4566 return Api::NewError("Exception was not re thrown, internal error"); | 4583 return Api::NewError("Exception was not re thrown, internal error"); |
4567 } | 4584 } |
4568 | 4585 |
4569 | 4586 |
4570 // --- Native fields and functions --- | 4587 // --- Native fields and functions --- |
4571 | 4588 |
4572 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, | 4589 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, |
4573 Dart_Handle name, | 4590 Dart_Handle name, |
4574 int field_count) { | 4591 int field_count) { |
4575 DARTSCOPE(Thread::Current()); | 4592 DARTSCOPE(Thread::Current()); |
4576 const String& cls_name = Api::UnwrapStringHandle(I, name); | 4593 const String& cls_name = Api::UnwrapStringHandle(Z, name); |
4577 if (cls_name.IsNull()) { | 4594 if (cls_name.IsNull()) { |
4578 RETURN_TYPE_ERROR(I, name, String); | 4595 RETURN_TYPE_ERROR(Z, name, String); |
4579 } | 4596 } |
4580 const Library& lib = Api::UnwrapLibraryHandle(I, library); | 4597 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
4581 if (lib.IsNull()) { | 4598 if (lib.IsNull()) { |
4582 RETURN_TYPE_ERROR(I, library, Library); | 4599 RETURN_TYPE_ERROR(Z, library, Library); |
4583 } | 4600 } |
4584 if (!Utils::IsUint(16, field_count)) { | 4601 if (!Utils::IsUint(16, field_count)) { |
4585 return Api::NewError( | 4602 return Api::NewError( |
4586 "Invalid field_count passed to Dart_CreateNativeWrapperClass"); | 4603 "Invalid field_count passed to Dart_CreateNativeWrapperClass"); |
4587 } | 4604 } |
4588 CHECK_CALLBACK_STATE(I); | 4605 CHECK_CALLBACK_STATE(I); |
4589 | 4606 |
4590 String& cls_symbol = String::Handle(Z, Symbols::New(cls_name)); | 4607 String& cls_symbol = String::Handle(Z, Symbols::New(cls_name)); |
4591 const Class& cls = Class::Handle(Z, | 4608 const Class& cls = Class::Handle(Z, |
4592 Class::NewNativeWrapper(lib, cls_symbol, field_count)); | 4609 Class::NewNativeWrapper(lib, cls_symbol, field_count)); |
4593 if (cls.IsNull()) { | 4610 if (cls.IsNull()) { |
4594 return Api::NewError( | 4611 return Api::NewError( |
4595 "Unable to create native wrapper class : already exists"); | 4612 "Unable to create native wrapper class : already exists"); |
4596 } | 4613 } |
4597 return Api::NewHandle(I, cls.RareType()); | 4614 return Api::NewHandle(I, cls.RareType()); |
4598 } | 4615 } |
4599 | 4616 |
4600 | 4617 |
4601 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj, | 4618 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj, |
4602 int* count) { | 4619 int* count) { |
4603 Thread* thread = Thread::Current(); | 4620 Thread* thread = Thread::Current(); |
4604 CHECK_ISOLATE(thread->isolate()); | 4621 CHECK_ISOLATE(thread->isolate()); |
4605 ReusableObjectHandleScope reused_obj_handle(thread); | 4622 ReusableObjectHandleScope reused_obj_handle(thread); |
4606 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); | 4623 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); |
4607 if (instance.IsNull()) { | 4624 if (instance.IsNull()) { |
4608 RETURN_TYPE_ERROR(thread->isolate(), obj, Instance); | 4625 RETURN_TYPE_ERROR(thread->zone(), obj, Instance); |
4609 } | 4626 } |
4610 *count = instance.NumNativeFields(); | 4627 *count = instance.NumNativeFields(); |
4611 return Api::Success(); | 4628 return Api::Success(); |
4612 } | 4629 } |
4613 | 4630 |
4614 | 4631 |
4615 DART_EXPORT Dart_Handle Dart_GetNativeInstanceField(Dart_Handle obj, | 4632 DART_EXPORT Dart_Handle Dart_GetNativeInstanceField(Dart_Handle obj, |
4616 int index, | 4633 int index, |
4617 intptr_t* value) { | 4634 intptr_t* value) { |
4618 Thread* thread = Thread::Current(); | 4635 Thread* thread = Thread::Current(); |
4619 CHECK_ISOLATE(thread->isolate()); | 4636 CHECK_ISOLATE(thread->isolate()); |
4620 ReusableObjectHandleScope reused_obj_handle(thread); | 4637 ReusableObjectHandleScope reused_obj_handle(thread); |
4621 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); | 4638 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); |
4622 if (instance.IsNull()) { | 4639 if (instance.IsNull()) { |
4623 RETURN_TYPE_ERROR(thread->isolate(), obj, Instance); | 4640 RETURN_TYPE_ERROR(thread->zone(), obj, Instance); |
4624 } | 4641 } |
4625 if (!instance.IsValidNativeIndex(index)) { | 4642 if (!instance.IsValidNativeIndex(index)) { |
4626 return Api::NewError( | 4643 return Api::NewError( |
4627 "%s: invalid index %d passed in to access native instance field", | 4644 "%s: invalid index %d passed in to access native instance field", |
4628 CURRENT_FUNC, index); | 4645 CURRENT_FUNC, index); |
4629 } | 4646 } |
4630 *value = instance.GetNativeField(index); | 4647 *value = instance.GetNativeField(index); |
4631 return Api::Success(); | 4648 return Api::Success(); |
4632 } | 4649 } |
4633 | 4650 |
4634 | 4651 |
4635 DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj, | 4652 DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj, |
4636 int index, | 4653 int index, |
4637 intptr_t value) { | 4654 intptr_t value) { |
4638 DARTSCOPE(Thread::Current()); | 4655 DARTSCOPE(Thread::Current()); |
4639 const Instance& instance = Api::UnwrapInstanceHandle(I, obj); | 4656 const Instance& instance = Api::UnwrapInstanceHandle(Z, obj); |
4640 if (instance.IsNull()) { | 4657 if (instance.IsNull()) { |
4641 RETURN_TYPE_ERROR(I, obj, Instance); | 4658 RETURN_TYPE_ERROR(Z, obj, Instance); |
4642 } | 4659 } |
4643 if (!instance.IsValidNativeIndex(index)) { | 4660 if (!instance.IsValidNativeIndex(index)) { |
4644 return Api::NewError( | 4661 return Api::NewError( |
4645 "%s: invalid index %d passed in to set native instance field", | 4662 "%s: invalid index %d passed in to set native instance field", |
4646 CURRENT_FUNC, index); | 4663 CURRENT_FUNC, index); |
4647 } | 4664 } |
4648 instance.SetNativeField(index, value); | 4665 instance.SetNativeField(index, value); |
4649 return Api::Success(); | 4666 return Api::Success(); |
4650 } | 4667 } |
4651 | 4668 |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4942 isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval))); | 4959 isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval))); |
4943 #endif | 4960 #endif |
4944 Api::SetWeakHandleReturnValue(arguments, rval); | 4961 Api::SetWeakHandleReturnValue(arguments, rval); |
4945 } | 4962 } |
4946 | 4963 |
4947 | 4964 |
4948 // --- Environment --- | 4965 // --- Environment --- |
4949 RawString* Api::CallEnvironmentCallback(Isolate* isolate, const String& name) { | 4966 RawString* Api::CallEnvironmentCallback(Isolate* isolate, const String& name) { |
4950 Scope api_scope(isolate); | 4967 Scope api_scope(isolate); |
4951 Dart_EnvironmentCallback callback = isolate->environment_callback(); | 4968 Dart_EnvironmentCallback callback = isolate->environment_callback(); |
4952 String& result = String::Handle(isolate); | 4969 String& result = String::Handle(isolate->current_zone()); |
4953 if (callback != NULL) { | 4970 if (callback != NULL) { |
4954 Dart_Handle response = callback(Api::NewHandle(isolate, name.raw())); | 4971 Dart_Handle response = callback(Api::NewHandle(isolate, name.raw())); |
4955 if (::Dart_IsString(response)) { | 4972 if (::Dart_IsString(response)) { |
4956 result ^= Api::UnwrapHandle(response); | 4973 result ^= Api::UnwrapHandle(response); |
4957 } else if (::Dart_IsError(response)) { | 4974 } else if (::Dart_IsError(response)) { |
4958 const Object& error = | 4975 const Object& error = |
4959 Object::Handle(isolate, Api::UnwrapHandle(response)); | 4976 Object::Handle(isolate->current_zone(), Api::UnwrapHandle(response)); |
4960 Exceptions::ThrowArgumentError( | 4977 Exceptions::ThrowArgumentError( |
4961 String::Handle(String::New(Error::Cast(error).ToErrorCString()))); | 4978 String::Handle(String::New(Error::Cast(error).ToErrorCString()))); |
4962 } else if (!::Dart_IsNull(response)) { | 4979 } else if (!::Dart_IsNull(response)) { |
4963 // At this point everything except null are invalid environment values. | 4980 // At this point everything except null are invalid environment values. |
4964 Exceptions::ThrowArgumentError( | 4981 Exceptions::ThrowArgumentError( |
4965 String::Handle(String::New("Illegal environment value"))); | 4982 String::Handle(String::New("Illegal environment value"))); |
4966 } | 4983 } |
4967 } | 4984 } |
4968 if (result.IsNull()) { | 4985 if (result.IsNull()) { |
4969 // TODO(iposva): Determine whether builtin values can be overriden by the | 4986 // TODO(iposva): Determine whether builtin values can be overriden by the |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5039 static void CompileSource(Isolate* isolate, | 5056 static void CompileSource(Isolate* isolate, |
5040 const Library& lib, | 5057 const Library& lib, |
5041 const Script& script, | 5058 const Script& script, |
5042 Dart_Handle* result) { | 5059 Dart_Handle* result) { |
5043 bool update_lib_status = (script.kind() == RawScript::kScriptTag || | 5060 bool update_lib_status = (script.kind() == RawScript::kScriptTag || |
5044 script.kind() == RawScript::kLibraryTag); | 5061 script.kind() == RawScript::kLibraryTag); |
5045 if (update_lib_status) { | 5062 if (update_lib_status) { |
5046 lib.SetLoadInProgress(); | 5063 lib.SetLoadInProgress(); |
5047 } | 5064 } |
5048 ASSERT(isolate != NULL); | 5065 ASSERT(isolate != NULL); |
5049 const Error& error = Error::Handle(isolate, Compiler::Compile(lib, script)); | 5066 const Error& error = |
| 5067 Error::Handle(isolate->current_zone(), Compiler::Compile(lib, script)); |
5050 if (error.IsNull()) { | 5068 if (error.IsNull()) { |
5051 *result = Api::NewHandle(isolate, lib.raw()); | 5069 *result = Api::NewHandle(isolate, lib.raw()); |
5052 } else { | 5070 } else { |
5053 *result = Api::NewHandle(isolate, error.raw()); | 5071 *result = Api::NewHandle(isolate, error.raw()); |
5054 // Compilation errors are not Dart instances, so just mark the library | 5072 // Compilation errors are not Dart instances, so just mark the library |
5055 // as having failed to load without providing an error instance. | 5073 // as having failed to load without providing an error instance. |
5056 lib.SetLoadError(Object::null_instance()); | 5074 lib.SetLoadError(Object::null_instance()); |
5057 } | 5075 } |
5058 } | 5076 } |
5059 | 5077 |
5060 | 5078 |
5061 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, | 5079 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, |
5062 Dart_Handle source, | 5080 Dart_Handle source, |
5063 intptr_t line_offset, | 5081 intptr_t line_offset, |
5064 intptr_t column_offset) { | 5082 intptr_t column_offset) { |
5065 DARTSCOPE(Thread::Current()); | 5083 DARTSCOPE(Thread::Current()); |
5066 const String& url_str = Api::UnwrapStringHandle(I, url); | 5084 const String& url_str = Api::UnwrapStringHandle(Z, url); |
5067 if (url_str.IsNull()) { | 5085 if (url_str.IsNull()) { |
5068 RETURN_TYPE_ERROR(I, url, String); | 5086 RETURN_TYPE_ERROR(Z, url, String); |
5069 } | 5087 } |
5070 const String& source_str = Api::UnwrapStringHandle(I, source); | 5088 const String& source_str = Api::UnwrapStringHandle(Z, source); |
5071 if (source_str.IsNull()) { | 5089 if (source_str.IsNull()) { |
5072 RETURN_TYPE_ERROR(I, source, String); | 5090 RETURN_TYPE_ERROR(Z, source, String); |
5073 } | 5091 } |
5074 Library& library = Library::Handle(Z, I->object_store()->root_library()); | 5092 Library& library = Library::Handle(Z, I->object_store()->root_library()); |
5075 if (!library.IsNull()) { | 5093 if (!library.IsNull()) { |
5076 const String& library_url = String::Handle(Z, library.url()); | 5094 const String& library_url = String::Handle(Z, library.url()); |
5077 return Api::NewError("%s: A script has already been loaded from '%s'.", | 5095 return Api::NewError("%s: A script has already been loaded from '%s'.", |
5078 CURRENT_FUNC, library_url.ToCString()); | 5096 CURRENT_FUNC, library_url.ToCString()); |
5079 } | 5097 } |
5080 if (line_offset < 0) { | 5098 if (line_offset < 0) { |
5081 return Api::NewError("%s: argument 'line_offset' must be positive number", | 5099 return Api::NewError("%s: argument 'line_offset' must be positive number", |
5082 CURRENT_FUNC); | 5100 CURRENT_FUNC); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5148 DART_EXPORT Dart_Handle Dart_RootLibrary() { | 5166 DART_EXPORT Dart_Handle Dart_RootLibrary() { |
5149 Isolate* isolate = Isolate::Current(); | 5167 Isolate* isolate = Isolate::Current(); |
5150 CHECK_ISOLATE(isolate); | 5168 CHECK_ISOLATE(isolate); |
5151 return Api::NewHandle(isolate, isolate->object_store()->root_library()); | 5169 return Api::NewHandle(isolate, isolate->object_store()->root_library()); |
5152 } | 5170 } |
5153 | 5171 |
5154 | 5172 |
5155 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library, | 5173 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library, |
5156 Dart_Handle class_name) { | 5174 Dart_Handle class_name) { |
5157 DARTSCOPE(Thread::Current()); | 5175 DARTSCOPE(Thread::Current()); |
5158 const Library& lib = Api::UnwrapLibraryHandle(I, library); | 5176 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
5159 if (lib.IsNull()) { | 5177 if (lib.IsNull()) { |
5160 RETURN_TYPE_ERROR(I, library, Library); | 5178 RETURN_TYPE_ERROR(Z, library, Library); |
5161 } | 5179 } |
5162 const String& cls_name = Api::UnwrapStringHandle(I, class_name); | 5180 const String& cls_name = Api::UnwrapStringHandle(Z, class_name); |
5163 if (cls_name.IsNull()) { | 5181 if (cls_name.IsNull()) { |
5164 RETURN_TYPE_ERROR(I, class_name, String); | 5182 RETURN_TYPE_ERROR(Z, class_name, String); |
5165 } | 5183 } |
5166 const Class& cls = Class::Handle(Z, lib.LookupClassAllowPrivate(cls_name)); | 5184 const Class& cls = Class::Handle(Z, lib.LookupClassAllowPrivate(cls_name)); |
5167 if (cls.IsNull()) { | 5185 if (cls.IsNull()) { |
5168 // TODO(turnidge): Return null or error in this case? | 5186 // TODO(turnidge): Return null or error in this case? |
5169 const String& lib_name = String::Handle(Z, lib.name()); | 5187 const String& lib_name = String::Handle(Z, lib.name()); |
5170 return Api::NewError("Class '%s' not found in library '%s'.", | 5188 return Api::NewError("Class '%s' not found in library '%s'.", |
5171 cls_name.ToCString(), lib_name.ToCString()); | 5189 cls_name.ToCString(), lib_name.ToCString()); |
5172 } | 5190 } |
5173 return Api::NewHandle(I, cls.RareType()); | 5191 return Api::NewHandle(I, cls.RareType()); |
5174 } | 5192 } |
5175 | 5193 |
5176 | 5194 |
5177 DART_EXPORT Dart_Handle Dart_GetType(Dart_Handle library, | 5195 DART_EXPORT Dart_Handle Dart_GetType(Dart_Handle library, |
5178 Dart_Handle class_name, | 5196 Dart_Handle class_name, |
5179 intptr_t number_of_type_arguments, | 5197 intptr_t number_of_type_arguments, |
5180 Dart_Handle* type_arguments) { | 5198 Dart_Handle* type_arguments) { |
5181 DARTSCOPE(Thread::Current()); | 5199 DARTSCOPE(Thread::Current()); |
5182 | 5200 |
5183 // Validate the input arguments. | 5201 // Validate the input arguments. |
5184 const Library& lib = Api::UnwrapLibraryHandle(I, library); | 5202 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
5185 if (lib.IsNull()) { | 5203 if (lib.IsNull()) { |
5186 RETURN_TYPE_ERROR(I, library, Library); | 5204 RETURN_TYPE_ERROR(Z, library, Library); |
5187 } | 5205 } |
5188 if (!lib.Loaded()) { | 5206 if (!lib.Loaded()) { |
5189 return Api::NewError( | 5207 return Api::NewError( |
5190 "%s expects library argument 'library' to be loaded.", | 5208 "%s expects library argument 'library' to be loaded.", |
5191 CURRENT_FUNC); | 5209 CURRENT_FUNC); |
5192 } | 5210 } |
5193 const String& name_str = Api::UnwrapStringHandle(I, class_name); | 5211 const String& name_str = Api::UnwrapStringHandle(Z, class_name); |
5194 if (name_str.IsNull()) { | 5212 if (name_str.IsNull()) { |
5195 RETURN_TYPE_ERROR(I, class_name, String); | 5213 RETURN_TYPE_ERROR(Z, class_name, String); |
5196 } | 5214 } |
5197 const Class& cls = Class::Handle(Z, lib.LookupClassAllowPrivate(name_str)); | 5215 const Class& cls = Class::Handle(Z, lib.LookupClassAllowPrivate(name_str)); |
5198 if (cls.IsNull()) { | 5216 if (cls.IsNull()) { |
5199 const String& lib_name = String::Handle(Z, lib.name()); | 5217 const String& lib_name = String::Handle(Z, lib.name()); |
5200 return Api::NewError("Type '%s' not found in library '%s'.", | 5218 return Api::NewError("Type '%s' not found in library '%s'.", |
5201 name_str.ToCString(), lib_name.ToCString()); | 5219 name_str.ToCString(), lib_name.ToCString()); |
5202 } | 5220 } |
5203 if (cls.NumTypeArguments() == 0) { | 5221 if (cls.NumTypeArguments() == 0) { |
5204 if (number_of_type_arguments != 0) { | 5222 if (number_of_type_arguments != 0) { |
5205 return Api::NewError("Invalid number of type arguments specified, " | 5223 return Api::NewError("Invalid number of type arguments specified, " |
5206 "got %" Pd " expected 0", number_of_type_arguments); | 5224 "got %" Pd " expected 0", number_of_type_arguments); |
5207 } | 5225 } |
5208 return Api::NewHandle(I, Type::NewNonParameterizedType(cls)); | 5226 return Api::NewHandle(I, Type::NewNonParameterizedType(cls)); |
5209 } | 5227 } |
5210 intptr_t num_expected_type_arguments = cls.NumTypeParameters(); | 5228 intptr_t num_expected_type_arguments = cls.NumTypeParameters(); |
5211 TypeArguments& type_args_obj = TypeArguments::Handle(); | 5229 TypeArguments& type_args_obj = TypeArguments::Handle(); |
5212 if (number_of_type_arguments > 0) { | 5230 if (number_of_type_arguments > 0) { |
5213 if (type_arguments == NULL) { | 5231 if (type_arguments == NULL) { |
5214 RETURN_NULL_ERROR(type_arguments); | 5232 RETURN_NULL_ERROR(type_arguments); |
5215 } | 5233 } |
5216 if (num_expected_type_arguments != number_of_type_arguments) { | 5234 if (num_expected_type_arguments != number_of_type_arguments) { |
5217 return Api::NewError("Invalid number of type arguments specified, " | 5235 return Api::NewError("Invalid number of type arguments specified, " |
5218 "got %" Pd " expected %" Pd, | 5236 "got %" Pd " expected %" Pd, |
5219 number_of_type_arguments, | 5237 number_of_type_arguments, |
5220 num_expected_type_arguments); | 5238 num_expected_type_arguments); |
5221 } | 5239 } |
5222 const Array& array = Api::UnwrapArrayHandle(I, *type_arguments); | 5240 const Array& array = Api::UnwrapArrayHandle(Z, *type_arguments); |
5223 if (array.IsNull()) { | 5241 if (array.IsNull()) { |
5224 RETURN_TYPE_ERROR(I, *type_arguments, Array); | 5242 RETURN_TYPE_ERROR(Z, *type_arguments, Array); |
5225 } | 5243 } |
5226 if (array.Length() != num_expected_type_arguments) { | 5244 if (array.Length() != num_expected_type_arguments) { |
5227 return Api::NewError("Invalid type arguments specified, expected an " | 5245 return Api::NewError("Invalid type arguments specified, expected an " |
5228 "array of len %" Pd " but got an array of len %" Pd, | 5246 "array of len %" Pd " but got an array of len %" Pd, |
5229 number_of_type_arguments, | 5247 number_of_type_arguments, |
5230 array.Length()); | 5248 array.Length()); |
5231 } | 5249 } |
5232 // Set up the type arguments array. | 5250 // Set up the type arguments array. |
5233 type_args_obj ^= TypeArguments::New(num_expected_type_arguments); | 5251 type_args_obj ^= TypeArguments::New(num_expected_type_arguments); |
5234 AbstractType& type_arg = AbstractType::Handle(); | 5252 AbstractType& type_arg = AbstractType::Handle(); |
5235 for (intptr_t i = 0; i < number_of_type_arguments; i++) { | 5253 for (intptr_t i = 0; i < number_of_type_arguments; i++) { |
5236 type_arg ^= array.At(i); | 5254 type_arg ^= array.At(i); |
5237 type_args_obj.SetTypeAt(i, type_arg); | 5255 type_args_obj.SetTypeAt(i, type_arg); |
5238 } | 5256 } |
5239 } | 5257 } |
5240 | 5258 |
5241 // Construct the type object, canonicalize it and return. | 5259 // Construct the type object, canonicalize it and return. |
5242 Type& instantiated_type = Type::Handle( | 5260 Type& instantiated_type = Type::Handle( |
5243 Type::New(cls, type_args_obj, Scanner::kNoSourcePos)); | 5261 Type::New(cls, type_args_obj, Scanner::kNoSourcePos)); |
5244 instantiated_type ^= ClassFinalizer::FinalizeType( | 5262 instantiated_type ^= ClassFinalizer::FinalizeType( |
5245 cls, instantiated_type, ClassFinalizer::kCanonicalize); | 5263 cls, instantiated_type, ClassFinalizer::kCanonicalize); |
5246 return Api::NewHandle(I, instantiated_type.raw()); | 5264 return Api::NewHandle(I, instantiated_type.raw()); |
5247 } | 5265 } |
5248 | 5266 |
5249 | 5267 |
5250 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) { | 5268 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) { |
5251 DARTSCOPE(Thread::Current()); | 5269 DARTSCOPE(Thread::Current()); |
5252 const Library& lib = Api::UnwrapLibraryHandle(I, library); | 5270 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
5253 if (lib.IsNull()) { | 5271 if (lib.IsNull()) { |
5254 RETURN_TYPE_ERROR(I, library, Library); | 5272 RETURN_TYPE_ERROR(Z, library, Library); |
5255 } | 5273 } |
5256 const String& url = String::Handle(Z, lib.url()); | 5274 const String& url = String::Handle(Z, lib.url()); |
5257 ASSERT(!url.IsNull()); | 5275 ASSERT(!url.IsNull()); |
5258 return Api::NewHandle(I, url.raw()); | 5276 return Api::NewHandle(I, url.raw()); |
5259 } | 5277 } |
5260 | 5278 |
5261 | 5279 |
5262 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) { | 5280 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) { |
5263 DARTSCOPE(Thread::Current()); | 5281 DARTSCOPE(Thread::Current()); |
5264 const String& url_str = Api::UnwrapStringHandle(I, url); | 5282 const String& url_str = Api::UnwrapStringHandle(Z, url); |
5265 if (url_str.IsNull()) { | 5283 if (url_str.IsNull()) { |
5266 RETURN_TYPE_ERROR(I, url, String); | 5284 RETURN_TYPE_ERROR(Z, url, String); |
5267 } | 5285 } |
5268 const Library& library = Library::Handle(Z, Library::LookupLibrary(url_str)); | 5286 const Library& library = Library::Handle(Z, Library::LookupLibrary(url_str)); |
5269 if (library.IsNull()) { | 5287 if (library.IsNull()) { |
5270 return Api::NewError("%s: library '%s' not found.", | 5288 return Api::NewError("%s: library '%s' not found.", |
5271 CURRENT_FUNC, url_str.ToCString()); | 5289 CURRENT_FUNC, url_str.ToCString()); |
5272 } else { | 5290 } else { |
5273 return Api::NewHandle(I, library.raw()); | 5291 return Api::NewHandle(I, library.raw()); |
5274 } | 5292 } |
5275 } | 5293 } |
5276 | 5294 |
5277 | 5295 |
5278 DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library_in, | 5296 DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library_in, |
5279 Dart_Handle error_in) { | 5297 Dart_Handle error_in) { |
5280 DARTSCOPE(Thread::Current()); | 5298 DARTSCOPE(Thread::Current()); |
5281 | 5299 |
5282 const Library& lib = Api::UnwrapLibraryHandle(I, library_in); | 5300 const Library& lib = Api::UnwrapLibraryHandle(Z, library_in); |
5283 if (lib.IsNull()) { | 5301 if (lib.IsNull()) { |
5284 RETURN_TYPE_ERROR(I, library_in, Library); | 5302 RETURN_TYPE_ERROR(Z, library_in, Library); |
5285 } | 5303 } |
5286 const Instance& err = Api::UnwrapInstanceHandle(I, error_in); | 5304 const Instance& err = Api::UnwrapInstanceHandle(Z, error_in); |
5287 if (err.IsNull()) { | 5305 if (err.IsNull()) { |
5288 RETURN_TYPE_ERROR(I, error_in, Instance); | 5306 RETURN_TYPE_ERROR(Z, error_in, Instance); |
5289 } | 5307 } |
5290 CHECK_CALLBACK_STATE(I); | 5308 CHECK_CALLBACK_STATE(I); |
5291 | 5309 |
5292 const GrowableObjectArray& pending_deferred_loads = | 5310 const GrowableObjectArray& pending_deferred_loads = |
5293 GrowableObjectArray::Handle(Z, | 5311 GrowableObjectArray::Handle(Z, |
5294 I->object_store()->pending_deferred_loads()); | 5312 I->object_store()->pending_deferred_loads()); |
5295 for (intptr_t i = 0; i < pending_deferred_loads.Length(); i++) { | 5313 for (intptr_t i = 0; i < pending_deferred_loads.Length(); i++) { |
5296 if (pending_deferred_loads.At(i) == lib.raw()) { | 5314 if (pending_deferred_loads.At(i) == lib.raw()) { |
5297 lib.SetLoadError(err); | 5315 lib.SetLoadError(err); |
5298 return Api::Null(); | 5316 return Api::Null(); |
5299 } | 5317 } |
5300 } | 5318 } |
5301 return error_in; | 5319 return error_in; |
5302 } | 5320 } |
5303 | 5321 |
5304 | 5322 |
5305 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url, | 5323 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url, |
5306 Dart_Handle source, | 5324 Dart_Handle source, |
5307 intptr_t line_offset, | 5325 intptr_t line_offset, |
5308 intptr_t column_offset) { | 5326 intptr_t column_offset) { |
5309 DARTSCOPE(Thread::Current()); | 5327 DARTSCOPE(Thread::Current()); |
5310 const String& url_str = Api::UnwrapStringHandle(I, url); | 5328 const String& url_str = Api::UnwrapStringHandle(Z, url); |
5311 if (url_str.IsNull()) { | 5329 if (url_str.IsNull()) { |
5312 RETURN_TYPE_ERROR(I, url, String); | 5330 RETURN_TYPE_ERROR(Z, url, String); |
5313 } | 5331 } |
5314 const String& source_str = Api::UnwrapStringHandle(I, source); | 5332 const String& source_str = Api::UnwrapStringHandle(Z, source); |
5315 if (source_str.IsNull()) { | 5333 if (source_str.IsNull()) { |
5316 RETURN_TYPE_ERROR(I, source, String); | 5334 RETURN_TYPE_ERROR(Z, source, String); |
5317 } | 5335 } |
5318 if (line_offset < 0) { | 5336 if (line_offset < 0) { |
5319 return Api::NewError("%s: argument 'line_offset' must be positive number", | 5337 return Api::NewError("%s: argument 'line_offset' must be positive number", |
5320 CURRENT_FUNC); | 5338 CURRENT_FUNC); |
5321 } | 5339 } |
5322 if (column_offset < 0) { | 5340 if (column_offset < 0) { |
5323 return Api::NewError("%s: argument 'column_offset' must be positive number", | 5341 return Api::NewError("%s: argument 'column_offset' must be positive number", |
5324 CURRENT_FUNC); | 5342 CURRENT_FUNC); |
5325 } | 5343 } |
5326 CHECK_CALLBACK_STATE(I); | 5344 CHECK_CALLBACK_STATE(I); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5359 } | 5377 } |
5360 } | 5378 } |
5361 return result; | 5379 return result; |
5362 } | 5380 } |
5363 | 5381 |
5364 | 5382 |
5365 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library, | 5383 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library, |
5366 Dart_Handle import, | 5384 Dart_Handle import, |
5367 Dart_Handle prefix) { | 5385 Dart_Handle prefix) { |
5368 DARTSCOPE(Thread::Current()); | 5386 DARTSCOPE(Thread::Current()); |
5369 const Library& library_vm = Api::UnwrapLibraryHandle(I, library); | 5387 const Library& library_vm = Api::UnwrapLibraryHandle(Z, library); |
5370 if (library_vm.IsNull()) { | 5388 if (library_vm.IsNull()) { |
5371 RETURN_TYPE_ERROR(I, library, Library); | 5389 RETURN_TYPE_ERROR(Z, library, Library); |
5372 } | 5390 } |
5373 const Library& import_vm = Api::UnwrapLibraryHandle(I, import); | 5391 const Library& import_vm = Api::UnwrapLibraryHandle(Z, import); |
5374 if (import_vm.IsNull()) { | 5392 if (import_vm.IsNull()) { |
5375 RETURN_TYPE_ERROR(I, import, Library); | 5393 RETURN_TYPE_ERROR(Z, import, Library); |
5376 } | 5394 } |
5377 const Object& prefix_object = Object::Handle(Z, Api::UnwrapHandle(prefix)); | 5395 const Object& prefix_object = Object::Handle(Z, Api::UnwrapHandle(prefix)); |
5378 const String& prefix_vm = prefix_object.IsNull() | 5396 const String& prefix_vm = prefix_object.IsNull() |
5379 ? Symbols::Empty() | 5397 ? Symbols::Empty() |
5380 : String::Cast(prefix_object); | 5398 : String::Cast(prefix_object); |
5381 if (prefix_vm.IsNull()) { | 5399 if (prefix_vm.IsNull()) { |
5382 RETURN_TYPE_ERROR(I, prefix, String); | 5400 RETURN_TYPE_ERROR(Z, prefix, String); |
5383 } | 5401 } |
5384 CHECK_CALLBACK_STATE(I); | 5402 CHECK_CALLBACK_STATE(I); |
5385 CHECK_COMPILATION_ALLOWED(I); | 5403 CHECK_COMPILATION_ALLOWED(I); |
5386 | 5404 |
5387 const String& prefix_symbol = String::Handle(Z, Symbols::New(prefix_vm)); | 5405 const String& prefix_symbol = String::Handle(Z, Symbols::New(prefix_vm)); |
5388 const Namespace& import_ns = Namespace::Handle(Z, | 5406 const Namespace& import_ns = Namespace::Handle(Z, |
5389 Namespace::New(import_vm, Object::null_array(), Object::null_array())); | 5407 Namespace::New(import_vm, Object::null_array(), Object::null_array())); |
5390 if (prefix_vm.Length() == 0) { | 5408 if (prefix_vm.Length() == 0) { |
5391 library_vm.AddImport(import_ns); | 5409 library_vm.AddImport(import_ns); |
5392 } else { | 5410 } else { |
(...skipping 10 matching lines...) Expand all Loading... |
5403 return Api::Success(); | 5421 return Api::Success(); |
5404 } | 5422 } |
5405 | 5423 |
5406 | 5424 |
5407 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library, | 5425 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library, |
5408 Dart_Handle url, | 5426 Dart_Handle url, |
5409 Dart_Handle source, | 5427 Dart_Handle source, |
5410 intptr_t line_offset, | 5428 intptr_t line_offset, |
5411 intptr_t column_offset) { | 5429 intptr_t column_offset) { |
5412 DARTSCOPE(Thread::Current()); | 5430 DARTSCOPE(Thread::Current()); |
5413 const Library& lib = Api::UnwrapLibraryHandle(I, library); | 5431 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
5414 if (lib.IsNull()) { | 5432 if (lib.IsNull()) { |
5415 RETURN_TYPE_ERROR(I, library, Library); | 5433 RETURN_TYPE_ERROR(Z, library, Library); |
5416 } | 5434 } |
5417 const String& url_str = Api::UnwrapStringHandle(I, url); | 5435 const String& url_str = Api::UnwrapStringHandle(Z, url); |
5418 if (url_str.IsNull()) { | 5436 if (url_str.IsNull()) { |
5419 RETURN_TYPE_ERROR(I, url, String); | 5437 RETURN_TYPE_ERROR(Z, url, String); |
5420 } | 5438 } |
5421 const String& source_str = Api::UnwrapStringHandle(I, source); | 5439 const String& source_str = Api::UnwrapStringHandle(Z, source); |
5422 if (source_str.IsNull()) { | 5440 if (source_str.IsNull()) { |
5423 RETURN_TYPE_ERROR(I, source, String); | 5441 RETURN_TYPE_ERROR(Z, source, String); |
5424 } | 5442 } |
5425 if (line_offset < 0) { | 5443 if (line_offset < 0) { |
5426 return Api::NewError("%s: argument 'line_offset' must be positive number", | 5444 return Api::NewError("%s: argument 'line_offset' must be positive number", |
5427 CURRENT_FUNC); | 5445 CURRENT_FUNC); |
5428 } | 5446 } |
5429 if (column_offset < 0) { | 5447 if (column_offset < 0) { |
5430 return Api::NewError("%s: argument 'column_offset' must be positive number", | 5448 return Api::NewError("%s: argument 'column_offset' must be positive number", |
5431 CURRENT_FUNC); | 5449 CURRENT_FUNC); |
5432 } | 5450 } |
5433 CHECK_CALLBACK_STATE(I); | 5451 CHECK_CALLBACK_STATE(I); |
5434 CHECK_COMPILATION_ALLOWED(I); | 5452 CHECK_COMPILATION_ALLOWED(I); |
5435 | 5453 |
5436 NoHeapGrowthControlScope no_growth_control; | 5454 NoHeapGrowthControlScope no_growth_control; |
5437 | 5455 |
5438 const Script& script = Script::Handle(Z, | 5456 const Script& script = Script::Handle(Z, |
5439 Script::New(url_str, source_str, RawScript::kSourceTag)); | 5457 Script::New(url_str, source_str, RawScript::kSourceTag)); |
5440 script.SetLocationOffset(line_offset, column_offset); | 5458 script.SetLocationOffset(line_offset, column_offset); |
5441 Dart_Handle result; | 5459 Dart_Handle result; |
5442 CompileSource(I, lib, script, &result); | 5460 CompileSource(I, lib, script, &result); |
5443 return result; | 5461 return result; |
5444 } | 5462 } |
5445 | 5463 |
5446 | 5464 |
5447 DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library, | 5465 DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library, |
5448 Dart_Handle url, | 5466 Dart_Handle url, |
5449 Dart_Handle patch_source) { | 5467 Dart_Handle patch_source) { |
5450 DARTSCOPE(Thread::Current()); | 5468 DARTSCOPE(Thread::Current()); |
5451 const Library& lib = Api::UnwrapLibraryHandle(I, library); | 5469 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
5452 if (lib.IsNull()) { | 5470 if (lib.IsNull()) { |
5453 RETURN_TYPE_ERROR(I, library, Library); | 5471 RETURN_TYPE_ERROR(Z, library, Library); |
5454 } | 5472 } |
5455 const String& url_str = Api::UnwrapStringHandle(I, url); | 5473 const String& url_str = Api::UnwrapStringHandle(Z, url); |
5456 if (url_str.IsNull()) { | 5474 if (url_str.IsNull()) { |
5457 RETURN_TYPE_ERROR(I, url, String); | 5475 RETURN_TYPE_ERROR(Z, url, String); |
5458 } | 5476 } |
5459 const String& source_str = Api::UnwrapStringHandle(I, patch_source); | 5477 const String& source_str = Api::UnwrapStringHandle(Z, patch_source); |
5460 if (source_str.IsNull()) { | 5478 if (source_str.IsNull()) { |
5461 RETURN_TYPE_ERROR(I, patch_source, String); | 5479 RETURN_TYPE_ERROR(Z, patch_source, String); |
5462 } | 5480 } |
5463 CHECK_CALLBACK_STATE(I); | 5481 CHECK_CALLBACK_STATE(I); |
5464 CHECK_COMPILATION_ALLOWED(I); | 5482 CHECK_COMPILATION_ALLOWED(I); |
5465 | 5483 |
5466 NoHeapGrowthControlScope no_growth_control; | 5484 NoHeapGrowthControlScope no_growth_control; |
5467 | 5485 |
5468 const Script& script = Script::Handle(Z, | 5486 const Script& script = Script::Handle(Z, |
5469 Script::New(url_str, source_str, RawScript::kPatchTag)); | 5487 Script::New(url_str, source_str, RawScript::kPatchTag)); |
5470 Dart_Handle result; | 5488 Dart_Handle result; |
5471 CompileSource(I, lib, script, &result); | 5489 CompileSource(I, lib, script, &result); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5522 } | 5540 } |
5523 return Api::Success(); | 5541 return Api::Success(); |
5524 } | 5542 } |
5525 | 5543 |
5526 | 5544 |
5527 DART_EXPORT Dart_Handle Dart_SetNativeResolver( | 5545 DART_EXPORT Dart_Handle Dart_SetNativeResolver( |
5528 Dart_Handle library, | 5546 Dart_Handle library, |
5529 Dart_NativeEntryResolver resolver, | 5547 Dart_NativeEntryResolver resolver, |
5530 Dart_NativeEntrySymbol symbol) { | 5548 Dart_NativeEntrySymbol symbol) { |
5531 DARTSCOPE(Thread::Current()); | 5549 DARTSCOPE(Thread::Current()); |
5532 const Library& lib = Api::UnwrapLibraryHandle(I, library); | 5550 const Library& lib = Api::UnwrapLibraryHandle(Z, library); |
5533 if (lib.IsNull()) { | 5551 if (lib.IsNull()) { |
5534 RETURN_TYPE_ERROR(I, library, Library); | 5552 RETURN_TYPE_ERROR(Z, library, Library); |
5535 } | 5553 } |
5536 lib.set_native_entry_resolver(resolver); | 5554 lib.set_native_entry_resolver(resolver); |
5537 lib.set_native_entry_symbol_resolver(symbol); | 5555 lib.set_native_entry_symbol_resolver(symbol); |
5538 return Api::Success(); | 5556 return Api::Success(); |
5539 } | 5557 } |
5540 | 5558 |
5541 | 5559 |
5542 // --- Peer support --- | 5560 // --- Peer support --- |
5543 | 5561 |
5544 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) { | 5562 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) { |
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6072 ApiReallocate); | 6090 ApiReallocate); |
6073 writer.WriteFullSnapshot(); | 6091 writer.WriteFullSnapshot(); |
6074 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); | 6092 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); |
6075 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 6093 *isolate_snapshot_size = writer.IsolateSnapshotSize(); |
6076 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); | 6094 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); |
6077 | 6095 |
6078 return Api::Success(); | 6096 return Api::Success(); |
6079 } | 6097 } |
6080 | 6098 |
6081 } // namespace dart | 6099 } // namespace dart |
OLD | NEW |