Chromium Code Reviews| 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 "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/exceptions.h" | 8 #include "vm/exceptions.h" |
| 9 #include "vm/native_entry.h" | 9 #include "vm/native_entry.h" |
| 10 #include "vm/object.h" | 10 #include "vm/object.h" |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 35 static void LengthCheck(intptr_t len, intptr_t max) { | 35 static void LengthCheck(intptr_t len, intptr_t max) { |
| 36 if (len < 0 || len > max) { | 36 if (len < 0 || len > max) { |
| 37 const String& error = String::Handle(String::NewFormatted( | 37 const String& error = String::Handle(String::NewFormatted( |
| 38 "length (%"Pd") must be in the range [0..%"Pd"]", len, max)); | 38 "length (%"Pd") must be in the range [0..%"Pd"]", len, max)); |
| 39 GrowableArray<const Object*> args; | 39 GrowableArray<const Object*> args; |
| 40 args.Add(&error); | 40 args.Add(&error); |
| 41 Exceptions::ThrowByType(Exceptions::kArgument, args); | 41 Exceptions::ThrowByType(Exceptions::kArgument, args); |
| 42 } | 42 } |
| 43 } | 43 } |
| 44 | 44 |
| 45 // Returns an aligned array of type T with n entries. | |
| 46 // Alignment must be >= 16 and a power of two. | |
| 47 template<typename T> | |
| 48 T* AllocateAlignedExternalArray(intptr_t n) { | |
| 49 intptr_t size = n*sizeof(T); // NOLINT | |
|
cshapiro
2012/11/30 18:02:16
This should go away once we have the aforementione
Cutch
2012/11/30 18:21:43
Done.
| |
| 50 void* p = OS::AlignedAllocate(size, | |
| 51 ExternalByteArrayData<T>::kAlignment); | |
| 52 return reinterpret_cast<T*>(p); | |
| 53 } | |
| 45 | 54 |
| 46 #define GETTER_ARGUMENTS(ArrayT, ValueT) \ | 55 #define GETTER_ARGUMENTS(ArrayT, ValueT) \ |
| 47 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ | 56 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ |
| 48 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); | 57 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); |
| 49 | 58 |
| 50 | 59 |
| 51 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \ | 60 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \ |
| 52 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ | 61 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ |
| 53 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \ | 62 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \ |
| 54 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->NativeArgAt(2)); | 63 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->NativeArgAt(2)); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 278 // Int8Array | 287 // Int8Array |
| 279 | 288 |
| 280 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { | 289 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { |
| 281 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 290 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 282 intptr_t len = length.Value(); | 291 intptr_t len = length.Value(); |
| 283 LengthCheck(len, Int8Array::kMaxElements); | 292 LengthCheck(len, Int8Array::kMaxElements); |
| 284 return Int8Array::New(len); | 293 return Int8Array::New(len); |
| 285 } | 294 } |
| 286 | 295 |
| 287 | 296 |
| 297 DEFINE_NATIVE_ENTRY(Int8Array_newTransferrable, 1) { | |
| 298 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 299 intptr_t len = length.Value(); | |
| 300 LengthCheck(len, Int8Array::kMaxElements); | |
| 301 int8_t* bytes = AllocateAlignedExternalArray<int8_t>(len); | |
| 302 return ExternalInt8Array::New(bytes, | |
| 303 len, | |
| 304 bytes, | |
| 305 OS::AlignedFree); | |
| 306 } | |
| 307 | |
| 308 | |
| 288 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { | 309 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { |
| 289 GETTER(Int8Array, Smi, int8_t); | 310 GETTER(Int8Array, Smi, int8_t); |
| 290 } | 311 } |
| 291 | 312 |
| 292 | 313 |
| 293 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { | 314 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { |
| 294 SETTER(Int8Array, Smi, Value, int8_t); | 315 SETTER(Int8Array, Smi, Value, int8_t); |
| 295 } | 316 } |
| 296 | 317 |
| 297 | 318 |
| 298 // Uint8Array | 319 // Uint8Array |
| 299 | 320 |
| 300 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { | 321 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { |
| 301 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 322 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 302 intptr_t len = length.Value(); | 323 intptr_t len = length.Value(); |
| 303 LengthCheck(len, Uint8Array::kMaxElements); | 324 LengthCheck(len, Uint8Array::kMaxElements); |
| 304 return Uint8Array::New(len); | 325 return Uint8Array::New(len); |
| 305 } | 326 } |
| 306 | 327 |
| 307 | 328 |
| 329 DEFINE_NATIVE_ENTRY(Uint8Array_newTransferrable, 1) { | |
| 330 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 331 intptr_t len = length.Value(); | |
| 332 LengthCheck(len, Uint8Array::kMaxElements); | |
| 333 uint8_t* bytes = AllocateAlignedExternalArray<uint8_t>(len); | |
| 334 return ExternalUint8Array::New(bytes, | |
| 335 len, | |
| 336 bytes, | |
| 337 OS::AlignedFree); | |
| 338 } | |
| 339 | |
| 340 | |
| 308 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { | 341 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { |
| 309 GETTER(Uint8Array, Smi, uint8_t); | 342 GETTER(Uint8Array, Smi, uint8_t); |
| 310 } | 343 } |
| 311 | 344 |
| 312 | 345 |
| 313 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { | 346 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { |
| 314 SETTER(Uint8Array, Smi, Value, uint8_t); | 347 SETTER(Uint8Array, Smi, Value, uint8_t); |
| 315 } | 348 } |
| 316 | 349 |
| 317 | 350 |
| 318 // Int16Array | 351 // Int16Array |
| 319 | 352 |
| 320 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { | 353 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { |
| 321 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 354 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 322 intptr_t len = length.Value(); | 355 intptr_t len = length.Value(); |
| 323 LengthCheck(len, Int16Array::kMaxElements); | 356 LengthCheck(len, Int16Array::kMaxElements); |
| 324 return Int16Array::New(len); | 357 return Int16Array::New(len); |
| 325 } | 358 } |
| 326 | 359 |
| 327 | 360 |
| 361 DEFINE_NATIVE_ENTRY(Int16Array_newTransferrable, 1) { | |
| 362 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 363 intptr_t len = length.Value(); | |
| 364 LengthCheck(len, Int16Array::kMaxElements); | |
| 365 int16_t* bytes = AllocateAlignedExternalArray<int16_t>(len); | |
| 366 return ExternalInt16Array::New(bytes, | |
| 367 len, | |
| 368 bytes, | |
| 369 OS::AlignedFree); | |
| 370 } | |
| 371 | |
| 372 | |
| 328 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { | 373 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { |
| 329 GETTER(Int16Array, Smi, int16_t); | 374 GETTER(Int16Array, Smi, int16_t); |
| 330 } | 375 } |
| 331 | 376 |
| 332 | 377 |
| 333 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { | 378 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { |
| 334 SETTER(Int16Array, Smi, Value, int16_t); | 379 SETTER(Int16Array, Smi, Value, int16_t); |
| 335 } | 380 } |
| 336 | 381 |
| 337 | 382 |
| 338 // Uint16Array | 383 // Uint16Array |
| 339 | 384 |
| 340 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { | 385 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { |
| 341 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 386 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 342 intptr_t len = length.Value(); | 387 intptr_t len = length.Value(); |
| 343 LengthCheck(len, Uint16Array::kMaxElements); | 388 LengthCheck(len, Uint16Array::kMaxElements); |
| 344 return Uint16Array::New(len); | 389 return Uint16Array::New(len); |
| 345 } | 390 } |
| 346 | 391 |
| 347 | 392 |
| 393 DEFINE_NATIVE_ENTRY(Uint16Array_newTransferrable, 1) { | |
| 394 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 395 intptr_t len = length.Value(); | |
| 396 LengthCheck(len, Uint16Array::kMaxElements); | |
| 397 uint16_t* bytes = AllocateAlignedExternalArray<uint16_t>(len); | |
| 398 return ExternalUint16Array::New(bytes, | |
| 399 len, | |
| 400 bytes, | |
| 401 OS::AlignedFree); | |
| 402 } | |
| 403 | |
| 404 | |
| 348 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { | 405 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { |
| 349 GETTER(Uint16Array, Smi, uint16_t); | 406 GETTER(Uint16Array, Smi, uint16_t); |
| 350 } | 407 } |
| 351 | 408 |
| 352 | 409 |
| 353 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { | 410 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { |
| 354 SETTER(Uint16Array, Smi, Value, uint16_t); | 411 SETTER(Uint16Array, Smi, Value, uint16_t); |
| 355 } | 412 } |
| 356 | 413 |
| 357 | 414 |
| 358 // Int32Array | 415 // Int32Array |
| 359 | 416 |
| 360 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { | 417 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { |
| 361 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 418 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 362 intptr_t len = length.Value(); | 419 intptr_t len = length.Value(); |
| 363 LengthCheck(len, Int32Array::kMaxElements); | 420 LengthCheck(len, Int32Array::kMaxElements); |
| 364 return Int32Array::New(len); | 421 return Int32Array::New(len); |
| 365 } | 422 } |
| 366 | 423 |
| 367 | 424 |
| 425 DEFINE_NATIVE_ENTRY(Int32Array_newTransferrable, 1) { | |
| 426 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 427 intptr_t len = length.Value(); | |
| 428 LengthCheck(len, Int32Array::kMaxElements); | |
| 429 int32_t* bytes = AllocateAlignedExternalArray<int32_t>(len); | |
| 430 return ExternalInt32Array::New(bytes, | |
| 431 len, | |
| 432 bytes, | |
| 433 OS::AlignedFree); | |
| 434 } | |
| 435 | |
| 436 | |
| 368 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { | 437 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { |
| 369 GETTER(Int32Array, Integer, int32_t); | 438 GETTER(Int32Array, Integer, int32_t); |
| 370 } | 439 } |
| 371 | 440 |
| 372 | 441 |
| 373 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) { | 442 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) { |
| 374 SETTER(Int32Array, Integer, AsInt64Value, int32_t); | 443 SETTER(Int32Array, Integer, AsInt64Value, int32_t); |
| 375 } | 444 } |
| 376 | 445 |
| 377 | 446 |
| 378 // Uint32Array | 447 // Uint32Array |
| 379 | 448 |
| 380 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { | 449 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { |
| 381 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 450 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 382 intptr_t len = length.Value(); | 451 intptr_t len = length.Value(); |
| 383 LengthCheck(len, Uint32Array::kMaxElements); | 452 LengthCheck(len, Uint32Array::kMaxElements); |
| 384 return Uint32Array::New(len); | 453 return Uint32Array::New(len); |
| 385 } | 454 } |
| 386 | 455 |
| 387 | 456 |
| 457 DEFINE_NATIVE_ENTRY(Uint32Array_newTransferrable, 1) { | |
| 458 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 459 intptr_t len = length.Value(); | |
| 460 LengthCheck(len, Uint32Array::kMaxElements); | |
| 461 uint32_t* bytes = AllocateAlignedExternalArray<uint32_t>(len); | |
| 462 return ExternalUint32Array::New(bytes, | |
| 463 len, | |
| 464 bytes, | |
| 465 OS::AlignedFree); | |
| 466 } | |
| 467 | |
| 468 | |
| 388 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { | 469 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { |
| 389 GETTER(Uint32Array, Integer, uint32_t); | 470 GETTER(Uint32Array, Integer, uint32_t); |
| 390 } | 471 } |
| 391 | 472 |
| 392 | 473 |
| 393 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { | 474 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { |
| 394 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); | 475 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); |
| 395 } | 476 } |
| 396 | 477 |
| 397 | 478 |
| 398 // Int64Array | 479 // Int64Array |
| 399 | 480 |
| 400 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { | 481 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { |
| 401 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 482 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 402 intptr_t len = length.Value(); | 483 intptr_t len = length.Value(); |
| 403 LengthCheck(len, Int64Array::kMaxElements); | 484 LengthCheck(len, Int64Array::kMaxElements); |
| 404 return Int64Array::New(len); | 485 return Int64Array::New(len); |
| 405 } | 486 } |
| 406 | 487 |
| 407 | 488 |
| 489 DEFINE_NATIVE_ENTRY(Int64Array_newTransferrable, 1) { | |
| 490 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 491 intptr_t len = length.Value(); | |
| 492 LengthCheck(len, Int64Array::kMaxElements); | |
| 493 int64_t* bytes = AllocateAlignedExternalArray<int64_t>(len); | |
| 494 return ExternalInt64Array::New(bytes, | |
| 495 len, | |
| 496 bytes, | |
| 497 OS::AlignedFree); | |
| 498 } | |
| 499 | |
| 500 | |
| 408 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { | 501 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { |
| 409 GETTER(Int64Array, Integer, int64_t); | 502 GETTER(Int64Array, Integer, int64_t); |
| 410 } | 503 } |
| 411 | 504 |
| 412 | 505 |
| 413 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { | 506 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { |
| 414 SETTER(Int64Array, Integer, AsInt64Value, int64_t); | 507 SETTER(Int64Array, Integer, AsInt64Value, int64_t); |
| 415 } | 508 } |
| 416 | 509 |
| 417 | 510 |
| 418 // Uint64Array | 511 // Uint64Array |
| 419 | 512 |
| 420 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { | 513 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { |
| 421 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 514 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 422 intptr_t len = length.Value(); | 515 intptr_t len = length.Value(); |
| 423 LengthCheck(len, Uint64Array::kMaxElements); | 516 LengthCheck(len, Uint64Array::kMaxElements); |
| 424 return Uint64Array::New(len); | 517 return Uint64Array::New(len); |
| 425 } | 518 } |
| 426 | 519 |
| 427 | 520 |
| 521 DEFINE_NATIVE_ENTRY(Uint64Array_newTransferrable, 1) { | |
| 522 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 523 intptr_t len = length.Value(); | |
| 524 LengthCheck(len, Uint64Array::kMaxElements); | |
| 525 uint64_t* bytes = AllocateAlignedExternalArray<uint64_t>(len); | |
| 526 return ExternalUint64Array::New(bytes, | |
| 527 len, | |
| 528 bytes, | |
| 529 OS::AlignedFree); | |
| 530 } | |
| 531 | |
| 532 | |
| 428 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { | 533 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { |
| 429 GETTER_UINT64(Uint64Array); | 534 GETTER_UINT64(Uint64Array); |
| 430 } | 535 } |
| 431 | 536 |
| 432 | 537 |
| 433 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { | 538 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { |
| 434 SETTER_UINT64(Uint64Array); | 539 SETTER_UINT64(Uint64Array); |
| 435 } | 540 } |
| 436 | 541 |
| 437 | 542 |
| 438 // Float32Array | 543 // Float32Array |
| 439 | 544 |
| 440 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { | 545 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { |
| 441 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 546 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 442 intptr_t len = length.Value(); | 547 intptr_t len = length.Value(); |
| 443 LengthCheck(len, Float32Array::kMaxElements); | 548 LengthCheck(len, Float32Array::kMaxElements); |
| 444 return Float32Array::New(len); | 549 return Float32Array::New(len); |
| 445 } | 550 } |
| 446 | 551 |
| 447 | 552 |
| 553 DEFINE_NATIVE_ENTRY(Float32Array_newTransferrable, 1) { | |
| 554 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 555 intptr_t len = length.Value(); | |
| 556 LengthCheck(len, Float32Array::kMaxElements); | |
| 557 float* bytes = AllocateAlignedExternalArray<float>(len); | |
| 558 return ExternalFloat32Array::New(bytes, | |
| 559 len, | |
| 560 bytes, | |
| 561 OS::AlignedFree); | |
| 562 } | |
| 563 | |
| 564 | |
| 448 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { | 565 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { |
| 449 GETTER(Float32Array, Double, float); | 566 GETTER(Float32Array, Double, float); |
| 450 } | 567 } |
| 451 | 568 |
| 452 | 569 |
| 453 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { | 570 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { |
| 454 SETTER(Float32Array, Double, value, float); | 571 SETTER(Float32Array, Double, value, float); |
| 455 } | 572 } |
| 456 | 573 |
| 457 | 574 |
| 458 // Float64Array | 575 // Float64Array |
| 459 | 576 |
| 460 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { | 577 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { |
| 461 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 578 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 462 intptr_t len = length.Value(); | 579 intptr_t len = length.Value(); |
| 463 LengthCheck(len, Float64Array::kMaxElements); | 580 LengthCheck(len, Float64Array::kMaxElements); |
| 464 return Float64Array::New(len); | 581 return Float64Array::New(len); |
| 465 } | 582 } |
| 466 | 583 |
| 467 | 584 |
| 585 DEFINE_NATIVE_ENTRY(Float64Array_newTransferrable, 1) { | |
| 586 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 587 intptr_t len = length.Value(); | |
| 588 LengthCheck(len, Float64Array::kMaxElements); | |
| 589 double* bytes = AllocateAlignedExternalArray<double>(len); | |
| 590 return ExternalFloat64Array::New(bytes, | |
| 591 len, | |
| 592 bytes, | |
| 593 OS::AlignedFree); | |
| 594 } | |
| 595 | |
| 596 | |
| 468 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { | 597 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { |
| 469 GETTER(Float64Array, Double, double); | 598 GETTER(Float64Array, Double, double); |
| 470 } | 599 } |
| 471 | 600 |
| 472 | 601 |
| 473 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) { | 602 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) { |
| 474 SETTER(Float64Array, Double, value, double); | 603 SETTER(Float64Array, Double, value, double); |
| 475 } | 604 } |
| 476 | 605 |
| 477 | 606 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 588 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { | 717 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { |
| 589 GETTER(ExternalFloat64Array, Double, double); | 718 GETTER(ExternalFloat64Array, Double, double); |
| 590 } | 719 } |
| 591 | 720 |
| 592 | 721 |
| 593 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { | 722 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { |
| 594 SETTER(ExternalFloat64Array, Double, value, double); | 723 SETTER(ExternalFloat64Array, Double, value, double); |
| 595 } | 724 } |
| 596 | 725 |
| 597 } // namespace dart | 726 } // namespace dart |
| OLD | NEW |