Chromium Code Reviews| 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/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 TypeArguments::Handle(isolate), | 74 TypeArguments::Handle(isolate), |
| 75 &malformed_type_error)) { | 75 &malformed_type_error)) { |
| 76 ASSERT(malformed_type_error.IsNull()); // Type is a raw List. | 76 ASSERT(malformed_type_error.IsNull()); // Type is a raw List. |
| 77 return instance.raw(); | 77 return instance.raw(); |
| 78 } | 78 } |
| 79 } | 79 } |
| 80 return Instance::null(); | 80 return Instance::null(); |
| 81 } | 81 } |
| 82 | 82 |
| 83 | 83 |
| 84 static bool GetNativeStringArgument(NativeArguments* arguments, | |
| 85 int arg_index, | |
| 86 Dart_Handle* str, | |
| 87 void** peer) { | |
| 88 ASSERT(peer != NULL); | |
| 89 if (Api::StringGetPeerHelper(arguments, arg_index, peer)) { | |
| 90 *str = NULL; | |
| 91 return true; | |
| 92 } | |
| 93 Isolate* isolate = arguments->isolate(); | |
| 94 ASSERT(isolate == Isolate::Current()); | |
| 95 *peer = NULL; | |
| 96 REUSABLE_OBJECT_HANDLESCOPE(isolate); | |
| 97 Object& obj = isolate->ObjectHandle(); | |
| 98 obj = arguments->NativeArgAt(arg_index); | |
| 99 if (RawObject::IsStringClassId(obj.GetClassId())) { | |
| 100 ASSERT(isolate->api_state() && | |
| 101 isolate->api_state()->top_scope() != NULL); | |
| 102 *str = Api::NewHandle(isolate, obj.raw()); | |
| 103 return true; | |
| 104 } | |
| 105 if (obj.IsNull()) { | |
| 106 *str = Api::Null(); | |
| 107 return true; | |
| 108 } | |
| 109 return false; | |
| 110 } | |
| 111 | |
| 112 | |
| 113 static bool GetNativeIntegerArgument(NativeArguments* arguments, | |
| 114 int arg_index, | |
| 115 int64_t* value) { | |
| 116 ASSERT(value != NULL); | |
| 117 if (Api::GetNativeIntegerArgument(arguments, arg_index, value)) { | |
| 118 return true; | |
| 119 } | |
| 120 Isolate* isolate = arguments->isolate(); | |
| 121 ASSERT(isolate == Isolate::Current()); | |
| 122 REUSABLE_OBJECT_HANDLESCOPE(isolate); | |
| 123 Object& obj = isolate->ObjectHandle(); | |
| 124 obj = arguments->NativeArgAt(arg_index); | |
| 125 intptr_t cid = obj.GetClassId(); | |
| 126 if (cid == kBigintCid) { | |
| 127 const Bigint& bigint = Bigint::Cast(obj); | |
| 128 if (BigintOperations::FitsIntoInt64(bigint)) { | |
| 129 *value = BigintOperations::ToInt64(bigint); | |
|
Ivan Posva
2014/05/20 19:27:03
What if we wanted a uint64_t? Will this still "fit
siva
2014/05/21 23:56:54
No for the uint64_t I added a new GetNativeUnsigne
| |
| 130 return true; | |
| 131 } | |
| 132 } | |
| 133 return false; | |
| 134 } | |
| 135 | |
| 136 | |
| 137 static bool GetNativeDoubleArgument(NativeArguments* arguments, | |
| 138 int arg_index, | |
| 139 double* value) { | |
| 140 ASSERT(value != NULL); | |
| 141 if (Api::GetNativeDoubleArgument(arguments, arg_index, value)) { | |
| 142 return true; | |
| 143 } | |
| 144 Isolate* isolate = arguments->isolate(); | |
| 145 ASSERT(isolate == Isolate::Current()); | |
| 146 REUSABLE_OBJECT_HANDLESCOPE(isolate); | |
| 147 Object& obj = isolate->ObjectHandle(); | |
| 148 obj = arguments->NativeArgAt(arg_index); | |
| 149 intptr_t cid = obj.GetClassId(); | |
| 150 if (cid == kBigintCid) { | |
| 151 *value = Bigint::Cast(obj).AsDoubleValue(); | |
| 152 return true; | |
| 153 } | |
| 154 return false; | |
| 155 } | |
| 156 | |
| 157 | |
| 158 static Dart_Handle GetNativeFieldsOfArgument(NativeArguments* arguments, | |
| 159 int arg_index, | |
| 160 int num_fields, | |
| 161 intptr_t* field_values, | |
| 162 const char* current_func) { | |
| 163 ASSERT(field_values != NULL); | |
| 164 if (Api::GetNativeFieldsOfArgument(arguments, | |
| 165 arg_index, | |
| 166 num_fields, | |
| 167 field_values)) { | |
| 168 return Api::Success(); | |
| 169 } | |
| 170 Isolate* isolate = arguments->isolate(); | |
| 171 ASSERT(isolate == Isolate::Current()); | |
| 172 REUSABLE_OBJECT_HANDLESCOPE(isolate); | |
| 173 Object& obj = isolate->ObjectHandle(); | |
| 174 obj = arguments->NativeArgAt(arg_index); | |
| 175 if (obj.IsNull()) { | |
| 176 memset(field_values, 0, (num_fields * sizeof(field_values[0]))); | |
| 177 return Api::Success(); | |
| 178 } | |
| 179 // We did not succeed in extracting the native fields report the | |
| 180 // appropriate error. | |
| 181 if (!obj.IsInstance()) { | |
| 182 return Api::NewError("%s expects argument at index '%d' to be of" | |
| 183 " type Instance.", current_func, arg_index); | |
| 184 } | |
| 185 const Instance& instance = Instance::Cast(obj); | |
| 186 int field_count = instance.NumNativeFields(); | |
| 187 ASSERT(num_fields != field_count); | |
| 188 return Api::NewError( | |
| 189 "%s: expected %d 'num_fields' but was passed in %d.", | |
| 190 current_func, field_count, num_fields); | |
| 191 } | |
| 192 | |
| 193 | |
| 84 Heap::Space SpaceForExternal(Isolate* isolate, intptr_t size) { | 194 Heap::Space SpaceForExternal(Isolate* isolate, intptr_t size) { |
| 85 Heap* heap = isolate->heap(); | 195 Heap* heap = isolate->heap(); |
| 86 // If 'size' would be a significant fraction of new space, then use old. | 196 // If 'size' would be a significant fraction of new space, then use old. |
| 87 static const int kExtNewRatio = 16; | 197 static const int kExtNewRatio = 16; |
| 88 if (size > (heap->CapacityInWords(Heap::kNew) * kWordSize) / kExtNewRatio) { | 198 if (size > (heap->CapacityInWords(Heap::kNew) * kWordSize) / kExtNewRatio) { |
| 89 return Heap::kOld; | 199 return Heap::kOld; |
| 90 } else { | 200 } else { |
| 91 return Heap::kNew; | 201 return Heap::kNew; |
| 92 } | 202 } |
| 93 } | 203 } |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 } | 459 } |
| 350 if (cid == kNullCid) { | 460 if (cid == kNullCid) { |
| 351 *value = false; | 461 *value = false; |
| 352 return true; | 462 return true; |
| 353 } | 463 } |
| 354 } | 464 } |
| 355 return false; | 465 return false; |
| 356 } | 466 } |
| 357 | 467 |
| 358 | 468 |
| 469 bool Api::GetNativeIntegerArgument(NativeArguments* arguments, | |
| 470 int arg_index, | |
| 471 int64_t* value) { | |
| 472 NoGCScope no_gc_scope; | |
| 473 RawObject* raw_obj = arguments->NativeArgAt(arg_index); | |
| 474 if (raw_obj->IsHeapObject()) { | |
| 475 intptr_t cid = raw_obj->GetClassId(); | |
| 476 if (cid == kMintCid) { | |
| 477 *value = reinterpret_cast<RawMint*>(raw_obj)->ptr()->value_; | |
| 478 return true; | |
| 479 } | |
| 480 return false; | |
| 481 } | |
| 482 *value = Smi::Value(reinterpret_cast<RawSmi*>(raw_obj)); | |
| 483 return true; | |
| 484 } | |
| 485 | |
| 486 | |
| 487 bool Api::GetNativeDoubleArgument(NativeArguments* arguments, | |
| 488 int arg_index, | |
| 489 double* value) { | |
| 490 NoGCScope no_gc_scope; | |
| 491 RawObject* raw_obj = arguments->NativeArgAt(arg_index); | |
| 492 if (raw_obj->IsHeapObject()) { | |
| 493 intptr_t cid = raw_obj->GetClassId(); | |
| 494 if (cid == kDoubleCid) { | |
| 495 *value = reinterpret_cast<RawDouble*>(raw_obj)->ptr()->value_; | |
| 496 return true; | |
| 497 } | |
| 498 if (cid == kMintCid) { | |
| 499 *value = static_cast<double>( | |
| 500 reinterpret_cast<RawMint*>(raw_obj)->ptr()->value_); | |
| 501 return true; | |
| 502 } | |
| 503 return false; | |
| 504 } | |
| 505 *value = static_cast<double>(Smi::Value(reinterpret_cast<RawSmi*>(raw_obj))); | |
| 506 return true; | |
| 507 } | |
| 508 | |
| 509 | |
| 510 bool Api::GetNativeFieldsOfArgument(NativeArguments* arguments, | |
| 511 int arg_index, | |
| 512 int num_fields, | |
| 513 intptr_t* field_values) { | |
| 514 NoGCScope no_gc_scope; | |
| 515 RawObject* raw_obj = arguments->NativeArgAt(arg_index); | |
| 516 if (raw_obj->IsHeapObject()) { | |
| 517 intptr_t cid = raw_obj->GetClassId(); | |
| 518 if (cid > kNumPredefinedCids) { | |
| 519 RawTypedData* native_fields = *reinterpret_cast<RawTypedData**>( | |
| 520 RawObject::ToAddr(raw_obj) + sizeof(RawObject)); | |
| 521 if (native_fields == TypedData::null()) { | |
| 522 memset(field_values, 0, (num_fields * sizeof(field_values[0]))); | |
| 523 } else if (num_fields == Smi::Value(native_fields->ptr()->length_)) { | |
| 524 intptr_t* native_values = | |
| 525 bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data_); | |
| 526 memmove(field_values, | |
| 527 native_values, | |
| 528 (num_fields * sizeof(field_values[0]))); | |
| 529 } | |
| 530 return true; | |
| 531 } | |
| 532 } | |
| 533 return false; | |
| 534 } | |
| 535 | |
| 536 | |
| 359 void Api::SetWeakHandleReturnValue(NativeArguments* args, | 537 void Api::SetWeakHandleReturnValue(NativeArguments* args, |
| 360 Dart_WeakPersistentHandle retval) { | 538 Dart_WeakPersistentHandle retval) { |
| 361 args->SetReturnUnsafe(FinalizablePersistentHandle::Cast(retval)->raw()); | 539 args->SetReturnUnsafe(FinalizablePersistentHandle::Cast(retval)->raw()); |
| 362 } | 540 } |
| 363 | 541 |
| 364 | 542 |
| 365 PersistentHandle* PersistentHandle::Cast(Dart_PersistentHandle handle) { | 543 PersistentHandle* PersistentHandle::Cast(Dart_PersistentHandle handle) { |
| 366 ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(handle)); | 544 ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(handle)); |
| 367 return reinterpret_cast<PersistentHandle*>(handle); | 545 return reinterpret_cast<PersistentHandle*>(handle); |
| 368 } | 546 } |
| (...skipping 3636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4005 | 4183 |
| 4006 | 4184 |
| 4007 DART_EXPORT void* Dart_GetNativeIsolateData(Dart_NativeArguments args) { | 4185 DART_EXPORT void* Dart_GetNativeIsolateData(Dart_NativeArguments args) { |
| 4008 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4186 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4009 Isolate* isolate = arguments->isolate(); | 4187 Isolate* isolate = arguments->isolate(); |
| 4010 ASSERT(isolate == Isolate::Current()); | 4188 ASSERT(isolate == Isolate::Current()); |
| 4011 return isolate->init_callback_data(); | 4189 return isolate->init_callback_data(); |
| 4012 } | 4190 } |
| 4013 | 4191 |
| 4014 | 4192 |
| 4193 DART_EXPORT Dart_Handle Dart_GetNativeArguments( | |
| 4194 Dart_NativeArguments args, | |
| 4195 int num_arguments, | |
| 4196 const uint8_t* argument_descriptors, | |
| 4197 Dart_NativeArgument_Value* arg_values) { | |
| 4198 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | |
| 4199 ASSERT(arguments->isolate() == Isolate::Current()); | |
| 4200 if (arg_values == NULL) { | |
| 4201 RETURN_NULL_ERROR(arg_values); | |
| 4202 } | |
| 4203 for (int i = 0; i < num_arguments; i++) { | |
| 4204 uint8_t desc = argument_descriptors[i]; | |
| 4205 Dart_NativeArgument_Type arg_type = static_cast<Dart_NativeArgument_Type>( | |
| 4206 ((desc >> kNativeArgTypePos) & BITMASK(kNativeArgTypeSize))); | |
| 4207 int arg_index = (desc & BITMASK(kNativeArgNumberSize)); | |
| 4208 ASSERT(arg_index >= 0 && arg_index < arguments->NativeArgCount()); | |
| 4209 Dart_NativeArgument_Value* val = &(arg_values[i]); | |
|
Ivan Posva
2014/05/20 19:27:03
val and value below are easy to confuse. How about
siva
2014/05/21 23:56:54
renamed val to native_value
On 2014/05/20 19:27:0
| |
| 4210 switch (arg_type) { | |
| 4211 case Dart_NativeArgument_kBool: | |
| 4212 if (!Api::GetNativeBooleanArgument(arguments, | |
| 4213 arg_index, | |
| 4214 &(val->as_bool))) { | |
| 4215 return Api::NewError("%s: expects argument at index %d to be of" | |
| 4216 " type Boolean.", CURRENT_FUNC, i); | |
| 4217 } | |
| 4218 break; | |
| 4219 | |
| 4220 case Dart_NativeArgument_kInt32: { | |
| 4221 int64_t value = 0; | |
| 4222 if (!GetNativeIntegerArgument(arguments, | |
| 4223 arg_index, | |
| 4224 &value)) { | |
| 4225 return Api::NewError("%s: expects argument at index %d to be of" | |
| 4226 " type Integer.", CURRENT_FUNC, i); | |
| 4227 } | |
| 4228 if (value < INT_MIN || value > INT_MAX) { | |
| 4229 return Api::NewError("%s: argument value at index %d is out of range", | |
| 4230 CURRENT_FUNC, i); | |
| 4231 } | |
| 4232 val->as_int32 = value; | |
|
Ivan Posva
2014/05/20 19:27:03
ditto from below.
siva
2014/05/21 23:56:54
Done.
| |
| 4233 break; | |
| 4234 } | |
| 4235 | |
| 4236 case Dart_NativeArgument_kUint32: { | |
| 4237 int64_t value = 0; | |
| 4238 if (!GetNativeIntegerArgument(arguments, | |
| 4239 arg_index, | |
| 4240 &value)) { | |
| 4241 return Api::NewError("%s: expects argument at index %d to be of" | |
| 4242 " type Integer.", CURRENT_FUNC, i); | |
| 4243 } | |
| 4244 if (value < 0 || value > UINT_MAX) { | |
| 4245 return Api::NewError("%s: argument value at index %d is out of range", | |
| 4246 CURRENT_FUNC, i); | |
| 4247 } | |
| 4248 val->as_uint32 = value; | |
|
Ivan Posva
2014/05/20 19:27:03
static_cast<uint32_t> would make it clearer.
siva
2014/05/21 23:56:54
Done.
| |
| 4249 break; | |
| 4250 } | |
| 4251 | |
| 4252 case Dart_NativeArgument_kInt64: { | |
| 4253 int64_t value = 0; | |
| 4254 if (!GetNativeIntegerArgument(arguments, | |
| 4255 arg_index, | |
| 4256 &value)) { | |
| 4257 return Api::NewError("%s: expects argument at index %d to be of" | |
| 4258 " type Integer.", CURRENT_FUNC, i); | |
| 4259 } | |
| 4260 val->as_int64 = value; | |
| 4261 break; | |
| 4262 } | |
| 4263 | |
| 4264 case Dart_NativeArgument_kUint64: { | |
| 4265 int64_t value = 0; | |
| 4266 if (!GetNativeIntegerArgument(arguments, | |
| 4267 arg_index, | |
| 4268 &value)) { | |
| 4269 return Api::NewError("%s: expects argument at index %d to be of" | |
| 4270 " type Integer.", CURRENT_FUNC, i); | |
| 4271 } | |
| 4272 if (value < 0) { | |
| 4273 return Api::NewError("%s: argument value at index %d is out of range", | |
| 4274 CURRENT_FUNC, i); | |
| 4275 } | |
| 4276 val->as_uint64 = value; | |
|
Ivan Posva
2014/05/20 19:27:03
ditto.
siva
2014/05/21 23:56:54
Uses uint64_t value = 0;
On 2014/05/20 19:27:03,
| |
| 4277 break; | |
| 4278 } | |
| 4279 | |
| 4280 case Dart_NativeArgument_kDouble: | |
| 4281 if (!GetNativeDoubleArgument(arguments, | |
| 4282 arg_index, | |
| 4283 &(val->as_double))) { | |
| 4284 return Api::NewError("%s: expects argument at index %d to be of" | |
| 4285 " type Double.", CURRENT_FUNC, i); | |
| 4286 } | |
| 4287 break; | |
| 4288 | |
| 4289 case Dart_NativeArgument_kString: | |
| 4290 if (!GetNativeStringArgument(arguments, | |
| 4291 arg_index, | |
| 4292 &(val->as_string.dart_str), | |
| 4293 &(val->as_string.peer))) { | |
| 4294 return Api::NewError("%s: expects argument at index %d to be of" | |
| 4295 " type String.", CURRENT_FUNC, i); | |
| 4296 } | |
| 4297 break; | |
| 4298 | |
| 4299 case Dart_NativeArgument_kNativeFields: { | |
| 4300 Dart_Handle result = GetNativeFieldsOfArgument( | |
| 4301 arguments, | |
| 4302 arg_index, | |
| 4303 val->as_native_fields.num_fields, | |
| 4304 val->as_native_fields.values, | |
| 4305 CURRENT_FUNC); | |
| 4306 if (result != Api::Success()) { | |
| 4307 return result; | |
| 4308 } | |
| 4309 break; | |
| 4310 } | |
| 4311 | |
| 4312 case Dart_NativeArgument_kInstance: { | |
| 4313 Isolate* isolate = arguments->isolate(); | |
| 4314 ASSERT(isolate == Isolate::Current()); | |
| 4315 ASSERT(isolate->api_state() && | |
| 4316 isolate->api_state()->top_scope() != NULL); | |
| 4317 val->as_instance = | |
| 4318 Api::NewHandle(isolate, arguments->NativeArgAt(arg_index)); | |
| 4319 break; | |
| 4320 } | |
| 4321 | |
| 4322 default: | |
| 4323 return Api::NewError("%s: invalid argument type %d.", | |
| 4324 CURRENT_FUNC, arg_type); | |
| 4325 } | |
| 4326 } | |
| 4327 return Api::Success(); | |
| 4328 } | |
| 4329 | |
| 4330 | |
| 4015 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, | 4331 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, |
| 4016 int index) { | 4332 int index) { |
| 4017 TRACE_API_CALL(CURRENT_FUNC); | 4333 TRACE_API_CALL(CURRENT_FUNC); |
| 4018 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4334 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4019 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4335 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4020 return Api::NewError( | 4336 return Api::NewError( |
| 4021 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4337 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4022 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4338 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4023 } | 4339 } |
| 4024 return Api::NewHandle(arguments->isolate(), arguments->NativeArgAt(index)); | 4340 return Api::NewHandle(arguments->isolate(), arguments->NativeArgAt(index)); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 4039 intptr_t* field_values) { | 4355 intptr_t* field_values) { |
| 4040 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4356 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4041 if ((arg_index < 0) || (arg_index >= arguments->NativeArgCount())) { | 4357 if ((arg_index < 0) || (arg_index >= arguments->NativeArgCount())) { |
| 4042 return Api::NewError( | 4358 return Api::NewError( |
| 4043 "%s: argument 'arg_index' out of range. Expected 0..%d but saw %d.", | 4359 "%s: argument 'arg_index' out of range. Expected 0..%d but saw %d.", |
| 4044 CURRENT_FUNC, arguments->NativeArgCount() - 1, arg_index); | 4360 CURRENT_FUNC, arguments->NativeArgCount() - 1, arg_index); |
| 4045 } | 4361 } |
| 4046 if (field_values == NULL) { | 4362 if (field_values == NULL) { |
| 4047 RETURN_NULL_ERROR(field_values); | 4363 RETURN_NULL_ERROR(field_values); |
| 4048 } | 4364 } |
| 4049 Isolate* isolate = arguments->isolate(); | 4365 return GetNativeFieldsOfArgument(arguments, |
| 4050 ASSERT(isolate == Isolate::Current()); | 4366 arg_index, |
| 4051 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 4367 num_fields, |
| 4052 Object& obj = isolate->ObjectHandle(); | 4368 field_values, |
| 4053 obj = arguments->NativeArgAt(arg_index); | 4369 CURRENT_FUNC); |
| 4054 if (obj.IsNull()) { | |
| 4055 for (intptr_t i = 0; i < num_fields; i++) { | |
| 4056 field_values[i] = 0; | |
| 4057 } | |
| 4058 return Api::Success(); | |
| 4059 } | |
| 4060 if (!obj.IsInstance()) { | |
| 4061 return Api::NewError("%s expects argument at index '%d' to be of" | |
| 4062 " type Instance.", CURRENT_FUNC, arg_index); | |
| 4063 } | |
| 4064 const Instance& instance = Instance::Cast(obj); | |
| 4065 uint16_t field_count = instance.NumNativeFields(); | |
| 4066 if (num_fields != field_count) { | |
| 4067 return Api::NewError( | |
| 4068 "%s: invalid 'field_values' array specified for returning field values", | |
| 4069 CURRENT_FUNC); | |
| 4070 } | |
| 4071 instance.GetNativeFields(num_fields, field_values); | |
| 4072 return Api::Success(); | |
| 4073 } | 4370 } |
| 4074 | 4371 |
| 4075 | 4372 |
| 4076 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, | 4373 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, |
| 4077 intptr_t* value) { | 4374 intptr_t* value) { |
| 4078 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4375 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4079 ASSERT(arguments->isolate() == Isolate::Current()); | 4376 ASSERT(arguments->isolate() == Isolate::Current()); |
| 4080 if (value == NULL) { | 4377 if (value == NULL) { |
| 4081 RETURN_NULL_ERROR(value); | 4378 RETURN_NULL_ERROR(value); |
| 4082 } | 4379 } |
| 4083 if (Api::GetNativeReceiver(arguments, value)) { | 4380 if (Api::GetNativeReceiver(arguments, value)) { |
| 4084 return Api::Success(); | 4381 return Api::Success(); |
| 4085 } | 4382 } |
| 4086 return Api::NewError("%s expects receiver argument to be non-null and of" | 4383 return Api::NewError("%s expects receiver argument to be non-null and of" |
| 4087 " type Instance.", CURRENT_FUNC); | 4384 " type Instance.", CURRENT_FUNC); |
| 4088 } | 4385 } |
| 4089 | 4386 |
| 4090 | 4387 |
| 4091 DART_EXPORT Dart_Handle Dart_GetNativeStringArgument(Dart_NativeArguments args, | 4388 DART_EXPORT Dart_Handle Dart_GetNativeStringArgument(Dart_NativeArguments args, |
| 4092 int arg_index, | 4389 int arg_index, |
| 4093 void** peer) { | 4390 void** peer) { |
| 4094 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4391 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4095 Isolate* isolate = arguments->isolate(); | 4392 Dart_Handle result = Api::Null(); |
| 4096 ASSERT(isolate == Isolate::Current()); | 4393 if (!GetNativeStringArgument(arguments, arg_index, &result, peer)) { |
| 4097 if (Api::StringGetPeerHelper(arguments, arg_index, peer)) { | 4394 return Api::NewError("%s expects argument at %d to be of" |
| 4098 return Api::Success(); | 4395 " type String.", CURRENT_FUNC, arg_index); |
| 4099 } | 4396 } |
| 4100 *peer = NULL; | 4397 return result; |
| 4101 REUSABLE_OBJECT_HANDLESCOPE(isolate); | |
| 4102 Object& obj = isolate->ObjectHandle(); | |
| 4103 obj = arguments->NativeArgAt(arg_index); | |
| 4104 if (RawObject::IsStringClassId(obj.GetClassId())) { | |
| 4105 return Api::NewHandle(isolate, obj.raw()); | |
| 4106 } | |
| 4107 if (obj.IsNull()) { | |
| 4108 return Api::Null(); | |
| 4109 } | |
| 4110 return Api::NewError("%s expects argument to be of" | |
| 4111 " type String.", CURRENT_FUNC); | |
| 4112 } | 4398 } |
| 4113 | 4399 |
| 4114 | 4400 |
| 4115 DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, | 4401 DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, |
| 4116 int index, | 4402 int index, |
| 4117 int64_t* value) { | 4403 int64_t* value) { |
| 4118 TRACE_API_CALL(CURRENT_FUNC); | 4404 TRACE_API_CALL(CURRENT_FUNC); |
| 4119 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4405 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4120 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4406 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4121 return Api::NewError( | 4407 return Api::NewError( |
| 4122 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4408 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4123 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4409 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4124 } | 4410 } |
| 4125 Isolate* isolate = arguments->isolate(); | 4411 if (!GetNativeIntegerArgument(arguments, index, value)) { |
| 4126 ASSERT(isolate == Isolate::Current()); | 4412 return Api::NewError("%s: expects argument at %d to be of" |
| 4127 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 4413 " type Integer.", CURRENT_FUNC, index); |
| 4128 Object& obj = isolate->ObjectHandle(); | |
| 4129 obj = arguments->NativeArgAt(index); | |
| 4130 intptr_t cid = obj.GetClassId(); | |
| 4131 if (cid == kSmiCid) { | |
| 4132 *value = Smi::Cast(obj).Value(); | |
| 4133 return Api::Success(); | |
| 4134 } | 4414 } |
| 4135 if (cid == kMintCid) { | 4415 return Api::Success(); |
| 4136 *value = Mint::Cast(obj).value(); | |
| 4137 return Api::Success(); | |
| 4138 } | |
| 4139 if (cid == kBigintCid) { | |
| 4140 const Bigint& bigint = Bigint::Cast(obj); | |
| 4141 if (BigintOperations::FitsIntoInt64(bigint)) { | |
| 4142 *value = BigintOperations::ToInt64(bigint); | |
| 4143 return Api::Success(); | |
| 4144 } | |
| 4145 return Api::NewError( | |
| 4146 "%s: argument %d is a big integer that does not fit in 'value'.", | |
| 4147 CURRENT_FUNC, index); | |
| 4148 } | |
| 4149 return Api::NewError( | |
| 4150 "%s: argument %d is not an Integer argument.", | |
| 4151 CURRENT_FUNC, index); | |
| 4152 } | 4416 } |
| 4153 | 4417 |
| 4154 | 4418 |
| 4155 DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, | 4419 DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, |
| 4156 int index, | 4420 int index, |
| 4157 bool* value) { | 4421 bool* value) { |
| 4158 TRACE_API_CALL(CURRENT_FUNC); | 4422 TRACE_API_CALL(CURRENT_FUNC); |
| 4159 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4423 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4160 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4424 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4161 return Api::NewError( | 4425 return Api::NewError( |
| 4162 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4426 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4163 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4427 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4164 } | 4428 } |
| 4165 if (Api::GetNativeBooleanArgument(arguments, index, value)) { | 4429 if (!Api::GetNativeBooleanArgument(arguments, index, value)) { |
| 4166 return Api::Success(); | 4430 return Api::NewError("%s: expects argument at %d to be of type Boolean.", |
| 4431 CURRENT_FUNC, index); | |
| 4167 } | 4432 } |
| 4168 return Api::NewError("%s: argument %d is not a Boolean argument.", | 4433 return Api::Success(); |
| 4169 CURRENT_FUNC, index); | |
| 4170 } | 4434 } |
| 4171 | 4435 |
| 4172 | 4436 |
| 4173 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, | 4437 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, |
| 4174 int index, | 4438 int index, |
| 4175 double* value) { | 4439 double* value) { |
| 4176 TRACE_API_CALL(CURRENT_FUNC); | 4440 TRACE_API_CALL(CURRENT_FUNC); |
| 4177 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4441 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4178 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4442 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4179 return Api::NewError( | 4443 return Api::NewError( |
| 4180 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4444 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4181 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4445 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4182 } | 4446 } |
| 4183 Isolate* isolate = arguments->isolate(); | 4447 if (!GetNativeDoubleArgument(arguments, index, value)) { |
| 4184 ASSERT(isolate == Isolate::Current()); | 4448 return Api::NewError("%s: expects argument at %d to be of" |
| 4185 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 4449 " type Double.", CURRENT_FUNC, index); |
| 4186 Object& obj = isolate->ObjectHandle(); | |
| 4187 obj = arguments->NativeArgAt(index); | |
| 4188 intptr_t cid = obj.GetClassId(); | |
| 4189 if (cid == kDoubleCid) { | |
| 4190 *value = Double::Cast(obj).value(); | |
| 4191 return Api::Success(); | |
| 4192 } | 4450 } |
| 4193 if (cid == kSmiCid) { | 4451 return Api::Success(); |
| 4194 *value = Smi::Cast(obj).AsDoubleValue(); | |
| 4195 return Api::Success(); | |
| 4196 } | |
| 4197 if (cid == kMintCid) { | |
| 4198 *value = Mint::Cast(obj).AsDoubleValue(); | |
| 4199 return Api::Success(); | |
| 4200 } | |
| 4201 if (cid == kBigintCid) { | |
| 4202 *value = Bigint::Cast(obj).AsDoubleValue(); | |
| 4203 return Api::Success(); | |
| 4204 } | |
| 4205 return Api::NewError( | |
| 4206 "%s: argument %d is not a Double argument.", | |
| 4207 CURRENT_FUNC, index); | |
| 4208 } | 4452 } |
| 4209 | 4453 |
| 4210 | 4454 |
| 4211 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, | 4455 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, |
| 4212 Dart_Handle retval) { | 4456 Dart_Handle retval) { |
| 4213 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4457 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4214 ASSERT(arguments->isolate() == Isolate::Current()); | 4458 ASSERT(arguments->isolate() == Isolate::Current()); |
| 4215 if ((retval != Api::Null()) && (!Api::IsInstance(retval))) { | 4459 if ((retval != Api::Null()) && (!Api::IsInstance(retval))) { |
| 4216 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); | 4460 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); |
| 4217 FATAL1("Return value check failed: saw '%s' expected a dart Instance.", | 4461 FATAL1("Return value check failed: saw '%s' expected a dart Instance.", |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4783 | 5027 |
| 4784 | 5028 |
| 4785 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( | 5029 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( |
| 4786 const char* name, | 5030 const char* name, |
| 4787 Dart_ServiceRequestCallback callback, | 5031 Dart_ServiceRequestCallback callback, |
| 4788 void* user_data) { | 5032 void* user_data) { |
| 4789 Service::RegisterRootEmbedderCallback(name, callback, user_data); | 5033 Service::RegisterRootEmbedderCallback(name, callback, user_data); |
| 4790 } | 5034 } |
| 4791 | 5035 |
| 4792 } // namespace dart | 5036 } // namespace dart |
| OLD | NEW |