| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "vm/bootstrap_natives.h" | 5 #include "vm/bootstrap_natives.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" |
| 8 |
| 7 #include "vm/bigint_operations.h" | 9 #include "vm/bigint_operations.h" |
| 8 #include "vm/exceptions.h" | 10 #include "vm/exceptions.h" |
| 9 #include "vm/native_entry.h" | 11 #include "vm/native_entry.h" |
| 10 #include "vm/object.h" | 12 #include "vm/object.h" |
| 11 | 13 |
| 12 namespace dart { | 14 namespace dart { |
| 13 | 15 |
| 14 // ByteArray | 16 // ByteArray |
| 15 | 17 |
| 16 // Checks to see if (index * num_bytes) is in the range | 18 // Checks to see if (index * num_bytes) is in the range |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 args.SetAt(0, error); | 287 args.SetAt(0, error); |
| 286 Exceptions::ThrowByType(Exceptions::kArgument, args); | 288 Exceptions::ThrowByType(Exceptions::kArgument, args); |
| 287 } | 289 } |
| 288 RangeCheck(src, src_start_value, length_value); | 290 RangeCheck(src, src_start_value, length_value); |
| 289 RangeCheck(dst, dst_start_value, length_value); | 291 RangeCheck(dst, dst_start_value, length_value); |
| 290 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value); | 292 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value); |
| 291 return Object::null(); | 293 return Object::null(); |
| 292 } | 294 } |
| 293 | 295 |
| 294 | 296 |
| 297 static void PeerFinalizer(Dart_Handle handle, void* peer) { |
| 298 Dart_DeletePersistentHandle(handle); |
| 299 OS::AlignedFree(peer); |
| 300 } |
| 301 |
| 302 |
| 295 // Int8Array | 303 // Int8Array |
| 296 | 304 |
| 297 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { | 305 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { |
| 298 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 306 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 299 intptr_t len = length.Value(); | 307 intptr_t len = length.Value(); |
| 300 LengthCheck(len, Int8Array::kMaxElements); | 308 LengthCheck(len, Int8Array::kMaxElements); |
| 301 return Int8Array::New(len); | 309 return Int8Array::New(len); |
| 302 } | 310 } |
| 303 | 311 |
| 304 | 312 |
| 305 DEFINE_NATIVE_ENTRY(Int8List_newTransferable, 1) { | 313 DEFINE_NATIVE_ENTRY(Int8List_newTransferable, 1) { |
| 314 const int kAlignment = 16; |
| 306 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 315 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 307 intptr_t len = length.Value(); | 316 intptr_t len = length.Value(); |
| 308 LengthCheck(len, Int8Array::kMaxElements); | 317 LengthCheck(len, Int8Array::kMaxElements); |
| 309 int8_t* bytes = OS::AllocateAlignedArray<int8_t>( | 318 int8_t* bytes = OS::AllocateAlignedArray<int8_t>(len, kAlignment); |
| 310 len, | 319 const ExternalInt8Array& obj = |
| 311 ExternalByteArrayData<int8_t>::kAlignment); | 320 ExternalInt8Array::Handle(ExternalInt8Array::New(bytes, len)); |
| 312 return ExternalInt8Array::New(bytes, | 321 obj.AddFinalizer(bytes, PeerFinalizer); |
| 313 len, | 322 return obj.raw(); |
| 314 bytes, | |
| 315 OS::AlignedFree); | |
| 316 } | 323 } |
| 317 | 324 |
| 318 | 325 |
| 319 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { | 326 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { |
| 320 GETTER(Int8Array, Smi, int8_t); | 327 GETTER(Int8Array, Smi, int8_t); |
| 321 } | 328 } |
| 322 | 329 |
| 323 | 330 |
| 324 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { | 331 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { |
| 325 SETTER(Int8Array, Smi, Value, int8_t); | 332 SETTER(Int8Array, Smi, Value, int8_t); |
| 326 } | 333 } |
| 327 | 334 |
| 328 | 335 |
| 329 // Uint8Array | 336 // Uint8Array |
| 330 | 337 |
| 331 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { | 338 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { |
| 332 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 339 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 333 intptr_t len = length.Value(); | 340 intptr_t len = length.Value(); |
| 334 LengthCheck(len, Uint8Array::kMaxElements); | 341 LengthCheck(len, Uint8Array::kMaxElements); |
| 335 return Uint8Array::New(len); | 342 return Uint8Array::New(len); |
| 336 } | 343 } |
| 337 | 344 |
| 338 | 345 |
| 339 DEFINE_NATIVE_ENTRY(Uint8List_newTransferable, 1) { | 346 DEFINE_NATIVE_ENTRY(Uint8List_newTransferable, 1) { |
| 347 const int kAlignment = 16; |
| 340 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 348 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 341 intptr_t len = length.Value(); | 349 intptr_t len = length.Value(); |
| 342 LengthCheck(len, Uint8Array::kMaxElements); | 350 LengthCheck(len, Uint8Array::kMaxElements); |
| 343 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>( | 351 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>(len, kAlignment); |
| 344 len, | 352 const ExternalUint8Array& obj = |
| 345 ExternalByteArrayData<uint8_t>::kAlignment); | 353 ExternalUint8Array::Handle(ExternalUint8Array::New(bytes, len)); |
| 346 return ExternalUint8Array::New(bytes, | 354 obj.AddFinalizer(bytes, PeerFinalizer); |
| 347 len, | 355 return obj.raw(); |
| 348 bytes, | |
| 349 OS::AlignedFree); | |
| 350 } | 356 } |
| 351 | 357 |
| 352 | 358 |
| 353 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { | 359 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { |
| 354 GETTER(Uint8Array, Smi, uint8_t); | 360 GETTER(Uint8Array, Smi, uint8_t); |
| 355 } | 361 } |
| 356 | 362 |
| 357 | 363 |
| 358 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { | 364 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { |
| 359 SETTER(Uint8Array, Smi, Value, uint8_t); | 365 SETTER(Uint8Array, Smi, Value, uint8_t); |
| 360 } | 366 } |
| 361 | 367 |
| 362 | 368 |
| 363 // Uint8ClampedArray | 369 // Uint8ClampedArray |
| 364 | 370 |
| 365 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_new, 1) { | 371 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_new, 1) { |
| 366 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 372 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 367 intptr_t len = length.Value(); | 373 intptr_t len = length.Value(); |
| 368 LengthCheck(len, Uint8ClampedArray::kMaxElements); | 374 LengthCheck(len, Uint8ClampedArray::kMaxElements); |
| 369 return Uint8ClampedArray::New(len); | 375 return Uint8ClampedArray::New(len); |
| 370 } | 376 } |
| 371 | 377 |
| 372 | 378 |
| 373 DEFINE_NATIVE_ENTRY(Uint8ClampedList_newTransferable, 1) { | 379 DEFINE_NATIVE_ENTRY(Uint8ClampedList_newTransferable, 1) { |
| 380 const int kAlignment = 16; |
| 374 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 381 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 375 intptr_t len = length.Value(); | 382 intptr_t len = length.Value(); |
| 376 LengthCheck(len, Uint8ClampedArray::kMaxElements); | 383 LengthCheck(len, Uint8ClampedArray::kMaxElements); |
| 377 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>( | 384 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>(len, kAlignment); |
| 378 len, | 385 const ExternalUint8ClampedArray& obj = ExternalUint8ClampedArray::Handle( |
| 379 ExternalByteArrayData<uint8_t>::kAlignment); | 386 ExternalUint8ClampedArray::New(bytes, len)); |
| 380 return ExternalUint8ClampedArray::New(bytes, | 387 obj.AddFinalizer(bytes, PeerFinalizer); |
| 381 len, | 388 return obj.raw(); |
| 382 bytes, | |
| 383 OS::AlignedFree); | |
| 384 } | 389 } |
| 385 | 390 |
| 386 | 391 |
| 387 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_getIndexed, 2) { | 392 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_getIndexed, 2) { |
| 388 GETTER(Uint8ClampedArray, Smi, uint8_t); | 393 GETTER(Uint8ClampedArray, Smi, uint8_t); |
| 389 } | 394 } |
| 390 | 395 |
| 391 | 396 |
| 392 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_setIndexed, 3) { | 397 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_setIndexed, 3) { |
| 393 SETTER(Uint8ClampedArray, Smi, Value, uint8_t); | 398 SETTER(Uint8ClampedArray, Smi, Value, uint8_t); |
| 394 } | 399 } |
| 395 | 400 |
| 396 | 401 |
| 397 // Int16Array | 402 // Int16Array |
| 398 | 403 |
| 399 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { | 404 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { |
| 400 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 405 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 401 intptr_t len = length.Value(); | 406 intptr_t len = length.Value(); |
| 402 LengthCheck(len, Int16Array::kMaxElements); | 407 LengthCheck(len, Int16Array::kMaxElements); |
| 403 return Int16Array::New(len); | 408 return Int16Array::New(len); |
| 404 } | 409 } |
| 405 | 410 |
| 406 | 411 |
| 407 DEFINE_NATIVE_ENTRY(Int16List_newTransferable, 1) { | 412 DEFINE_NATIVE_ENTRY(Int16List_newTransferable, 1) { |
| 413 const int kAlignment = 16; |
| 408 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 414 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 409 intptr_t len = length.Value(); | 415 intptr_t len = length.Value(); |
| 410 LengthCheck(len, Int16Array::kMaxElements); | 416 LengthCheck(len, Int16Array::kMaxElements); |
| 411 int16_t* bytes = OS::AllocateAlignedArray<int16_t>( | 417 int16_t* bytes = OS::AllocateAlignedArray<int16_t>(len, kAlignment); |
| 412 len, | 418 const ExternalInt16Array& obj = |
| 413 ExternalByteArrayData<int16_t>::kAlignment); | 419 ExternalInt16Array::Handle(ExternalInt16Array::New(bytes, len)); |
| 414 return ExternalInt16Array::New(bytes, | 420 obj.AddFinalizer(bytes, PeerFinalizer); |
| 415 len, | 421 return obj.raw(); |
| 416 bytes, | |
| 417 OS::AlignedFree); | |
| 418 } | 422 } |
| 419 | 423 |
| 420 | 424 |
| 421 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { | 425 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { |
| 422 GETTER(Int16Array, Smi, int16_t); | 426 GETTER(Int16Array, Smi, int16_t); |
| 423 } | 427 } |
| 424 | 428 |
| 425 | 429 |
| 426 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { | 430 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { |
| 427 SETTER(Int16Array, Smi, Value, int16_t); | 431 SETTER(Int16Array, Smi, Value, int16_t); |
| 428 } | 432 } |
| 429 | 433 |
| 430 | 434 |
| 431 // Uint16Array | 435 // Uint16Array |
| 432 | 436 |
| 433 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { | 437 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { |
| 434 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 438 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 435 intptr_t len = length.Value(); | 439 intptr_t len = length.Value(); |
| 436 LengthCheck(len, Uint16Array::kMaxElements); | 440 LengthCheck(len, Uint16Array::kMaxElements); |
| 437 return Uint16Array::New(len); | 441 return Uint16Array::New(len); |
| 438 } | 442 } |
| 439 | 443 |
| 440 | 444 |
| 441 DEFINE_NATIVE_ENTRY(Uint16List_newTransferable, 1) { | 445 DEFINE_NATIVE_ENTRY(Uint16List_newTransferable, 1) { |
| 446 const int kAlignment = 16; |
| 442 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 447 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 443 intptr_t len = length.Value(); | 448 intptr_t len = length.Value(); |
| 444 LengthCheck(len, Uint16Array::kMaxElements); | 449 LengthCheck(len, Uint16Array::kMaxElements); |
| 445 uint16_t* bytes = OS::AllocateAlignedArray<uint16_t>( | 450 uint16_t* bytes = OS::AllocateAlignedArray<uint16_t>(len, kAlignment); |
| 446 len, | 451 const ExternalUint16Array& obj = |
| 447 ExternalByteArrayData<uint16_t>::kAlignment); | 452 ExternalUint16Array::Handle(ExternalUint16Array::New(bytes, len)); |
| 448 return ExternalUint16Array::New(bytes, | 453 obj.AddFinalizer(bytes, PeerFinalizer); |
| 449 len, | 454 return obj.raw(); |
| 450 bytes, | |
| 451 OS::AlignedFree); | |
| 452 } | 455 } |
| 453 | 456 |
| 454 | 457 |
| 455 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { | 458 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { |
| 456 GETTER(Uint16Array, Smi, uint16_t); | 459 GETTER(Uint16Array, Smi, uint16_t); |
| 457 } | 460 } |
| 458 | 461 |
| 459 | 462 |
| 460 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { | 463 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { |
| 461 SETTER(Uint16Array, Smi, Value, uint16_t); | 464 SETTER(Uint16Array, Smi, Value, uint16_t); |
| 462 } | 465 } |
| 463 | 466 |
| 464 | 467 |
| 465 // Int32Array | 468 // Int32Array |
| 466 | 469 |
| 467 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { | 470 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { |
| 468 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 471 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 469 intptr_t len = length.Value(); | 472 intptr_t len = length.Value(); |
| 470 LengthCheck(len, Int32Array::kMaxElements); | 473 LengthCheck(len, Int32Array::kMaxElements); |
| 471 return Int32Array::New(len); | 474 return Int32Array::New(len); |
| 472 } | 475 } |
| 473 | 476 |
| 474 | 477 |
| 475 DEFINE_NATIVE_ENTRY(Int32List_newTransferable, 1) { | 478 DEFINE_NATIVE_ENTRY(Int32List_newTransferable, 1) { |
| 479 const int kAlignment = 16; |
| 476 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 480 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 477 intptr_t len = length.Value(); | 481 intptr_t len = length.Value(); |
| 478 LengthCheck(len, Int32Array::kMaxElements); | 482 LengthCheck(len, Int32Array::kMaxElements); |
| 479 int32_t* bytes = OS::AllocateAlignedArray<int32_t>( | 483 int32_t* bytes = OS::AllocateAlignedArray<int32_t>(len, kAlignment); |
| 480 len, | 484 const ExternalInt32Array& obj = |
| 481 ExternalByteArrayData<int32_t>::kAlignment); | 485 ExternalInt32Array::Handle(ExternalInt32Array::New(bytes, len)); |
| 482 return ExternalInt32Array::New(bytes, | 486 obj.AddFinalizer(bytes, PeerFinalizer); |
| 483 len, | 487 return obj.raw(); |
| 484 bytes, | |
| 485 OS::AlignedFree); | |
| 486 } | 488 } |
| 487 | 489 |
| 488 | 490 |
| 489 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { | 491 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { |
| 490 GETTER(Int32Array, Integer, int32_t); | 492 GETTER(Int32Array, Integer, int32_t); |
| 491 } | 493 } |
| 492 | 494 |
| 493 | 495 |
| 494 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) { | 496 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) { |
| 495 SETTER(Int32Array, Integer, AsInt64Value, int32_t); | 497 SETTER(Int32Array, Integer, AsInt64Value, int32_t); |
| 496 } | 498 } |
| 497 | 499 |
| 498 | 500 |
| 499 // Uint32Array | 501 // Uint32Array |
| 500 | 502 |
| 501 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { | 503 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { |
| 502 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 504 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 503 intptr_t len = length.Value(); | 505 intptr_t len = length.Value(); |
| 504 LengthCheck(len, Uint32Array::kMaxElements); | 506 LengthCheck(len, Uint32Array::kMaxElements); |
| 505 return Uint32Array::New(len); | 507 return Uint32Array::New(len); |
| 506 } | 508 } |
| 507 | 509 |
| 508 | 510 |
| 509 DEFINE_NATIVE_ENTRY(Uint32List_newTransferable, 1) { | 511 DEFINE_NATIVE_ENTRY(Uint32List_newTransferable, 1) { |
| 512 const int kAlignment = 16; |
| 510 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 513 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 511 intptr_t len = length.Value(); | 514 intptr_t len = length.Value(); |
| 512 LengthCheck(len, Uint32Array::kMaxElements); | 515 LengthCheck(len, Uint32Array::kMaxElements); |
| 513 uint32_t* bytes = OS::AllocateAlignedArray<uint32_t>( | 516 uint32_t* bytes = OS::AllocateAlignedArray<uint32_t>(len, kAlignment); |
| 514 len, | 517 const ExternalUint32Array& obj = |
| 515 ExternalByteArrayData<uint32_t>::kAlignment); | 518 ExternalUint32Array::Handle(ExternalUint32Array::New(bytes, len)); |
| 516 return ExternalUint32Array::New(bytes, | 519 obj.AddFinalizer(bytes, PeerFinalizer); |
| 517 len, | 520 return obj.raw(); |
| 518 bytes, | |
| 519 OS::AlignedFree); | |
| 520 } | 521 } |
| 521 | 522 |
| 522 | 523 |
| 523 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { | 524 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { |
| 524 GETTER(Uint32Array, Integer, uint32_t); | 525 GETTER(Uint32Array, Integer, uint32_t); |
| 525 } | 526 } |
| 526 | 527 |
| 527 | 528 |
| 528 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { | 529 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { |
| 529 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); | 530 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); |
| 530 } | 531 } |
| 531 | 532 |
| 532 | 533 |
| 533 // Int64Array | 534 // Int64Array |
| 534 | 535 |
| 535 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { | 536 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { |
| 536 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 537 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 537 intptr_t len = length.Value(); | 538 intptr_t len = length.Value(); |
| 538 LengthCheck(len, Int64Array::kMaxElements); | 539 LengthCheck(len, Int64Array::kMaxElements); |
| 539 return Int64Array::New(len); | 540 return Int64Array::New(len); |
| 540 } | 541 } |
| 541 | 542 |
| 542 | 543 |
| 543 DEFINE_NATIVE_ENTRY(Int64List_newTransferable, 1) { | 544 DEFINE_NATIVE_ENTRY(Int64List_newTransferable, 1) { |
| 545 const int kAlignment = 16; |
| 544 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 546 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 545 intptr_t len = length.Value(); | 547 intptr_t len = length.Value(); |
| 546 LengthCheck(len, Int64Array::kMaxElements); | 548 LengthCheck(len, Int64Array::kMaxElements); |
| 547 int64_t* bytes = OS::AllocateAlignedArray<int64_t>( | 549 int64_t* bytes = OS::AllocateAlignedArray<int64_t>(len, kAlignment); |
| 548 len, | 550 const ExternalInt64Array& obj = |
| 549 ExternalByteArrayData<int64_t>::kAlignment); | 551 ExternalInt64Array::Handle(ExternalInt64Array::New(bytes, len)); |
| 550 return ExternalInt64Array::New(bytes, | 552 obj.AddFinalizer(bytes, PeerFinalizer); |
| 551 len, | 553 return obj.raw(); |
| 552 bytes, | |
| 553 OS::AlignedFree); | |
| 554 } | 554 } |
| 555 | 555 |
| 556 | 556 |
| 557 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { | 557 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { |
| 558 GETTER(Int64Array, Integer, int64_t); | 558 GETTER(Int64Array, Integer, int64_t); |
| 559 } | 559 } |
| 560 | 560 |
| 561 | 561 |
| 562 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { | 562 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { |
| 563 SETTER(Int64Array, Integer, AsInt64Value, int64_t); | 563 SETTER(Int64Array, Integer, AsInt64Value, int64_t); |
| 564 } | 564 } |
| 565 | 565 |
| 566 | 566 |
| 567 // Uint64Array | 567 // Uint64Array |
| 568 | 568 |
| 569 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { | 569 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { |
| 570 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 570 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 571 intptr_t len = length.Value(); | 571 intptr_t len = length.Value(); |
| 572 LengthCheck(len, Uint64Array::kMaxElements); | 572 LengthCheck(len, Uint64Array::kMaxElements); |
| 573 return Uint64Array::New(len); | 573 return Uint64Array::New(len); |
| 574 } | 574 } |
| 575 | 575 |
| 576 | 576 |
| 577 DEFINE_NATIVE_ENTRY(Uint64List_newTransferable, 1) { | 577 DEFINE_NATIVE_ENTRY(Uint64List_newTransferable, 1) { |
| 578 const int kAlignment = 16; |
| 578 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 579 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 579 intptr_t len = length.Value(); | 580 intptr_t len = length.Value(); |
| 580 LengthCheck(len, Uint64Array::kMaxElements); | 581 LengthCheck(len, Uint64Array::kMaxElements); |
| 581 uint64_t* bytes = OS::AllocateAlignedArray<uint64_t>( | 582 uint64_t* bytes = OS::AllocateAlignedArray<uint64_t>(len, kAlignment); |
| 582 len, | 583 const ExternalUint64Array& obj = |
| 583 ExternalByteArrayData<uint64_t>::kAlignment); | 584 ExternalUint64Array::Handle(ExternalUint64Array::New(bytes, len)); |
| 584 return ExternalUint64Array::New(bytes, | 585 obj.AddFinalizer(bytes, PeerFinalizer); |
| 585 len, | 586 return obj.raw(); |
| 586 bytes, | |
| 587 OS::AlignedFree); | |
| 588 } | 587 } |
| 589 | 588 |
| 590 | 589 |
| 591 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { | 590 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { |
| 592 GETTER_UINT64(Uint64Array); | 591 GETTER_UINT64(Uint64Array); |
| 593 } | 592 } |
| 594 | 593 |
| 595 | 594 |
| 596 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { | 595 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { |
| 597 SETTER_UINT64(Uint64Array); | 596 SETTER_UINT64(Uint64Array); |
| 598 } | 597 } |
| 599 | 598 |
| 600 | 599 |
| 601 // Float32Array | 600 // Float32Array |
| 602 | 601 |
| 603 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { | 602 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { |
| 604 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 603 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 605 intptr_t len = length.Value(); | 604 intptr_t len = length.Value(); |
| 606 LengthCheck(len, Float32Array::kMaxElements); | 605 LengthCheck(len, Float32Array::kMaxElements); |
| 607 return Float32Array::New(len); | 606 return Float32Array::New(len); |
| 608 } | 607 } |
| 609 | 608 |
| 610 | 609 |
| 611 DEFINE_NATIVE_ENTRY(Float32List_newTransferable, 1) { | 610 DEFINE_NATIVE_ENTRY(Float32List_newTransferable, 1) { |
| 611 const int kAlignment = 16; |
| 612 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 612 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 613 intptr_t len = length.Value(); | 613 intptr_t len = length.Value(); |
| 614 LengthCheck(len, Float32Array::kMaxElements); | 614 LengthCheck(len, Float32Array::kMaxElements); |
| 615 float* bytes = OS::AllocateAlignedArray<float>( | 615 float* bytes = OS::AllocateAlignedArray<float>(len, kAlignment); |
| 616 len, | 616 const ExternalFloat32Array& obj = |
| 617 ExternalByteArrayData<float>::kAlignment); | 617 ExternalFloat32Array::Handle(ExternalFloat32Array::New(bytes, len)); |
| 618 return ExternalFloat32Array::New(bytes, | 618 obj.AddFinalizer(bytes, PeerFinalizer); |
| 619 len, | 619 return obj.raw(); |
| 620 bytes, | |
| 621 OS::AlignedFree); | |
| 622 } | 620 } |
| 623 | 621 |
| 624 | 622 |
| 625 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { | 623 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { |
| 626 GETTER(Float32Array, Double, float); | 624 GETTER(Float32Array, Double, float); |
| 627 } | 625 } |
| 628 | 626 |
| 629 | 627 |
| 630 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { | 628 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { |
| 631 SETTER(Float32Array, Double, value, float); | 629 SETTER(Float32Array, Double, value, float); |
| 632 } | 630 } |
| 633 | 631 |
| 634 | 632 |
| 635 // Float64Array | 633 // Float64Array |
| 636 | 634 |
| 637 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { | 635 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { |
| 638 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 636 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 639 intptr_t len = length.Value(); | 637 intptr_t len = length.Value(); |
| 640 LengthCheck(len, Float64Array::kMaxElements); | 638 LengthCheck(len, Float64Array::kMaxElements); |
| 641 return Float64Array::New(len); | 639 return Float64Array::New(len); |
| 642 } | 640 } |
| 643 | 641 |
| 644 | 642 |
| 645 DEFINE_NATIVE_ENTRY(Float64List_newTransferable, 1) { | 643 DEFINE_NATIVE_ENTRY(Float64List_newTransferable, 1) { |
| 644 const int kAlignment = 16; |
| 646 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 645 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 647 intptr_t len = length.Value(); | 646 intptr_t len = length.Value(); |
| 648 LengthCheck(len, Float64Array::kMaxElements); | 647 LengthCheck(len, Float64Array::kMaxElements); |
| 649 double* bytes = OS::AllocateAlignedArray<double>( | 648 double* bytes = OS::AllocateAlignedArray<double>(len, kAlignment); |
| 650 len, | 649 const ExternalFloat64Array& obj = |
| 651 ExternalByteArrayData<double>::kAlignment); | 650 ExternalFloat64Array::Handle(ExternalFloat64Array::New(bytes, len)); |
| 652 return ExternalFloat64Array::New(bytes, | 651 obj.AddFinalizer(bytes, PeerFinalizer); |
| 653 len, | 652 return obj.raw(); |
| 654 bytes, | |
| 655 OS::AlignedFree); | |
| 656 } | 653 } |
| 657 | 654 |
| 658 | 655 |
| 659 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { | 656 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { |
| 660 GETTER(Float64Array, Double, double); | 657 GETTER(Float64Array, Double, double); |
| 661 } | 658 } |
| 662 | 659 |
| 663 | 660 |
| 664 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) { | 661 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) { |
| 665 SETTER(Float64Array, Double, value, double); | 662 SETTER(Float64Array, Double, value, double); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 791 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { | 788 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { |
| 792 GETTER(ExternalFloat64Array, Double, double); | 789 GETTER(ExternalFloat64Array, Double, double); |
| 793 } | 790 } |
| 794 | 791 |
| 795 | 792 |
| 796 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { | 793 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { |
| 797 SETTER(ExternalFloat64Array, Double, value, double); | 794 SETTER(ExternalFloat64Array, Double, value, double); |
| 798 } | 795 } |
| 799 | 796 |
| 800 } // namespace dart | 797 } // namespace dart |
| OLD | NEW |