| 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 |