Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(315)

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 1156143003: Refactor Isolate -> Thread in NativeArguments and exception handler jump. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Port to all archs. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/code_generator.cc ('k') | runtime/vm/exceptions.h » ('j') | runtime/vm/exceptions.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698