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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 | 113 |
114 static bool GetNativeStringArgument(NativeArguments* arguments, | 114 static bool GetNativeStringArgument(NativeArguments* arguments, |
115 int arg_index, | 115 int arg_index, |
116 Dart_Handle* str, | 116 Dart_Handle* str, |
117 void** peer) { | 117 void** peer) { |
118 ASSERT(peer != NULL); | 118 ASSERT(peer != NULL); |
119 if (Api::StringGetPeerHelper(arguments, arg_index, peer)) { | 119 if (Api::StringGetPeerHelper(arguments, arg_index, peer)) { |
120 *str = NULL; | 120 *str = NULL; |
121 return true; | 121 return true; |
122 } | 122 } |
123 Isolate* isolate = arguments->isolate(); | 123 Isolate* isolate = arguments->thread()->isolate(); |
124 ASSERT(isolate == Isolate::Current()); | 124 ASSERT(isolate == Isolate::Current()); |
125 *peer = NULL; | 125 *peer = NULL; |
126 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 126 REUSABLE_OBJECT_HANDLESCOPE(isolate); |
127 Object& obj = isolate->ObjectHandle(); | 127 Object& obj = isolate->ObjectHandle(); |
128 obj = arguments->NativeArgAt(arg_index); | 128 obj = arguments->NativeArgAt(arg_index); |
129 if (RawObject::IsStringClassId(obj.GetClassId())) { | 129 if (RawObject::IsStringClassId(obj.GetClassId())) { |
130 ASSERT(isolate->api_state() && | 130 ASSERT(isolate->api_state() && |
131 isolate->api_state()->top_scope() != NULL); | 131 isolate->api_state()->top_scope() != NULL); |
132 *str = Api::NewHandle(isolate, obj.raw()); | 132 *str = Api::NewHandle(isolate, obj.raw()); |
133 return true; | 133 return true; |
134 } | 134 } |
135 if (obj.IsNull()) { | 135 if (obj.IsNull()) { |
136 *str = Api::Null(); | 136 *str = Api::Null(); |
137 return true; | 137 return true; |
138 } | 138 } |
139 return false; | 139 return false; |
140 } | 140 } |
141 | 141 |
142 | 142 |
143 static bool GetNativeIntegerArgument(NativeArguments* arguments, | 143 static bool GetNativeIntegerArgument(NativeArguments* arguments, |
144 int arg_index, | 144 int arg_index, |
145 int64_t* value) { | 145 int64_t* value) { |
146 ASSERT(value != NULL); | 146 ASSERT(value != NULL); |
147 if (Api::GetNativeIntegerArgument(arguments, arg_index, value)) { | 147 if (Api::GetNativeIntegerArgument(arguments, arg_index, value)) { |
148 return true; | 148 return true; |
149 } | 149 } |
150 Isolate* isolate = arguments->isolate(); | 150 Isolate* isolate = arguments->thread()->isolate(); |
151 ASSERT(isolate == Isolate::Current()); | 151 ASSERT(isolate == Isolate::Current()); |
152 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 152 REUSABLE_OBJECT_HANDLESCOPE(isolate); |
153 Object& obj = isolate->ObjectHandle(); | 153 Object& obj = isolate->ObjectHandle(); |
154 obj = arguments->NativeArgAt(arg_index); | 154 obj = arguments->NativeArgAt(arg_index); |
155 intptr_t cid = obj.GetClassId(); | 155 intptr_t cid = obj.GetClassId(); |
156 if (cid == kBigintCid) { | 156 if (cid == kBigintCid) { |
157 const Bigint& bigint = Bigint::Cast(obj); | 157 const Bigint& bigint = Bigint::Cast(obj); |
158 if (bigint.FitsIntoInt64()) { | 158 if (bigint.FitsIntoInt64()) { |
159 *value = bigint.AsInt64Value(); | 159 *value = bigint.AsInt64Value(); |
160 return true; | 160 return true; |
161 } | 161 } |
162 } | 162 } |
163 return false; | 163 return false; |
164 } | 164 } |
165 | 165 |
166 | 166 |
167 static bool GetNativeUnsignedIntegerArgument(NativeArguments* arguments, | 167 static bool GetNativeUnsignedIntegerArgument(NativeArguments* arguments, |
168 int arg_index, | 168 int arg_index, |
169 uint64_t* value) { | 169 uint64_t* value) { |
170 ASSERT(value != NULL); | 170 ASSERT(value != NULL); |
171 int64_t arg_value = 0; | 171 int64_t arg_value = 0; |
172 if (Api::GetNativeIntegerArgument(arguments, arg_index, &arg_value)) { | 172 if (Api::GetNativeIntegerArgument(arguments, arg_index, &arg_value)) { |
173 *value = static_cast<uint64_t>(arg_value); | 173 *value = static_cast<uint64_t>(arg_value); |
174 return true; | 174 return true; |
175 } | 175 } |
176 Isolate* isolate = arguments->isolate(); | 176 Isolate* isolate = arguments->thread()->isolate(); |
177 ASSERT(isolate == Isolate::Current()); | 177 ASSERT(isolate == Isolate::Current()); |
178 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 178 REUSABLE_OBJECT_HANDLESCOPE(isolate); |
179 Object& obj = isolate->ObjectHandle(); | 179 Object& obj = isolate->ObjectHandle(); |
180 obj = arguments->NativeArgAt(arg_index); | 180 obj = arguments->NativeArgAt(arg_index); |
181 intptr_t cid = obj.GetClassId(); | 181 intptr_t cid = obj.GetClassId(); |
182 if (cid == kBigintCid) { | 182 if (cid == kBigintCid) { |
183 const Bigint& bigint = Bigint::Cast(obj); | 183 const Bigint& bigint = Bigint::Cast(obj); |
184 if (bigint.FitsIntoUint64()) { | 184 if (bigint.FitsIntoUint64()) { |
185 *value = bigint.AsUint64Value(); | 185 *value = bigint.AsUint64Value(); |
186 return true; | 186 return true; |
187 } | 187 } |
188 } | 188 } |
189 return false; | 189 return false; |
190 } | 190 } |
191 | 191 |
192 | 192 |
193 static bool GetNativeDoubleArgument(NativeArguments* arguments, | 193 static bool GetNativeDoubleArgument(NativeArguments* arguments, |
194 int arg_index, | 194 int arg_index, |
195 double* value) { | 195 double* value) { |
196 ASSERT(value != NULL); | 196 ASSERT(value != NULL); |
197 if (Api::GetNativeDoubleArgument(arguments, arg_index, value)) { | 197 if (Api::GetNativeDoubleArgument(arguments, arg_index, value)) { |
198 return true; | 198 return true; |
199 } | 199 } |
200 Isolate* isolate = arguments->isolate(); | 200 Isolate* isolate = arguments->thread()->isolate(); |
201 ASSERT(isolate == Isolate::Current()); | 201 ASSERT(isolate == Isolate::Current()); |
202 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 202 REUSABLE_OBJECT_HANDLESCOPE(isolate); |
203 Object& obj = isolate->ObjectHandle(); | 203 Object& obj = isolate->ObjectHandle(); |
204 obj = arguments->NativeArgAt(arg_index); | 204 obj = arguments->NativeArgAt(arg_index); |
205 intptr_t cid = obj.GetClassId(); | 205 intptr_t cid = obj.GetClassId(); |
206 if (cid == kBigintCid) { | 206 if (cid == kBigintCid) { |
207 *value = Bigint::Cast(obj).AsDoubleValue(); | 207 *value = Bigint::Cast(obj).AsDoubleValue(); |
208 return true; | 208 return true; |
209 } | 209 } |
210 return false; | 210 return false; |
211 } | 211 } |
212 | 212 |
213 | 213 |
214 static Dart_Handle GetNativeFieldsOfArgument(NativeArguments* arguments, | 214 static Dart_Handle GetNativeFieldsOfArgument(NativeArguments* arguments, |
215 int arg_index, | 215 int arg_index, |
216 int num_fields, | 216 int num_fields, |
217 intptr_t* field_values, | 217 intptr_t* field_values, |
218 const char* current_func) { | 218 const char* current_func) { |
219 ASSERT(field_values != NULL); | 219 ASSERT(field_values != NULL); |
220 if (Api::GetNativeFieldsOfArgument(arguments, | 220 if (Api::GetNativeFieldsOfArgument(arguments, |
221 arg_index, | 221 arg_index, |
222 num_fields, | 222 num_fields, |
223 field_values)) { | 223 field_values)) { |
224 return Api::Success(); | 224 return Api::Success(); |
225 } | 225 } |
226 Isolate* isolate = arguments->isolate(); | 226 Isolate* isolate = arguments->thread()->isolate(); |
227 ASSERT(isolate == Isolate::Current()); | 227 ASSERT(isolate == Isolate::Current()); |
228 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 228 REUSABLE_OBJECT_HANDLESCOPE(isolate); |
229 Object& obj = isolate->ObjectHandle(); | 229 Object& obj = isolate->ObjectHandle(); |
230 obj = arguments->NativeArgAt(arg_index); | 230 obj = arguments->NativeArgAt(arg_index); |
231 if (obj.IsNull()) { | 231 if (obj.IsNull()) { |
232 memset(field_values, 0, (num_fields * sizeof(field_values[0]))); | 232 memset(field_values, 0, (num_fields * sizeof(field_values[0]))); |
233 return Api::Success(); | 233 return Api::Success(); |
234 } | 234 } |
235 // We did not succeed in extracting the native fields report the | 235 // We did not succeed in extracting the native fields report the |
236 // appropriate error. | 236 // appropriate error. |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 } | 481 } |
482 intptr_t cid = raw_obj->GetClassId(); | 482 intptr_t cid = raw_obj->GetClassId(); |
483 if (cid == kExternalOneByteStringCid) { | 483 if (cid == kExternalOneByteStringCid) { |
484 RawExternalOneByteString* raw_string = | 484 RawExternalOneByteString* raw_string = |
485 reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr(); | 485 reinterpret_cast<RawExternalOneByteString*>(raw_obj)->ptr(); |
486 ExternalStringData<uint8_t>* data = raw_string->external_data_; | 486 ExternalStringData<uint8_t>* data = raw_string->external_data_; |
487 *peer = data->peer(); | 487 *peer = data->peer(); |
488 return true; | 488 return true; |
489 } | 489 } |
490 if (cid == kOneByteStringCid || cid == kTwoByteStringCid) { | 490 if (cid == kOneByteStringCid || cid == kTwoByteStringCid) { |
491 Isolate* isolate = arguments->isolate(); | 491 Isolate* isolate = arguments->thread()->isolate(); |
492 *peer = isolate->heap()->GetPeer(raw_obj); | 492 *peer = isolate->heap()->GetPeer(raw_obj); |
493 return (*peer != 0); | 493 return (*peer != 0); |
494 } | 494 } |
495 if (cid == kExternalTwoByteStringCid) { | 495 if (cid == kExternalTwoByteStringCid) { |
496 RawExternalTwoByteString* raw_string = | 496 RawExternalTwoByteString* raw_string = |
497 reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); | 497 reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); |
498 ExternalStringData<uint16_t>* data = raw_string->external_data_; | 498 ExternalStringData<uint16_t>* data = raw_string->external_data_; |
499 *peer = data->peer(); | 499 *peer = data->peer(); |
500 return true; | 500 return true; |
501 } | 501 } |
(...skipping 2198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2700 | 2700 |
2701 | 2701 |
2702 static RawObject* ResolveConstructor(const char* current_func, | 2702 static RawObject* ResolveConstructor(const char* current_func, |
2703 const Class& cls, | 2703 const Class& cls, |
2704 const String& class_name, | 2704 const String& class_name, |
2705 const String& dotted_name, | 2705 const String& dotted_name, |
2706 int num_args); | 2706 int num_args); |
2707 | 2707 |
2708 | 2708 |
2709 static RawObject* ThrowArgumentError(const char* exception_message) { | 2709 static RawObject* ThrowArgumentError(const char* exception_message) { |
2710 Isolate* isolate = Isolate::Current(); | 2710 Thread* thread = Thread::Current(); |
| 2711 Isolate* isolate = thread->isolate(); |
2711 // Lookup the class ArgumentError in dart:core. | 2712 // Lookup the class ArgumentError in dart:core. |
2712 const String& lib_url = String::Handle(String::New("dart:core")); | 2713 const String& lib_url = String::Handle(String::New("dart:core")); |
2713 const String& class_name = String::Handle(String::New("ArgumentError")); | 2714 const String& class_name = String::Handle(String::New("ArgumentError")); |
2714 const Library& lib = | 2715 const Library& lib = |
2715 Library::Handle(isolate, Library::LookupLibrary(lib_url)); | 2716 Library::Handle(isolate, Library::LookupLibrary(lib_url)); |
2716 if (lib.IsNull()) { | 2717 if (lib.IsNull()) { |
2717 const String& message = String::Handle( | 2718 const String& message = String::Handle( |
2718 String::NewFormatted("%s: library '%s' not found.", | 2719 String::NewFormatted("%s: library '%s' not found.", |
2719 CURRENT_FUNC, lib_url.ToCString())); | 2720 CURRENT_FUNC, lib_url.ToCString())); |
2720 return ApiError::New(message); | 2721 return ApiError::New(message); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2758 // exception. | 2759 // exception. |
2759 ApiState* state = isolate->api_state(); | 2760 ApiState* state = isolate->api_state(); |
2760 ASSERT(state != NULL); | 2761 ASSERT(state != NULL); |
2761 const Instance* saved_exception; | 2762 const Instance* saved_exception; |
2762 { | 2763 { |
2763 NoSafepointScope no_safepoint; | 2764 NoSafepointScope no_safepoint; |
2764 RawInstance* raw_exception = exception.raw(); | 2765 RawInstance* raw_exception = exception.raw(); |
2765 state->UnwindScopes(isolate->top_exit_frame_info()); | 2766 state->UnwindScopes(isolate->top_exit_frame_info()); |
2766 saved_exception = &Instance::Handle(raw_exception); | 2767 saved_exception = &Instance::Handle(raw_exception); |
2767 } | 2768 } |
2768 Exceptions::Throw(isolate, *saved_exception); | 2769 Exceptions::Throw(thread, *saved_exception); |
2769 const String& message = String::Handle( | 2770 const String& message = String::Handle( |
2770 String::New("Exception was not thrown, internal error")); | 2771 String::New("Exception was not thrown, internal error")); |
2771 return ApiError::New(message); | 2772 return ApiError::New(message); |
2772 } | 2773 } |
2773 | 2774 |
2774 // TODO(sgjesse): value should always be smaller then 0xff. Add error handling. | 2775 // TODO(sgjesse): value should always be smaller then 0xff. Add error handling. |
2775 #define GET_LIST_ELEMENT_AS_BYTES(isolate, type, obj, native_array, offset, \ | 2776 #define GET_LIST_ELEMENT_AS_BYTES(isolate, type, obj, native_array, offset, \ |
2776 length) \ | 2777 length) \ |
2777 const type& array = type::Cast(obj); \ | 2778 const type& array = type::Cast(obj); \ |
2778 if (Utils::RangeCheck(offset, length, array.Length())) { \ | 2779 if (Utils::RangeCheck(offset, length, array.Length())) { \ |
(...skipping 1651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4430 } | 4431 } |
4431 return Api::NewError( | 4432 return Api::NewError( |
4432 "%s expects argument 'container' to be an object, type, or library.", | 4433 "%s expects argument 'container' to be an object, type, or library.", |
4433 CURRENT_FUNC); | 4434 CURRENT_FUNC); |
4434 } | 4435 } |
4435 | 4436 |
4436 | 4437 |
4437 // --- Exceptions ---- | 4438 // --- Exceptions ---- |
4438 | 4439 |
4439 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { | 4440 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { |
4440 Isolate* isolate = Isolate::Current(); | 4441 Thread* thread = Thread::Current(); |
| 4442 Isolate* isolate = thread->isolate(); |
4441 CHECK_ISOLATE(isolate); | 4443 CHECK_ISOLATE(isolate); |
4442 CHECK_CALLBACK_STATE(isolate); | 4444 CHECK_CALLBACK_STATE(isolate); |
4443 { | 4445 { |
4444 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); | 4446 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); |
4445 if (excp.IsNull()) { | 4447 if (excp.IsNull()) { |
4446 RETURN_TYPE_ERROR(isolate, exception, Instance); | 4448 RETURN_TYPE_ERROR(isolate, exception, Instance); |
4447 } | 4449 } |
4448 } | 4450 } |
4449 if (isolate->top_exit_frame_info() == 0) { | 4451 if (isolate->top_exit_frame_info() == 0) { |
4450 // There are no dart frames on the stack so it would be illegal to | 4452 // There are no dart frames on the stack so it would be illegal to |
4451 // throw an exception here. | 4453 // throw an exception here. |
4452 return Api::NewError("No Dart frames on stack, cannot throw exception"); | 4454 return Api::NewError("No Dart frames on stack, cannot throw exception"); |
4453 } | 4455 } |
4454 | 4456 |
4455 // Unwind all the API scopes till the exit frame before throwing an | 4457 // Unwind all the API scopes till the exit frame before throwing an |
4456 // exception. | 4458 // exception. |
4457 ApiState* state = isolate->api_state(); | 4459 ApiState* state = isolate->api_state(); |
4458 ASSERT(state != NULL); | 4460 ASSERT(state != NULL); |
4459 const Instance* saved_exception; | 4461 const Instance* saved_exception; |
4460 { | 4462 { |
4461 NoSafepointScope no_safepoint; | 4463 NoSafepointScope no_safepoint; |
4462 RawInstance* raw_exception = | 4464 RawInstance* raw_exception = |
4463 Api::UnwrapInstanceHandle(isolate, exception).raw(); | 4465 Api::UnwrapInstanceHandle(isolate, exception).raw(); |
4464 state->UnwindScopes(isolate->top_exit_frame_info()); | 4466 state->UnwindScopes(isolate->top_exit_frame_info()); |
4465 saved_exception = &Instance::Handle(raw_exception); | 4467 saved_exception = &Instance::Handle(raw_exception); |
4466 } | 4468 } |
4467 Exceptions::Throw(isolate, *saved_exception); | 4469 Exceptions::Throw(thread, *saved_exception); |
4468 return Api::NewError("Exception was not thrown, internal error"); | 4470 return Api::NewError("Exception was not thrown, internal error"); |
4469 } | 4471 } |
4470 | 4472 |
4471 | 4473 |
4472 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, | 4474 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, |
4473 Dart_Handle stacktrace) { | 4475 Dart_Handle stacktrace) { |
4474 Isolate* isolate = Isolate::Current(); | 4476 Thread* thread = Thread::Current(); |
| 4477 Isolate* isolate = thread->isolate(); |
4475 CHECK_ISOLATE(isolate); | 4478 CHECK_ISOLATE(isolate); |
4476 CHECK_CALLBACK_STATE(isolate); | 4479 CHECK_CALLBACK_STATE(isolate); |
4477 { | 4480 { |
4478 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); | 4481 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); |
4479 if (excp.IsNull()) { | 4482 if (excp.IsNull()) { |
4480 RETURN_TYPE_ERROR(isolate, exception, Instance); | 4483 RETURN_TYPE_ERROR(isolate, exception, Instance); |
4481 } | 4484 } |
4482 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace); | 4485 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace); |
4483 if (stk.IsNull()) { | 4486 if (stk.IsNull()) { |
4484 RETURN_TYPE_ERROR(isolate, stacktrace, Instance); | 4487 RETURN_TYPE_ERROR(isolate, stacktrace, Instance); |
(...skipping 14 matching lines...) Expand all Loading... |
4499 { | 4502 { |
4500 NoSafepointScope no_safepoint; | 4503 NoSafepointScope no_safepoint; |
4501 RawInstance* raw_exception = | 4504 RawInstance* raw_exception = |
4502 Api::UnwrapInstanceHandle(isolate, exception).raw(); | 4505 Api::UnwrapInstanceHandle(isolate, exception).raw(); |
4503 RawStacktrace* raw_stacktrace = | 4506 RawStacktrace* raw_stacktrace = |
4504 Api::UnwrapStacktraceHandle(isolate, stacktrace).raw(); | 4507 Api::UnwrapStacktraceHandle(isolate, stacktrace).raw(); |
4505 state->UnwindScopes(isolate->top_exit_frame_info()); | 4508 state->UnwindScopes(isolate->top_exit_frame_info()); |
4506 saved_exception = &Instance::Handle(raw_exception); | 4509 saved_exception = &Instance::Handle(raw_exception); |
4507 saved_stacktrace = &Stacktrace::Handle(raw_stacktrace); | 4510 saved_stacktrace = &Stacktrace::Handle(raw_stacktrace); |
4508 } | 4511 } |
4509 Exceptions::ReThrow(isolate, *saved_exception, *saved_stacktrace); | 4512 Exceptions::ReThrow(thread, *saved_exception, *saved_stacktrace); |
4510 return Api::NewError("Exception was not re thrown, internal error"); | 4513 return Api::NewError("Exception was not re thrown, internal error"); |
4511 } | 4514 } |
4512 | 4515 |
4513 | 4516 |
4514 // --- Native fields and functions --- | 4517 // --- Native fields and functions --- |
4515 | 4518 |
4516 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, | 4519 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, |
4517 Dart_Handle name, | 4520 Dart_Handle name, |
4518 int field_count) { | 4521 int field_count) { |
4519 Isolate* isolate = Isolate::Current(); | 4522 Isolate* isolate = Isolate::Current(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4591 "%s: invalid index %d passed in to set native instance field", | 4594 "%s: invalid index %d passed in to set native instance field", |
4592 CURRENT_FUNC, index); | 4595 CURRENT_FUNC, index); |
4593 } | 4596 } |
4594 instance.SetNativeField(index, value); | 4597 instance.SetNativeField(index, value); |
4595 return Api::Success(); | 4598 return Api::Success(); |
4596 } | 4599 } |
4597 | 4600 |
4598 | 4601 |
4599 DART_EXPORT void* Dart_GetNativeIsolateData(Dart_NativeArguments args) { | 4602 DART_EXPORT void* Dart_GetNativeIsolateData(Dart_NativeArguments args) { |
4600 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4603 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4601 Isolate* isolate = arguments->isolate(); | 4604 Isolate* isolate = arguments->thread()->isolate(); |
4602 ASSERT(isolate == Isolate::Current()); | 4605 ASSERT(isolate == Isolate::Current()); |
4603 return isolate->init_callback_data(); | 4606 return isolate->init_callback_data(); |
4604 } | 4607 } |
4605 | 4608 |
4606 | 4609 |
4607 DART_EXPORT Dart_Handle Dart_GetNativeArguments( | 4610 DART_EXPORT Dart_Handle Dart_GetNativeArguments( |
4608 Dart_NativeArguments args, | 4611 Dart_NativeArguments args, |
4609 int num_arguments, | 4612 int num_arguments, |
4610 const Dart_NativeArgument_Descriptor* argument_descriptors, | 4613 const Dart_NativeArgument_Descriptor* argument_descriptors, |
4611 Dart_NativeArgument_Value* arg_values) { | 4614 Dart_NativeArgument_Value* arg_values) { |
4612 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4615 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4613 ASSERT(arguments->isolate() == Isolate::Current()); | 4616 ASSERT(arguments->thread()->isolate() == Isolate::Current()); |
4614 if (arg_values == NULL) { | 4617 if (arg_values == NULL) { |
4615 RETURN_NULL_ERROR(arg_values); | 4618 RETURN_NULL_ERROR(arg_values); |
4616 } | 4619 } |
4617 for (int i = 0; i < num_arguments; i++) { | 4620 for (int i = 0; i < num_arguments; i++) { |
4618 Dart_NativeArgument_Descriptor desc = argument_descriptors[i]; | 4621 Dart_NativeArgument_Descriptor desc = argument_descriptors[i]; |
4619 Dart_NativeArgument_Type arg_type = static_cast<Dart_NativeArgument_Type>( | 4622 Dart_NativeArgument_Type arg_type = static_cast<Dart_NativeArgument_Type>( |
4620 desc.type); | 4623 desc.type); |
4621 int arg_index = desc.index; | 4624 int arg_index = desc.index; |
4622 ASSERT(arg_index >= 0 && arg_index < arguments->NativeArgCount()); | 4625 ASSERT(arg_index >= 0 && arg_index < arguments->NativeArgCount()); |
4623 Dart_NativeArgument_Value* native_value = &(arg_values[i]); | 4626 Dart_NativeArgument_Value* native_value = &(arg_values[i]); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4713 native_value->as_native_fields.num_fields, | 4716 native_value->as_native_fields.num_fields, |
4714 native_value->as_native_fields.values, | 4717 native_value->as_native_fields.values, |
4715 CURRENT_FUNC); | 4718 CURRENT_FUNC); |
4716 if (result != Api::Success()) { | 4719 if (result != Api::Success()) { |
4717 return result; | 4720 return result; |
4718 } | 4721 } |
4719 break; | 4722 break; |
4720 } | 4723 } |
4721 | 4724 |
4722 case Dart_NativeArgument_kInstance: { | 4725 case Dart_NativeArgument_kInstance: { |
4723 Isolate* isolate = arguments->isolate(); | 4726 Isolate* isolate = arguments->thread()->isolate(); |
4724 ASSERT(isolate == Isolate::Current()); | 4727 ASSERT(isolate == Isolate::Current()); |
4725 ASSERT(isolate->api_state() && | 4728 ASSERT(isolate->api_state() && |
4726 isolate->api_state()->top_scope() != NULL); | 4729 isolate->api_state()->top_scope() != NULL); |
4727 native_value->as_instance = | 4730 native_value->as_instance = |
4728 Api::NewHandle(isolate, arguments->NativeArgAt(arg_index)); | 4731 Api::NewHandle(isolate, arguments->NativeArgAt(arg_index)); |
4729 break; | 4732 break; |
4730 } | 4733 } |
4731 | 4734 |
4732 default: | 4735 default: |
4733 return Api::NewError("%s: invalid argument type %d.", | 4736 return Api::NewError("%s: invalid argument type %d.", |
4734 CURRENT_FUNC, arg_type); | 4737 CURRENT_FUNC, arg_type); |
4735 } | 4738 } |
4736 } | 4739 } |
4737 return Api::Success(); | 4740 return Api::Success(); |
4738 } | 4741 } |
4739 | 4742 |
4740 | 4743 |
4741 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, | 4744 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, |
4742 int index) { | 4745 int index) { |
4743 TRACE_API_CALL(CURRENT_FUNC); | 4746 TRACE_API_CALL(CURRENT_FUNC); |
4744 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4747 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4745 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4748 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
4746 return Api::NewError( | 4749 return Api::NewError( |
4747 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4750 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
4748 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4751 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
4749 } | 4752 } |
4750 return Api::NewHandle(arguments->isolate(), arguments->NativeArgAt(index)); | 4753 return Api::NewHandle(arguments->thread()->isolate(), |
| 4754 arguments->NativeArgAt(index)); |
4751 } | 4755 } |
4752 | 4756 |
4753 | 4757 |
4754 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { | 4758 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { |
4755 TRACE_API_CALL(CURRENT_FUNC); | 4759 TRACE_API_CALL(CURRENT_FUNC); |
4756 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4760 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4757 return arguments->NativeArgCount(); | 4761 return arguments->NativeArgCount(); |
4758 } | 4762 } |
4759 | 4763 |
4760 | 4764 |
(...skipping 15 matching lines...) Expand all Loading... |
4776 arg_index, | 4780 arg_index, |
4777 num_fields, | 4781 num_fields, |
4778 field_values, | 4782 field_values, |
4779 CURRENT_FUNC); | 4783 CURRENT_FUNC); |
4780 } | 4784 } |
4781 | 4785 |
4782 | 4786 |
4783 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, | 4787 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, |
4784 intptr_t* value) { | 4788 intptr_t* value) { |
4785 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4789 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4786 ASSERT(arguments->isolate() == Isolate::Current()); | 4790 ASSERT(arguments->thread()->isolate() == Isolate::Current()); |
4787 if (value == NULL) { | 4791 if (value == NULL) { |
4788 RETURN_NULL_ERROR(value); | 4792 RETURN_NULL_ERROR(value); |
4789 } | 4793 } |
4790 if (Api::GetNativeReceiver(arguments, value)) { | 4794 if (Api::GetNativeReceiver(arguments, value)) { |
4791 return Api::Success(); | 4795 return Api::Success(); |
4792 } | 4796 } |
4793 return Api::NewError("%s expects receiver argument to be non-null and of" | 4797 return Api::NewError("%s expects receiver argument to be non-null and of" |
4794 " type Instance.", CURRENT_FUNC); | 4798 " type Instance.", CURRENT_FUNC); |
4795 } | 4799 } |
4796 | 4800 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4858 return Api::NewError("%s: expects argument at %d to be of" | 4862 return Api::NewError("%s: expects argument at %d to be of" |
4859 " type Double.", CURRENT_FUNC, index); | 4863 " type Double.", CURRENT_FUNC, index); |
4860 } | 4864 } |
4861 return Api::Success(); | 4865 return Api::Success(); |
4862 } | 4866 } |
4863 | 4867 |
4864 | 4868 |
4865 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, | 4869 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, |
4866 Dart_Handle retval) { | 4870 Dart_Handle retval) { |
4867 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4871 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4868 ASSERT(arguments->isolate() == Isolate::Current()); | 4872 ASSERT(arguments->thread()->isolate() == Isolate::Current()); |
4869 if ((retval != Api::Null()) && (!Api::IsInstance(retval))) { | 4873 if ((retval != Api::Null()) && (!Api::IsInstance(retval))) { |
4870 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); | 4874 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); |
4871 FATAL1("Return value check failed: saw '%s' expected a dart Instance.", | 4875 FATAL1("Return value check failed: saw '%s' expected a dart Instance.", |
4872 ret_obj.ToCString()); | 4876 ret_obj.ToCString()); |
4873 } | 4877 } |
4874 ASSERT(retval != 0); | 4878 ASSERT(retval != 0); |
4875 Api::SetReturnValue(arguments, retval); | 4879 Api::SetReturnValue(arguments, retval); |
4876 } | 4880 } |
4877 | 4881 |
4878 | 4882 |
4879 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, | 4883 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, |
4880 Dart_WeakPersistentHandle rval) { | 4884 Dart_WeakPersistentHandle rval) { |
4881 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4885 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4882 #if defined(DEBUG) | 4886 #if defined(DEBUG) |
4883 Isolate* isolate = arguments->isolate(); | 4887 Isolate* isolate = arguments->thread()->isolate(); |
4884 ASSERT(isolate == Isolate::Current()); | 4888 ASSERT(isolate == Isolate::Current()); |
4885 ASSERT(isolate->api_state() != NULL && | 4889 ASSERT(isolate->api_state() != NULL && |
4886 (isolate->api_state()->IsValidWeakPersistentHandle(rval) || | 4890 (isolate->api_state()->IsValidWeakPersistentHandle(rval) || |
4887 isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval))); | 4891 isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval))); |
4888 #endif | 4892 #endif |
4889 Api::SetWeakHandleReturnValue(arguments, rval); | 4893 Api::SetWeakHandleReturnValue(arguments, rval); |
4890 } | 4894 } |
4891 | 4895 |
4892 | 4896 |
4893 // --- Environment --- | 4897 // --- Environment --- |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4937 bool retval) { | 4941 bool retval) { |
4938 TRACE_API_CALL(CURRENT_FUNC); | 4942 TRACE_API_CALL(CURRENT_FUNC); |
4939 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4943 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4940 arguments->SetReturn(Bool::Get(retval)); | 4944 arguments->SetReturn(Bool::Get(retval)); |
4941 } | 4945 } |
4942 | 4946 |
4943 | 4947 |
4944 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, | 4948 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, |
4945 int64_t retval) { | 4949 int64_t retval) { |
4946 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4950 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4947 ASSERT(arguments->isolate() == Isolate::Current()); | 4951 ASSERT(arguments->thread()->isolate() == Isolate::Current()); |
4948 if (Smi::IsValid(retval)) { | 4952 if (Smi::IsValid(retval)) { |
4949 Api::SetSmiReturnValue(arguments, static_cast<intptr_t>(retval)); | 4953 Api::SetSmiReturnValue(arguments, static_cast<intptr_t>(retval)); |
4950 } else { | 4954 } else { |
4951 // Slow path for Mints and Bigints. | 4955 // Slow path for Mints and Bigints. |
4952 ASSERT_CALLBACK_STATE(arguments->isolate()); | 4956 ASSERT_CALLBACK_STATE(arguments->thread()->isolate()); |
4953 Api::SetIntegerReturnValue(arguments, retval); | 4957 Api::SetIntegerReturnValue(arguments, retval); |
4954 } | 4958 } |
4955 } | 4959 } |
4956 | 4960 |
4957 | 4961 |
4958 DART_EXPORT void Dart_SetDoubleReturnValue(Dart_NativeArguments args, | 4962 DART_EXPORT void Dart_SetDoubleReturnValue(Dart_NativeArguments args, |
4959 double retval) { | 4963 double retval) { |
4960 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4964 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
4961 #if defined(DEBUG) | 4965 #if defined(DEBUG) |
4962 Isolate* isolate = arguments->isolate(); | 4966 Isolate* isolate = arguments->thread()->isolate(); |
4963 ASSERT(isolate == Isolate::Current()); | 4967 ASSERT(isolate == Isolate::Current()); |
4964 ASSERT_CALLBACK_STATE(isolate); | 4968 ASSERT_CALLBACK_STATE(isolate); |
4965 #endif | 4969 #endif |
4966 Api::SetDoubleReturnValue(arguments, retval); | 4970 Api::SetDoubleReturnValue(arguments, retval); |
4967 } | 4971 } |
4968 | 4972 |
4969 | 4973 |
4970 // --- Scripts and Libraries --- | 4974 // --- Scripts and Libraries --- |
4971 | 4975 |
4972 DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler( | 4976 DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler( |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5575 | 5579 |
5576 | 5580 |
5577 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( | 5581 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( |
5578 const char* name, | 5582 const char* name, |
5579 Dart_ServiceRequestCallback callback, | 5583 Dart_ServiceRequestCallback callback, |
5580 void* user_data) { | 5584 void* user_data) { |
5581 Service::RegisterRootEmbedderCallback(name, callback, user_data); | 5585 Service::RegisterRootEmbedderCallback(name, callback, user_data); |
5582 } | 5586 } |
5583 | 5587 |
5584 } // namespace dart | 5588 } // namespace dart |
OLD | NEW |