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 #define EXTERNAL_ALIGNMENT 16 | |
|
cshapiro
2012/11/29 21:28:17
Macros like this are strongly discouraged by the s
Cutch
2012/11/29 23:53:17
Done.
| |
| 46 | |
| 47 void FinalizeExternalBytes(void* ptr) { | |
|
cshapiro
2012/11/29 21:28:17
Any reason for this routine? Why not just pass OS
Cutch
2012/11/29 23:53:17
Done.
| |
| 48 OS::AlignedFree(ptr); | |
| 49 } | |
| 45 | 50 |
| 46 #define GETTER_ARGUMENTS(ArrayT, ValueT) \ | 51 #define GETTER_ARGUMENTS(ArrayT, ValueT) \ |
| 47 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ | 52 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ |
| 48 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); | 53 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); |
| 49 | 54 |
| 50 | 55 |
| 51 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \ | 56 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \ |
| 52 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ | 57 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ |
| 53 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \ | 58 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \ |
| 54 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->NativeArgAt(2)); | 59 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->NativeArgAt(2)); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 278 // Int8Array | 283 // Int8Array |
| 279 | 284 |
| 280 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { | 285 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { |
| 281 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 286 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 282 intptr_t len = length.Value(); | 287 intptr_t len = length.Value(); |
| 283 LengthCheck(len, Int8Array::kMaxElements); | 288 LengthCheck(len, Int8Array::kMaxElements); |
| 284 return Int8Array::New(len); | 289 return Int8Array::New(len); |
| 285 } | 290 } |
| 286 | 291 |
| 287 | 292 |
| 293 DEFINE_NATIVE_ENTRY(Int8Array_newTransferrable, 1) { | |
| 294 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 295 intptr_t len = length.Value(); | |
| 296 LengthCheck(len, Int8Array::kMaxElements); | |
| 297 void* bytes = OS::AlignedAllocate(len*sizeof(int8_t), EXTERNAL_ALIGNMENT); | |
|
cshapiro
2012/11/29 21:28:17
I think there are some opportunities for improveme
Cutch
2012/11/29 23:53:17
Done.
| |
| 298 return ExternalInt8Array::New(reinterpret_cast<int8_t*>(bytes), | |
| 299 len, | |
| 300 bytes, | |
| 301 FinalizeExternalBytes); | |
| 302 } | |
| 303 | |
| 304 | |
| 288 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { | 305 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { |
| 289 GETTER(Int8Array, Smi, int8_t); | 306 GETTER(Int8Array, Smi, int8_t); |
| 290 } | 307 } |
| 291 | 308 |
| 292 | 309 |
| 293 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { | 310 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { |
| 294 SETTER(Int8Array, Smi, Value, int8_t); | 311 SETTER(Int8Array, Smi, Value, int8_t); |
| 295 } | 312 } |
| 296 | 313 |
| 297 | 314 |
| 298 // Uint8Array | 315 // Uint8Array |
| 299 | 316 |
| 300 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { | 317 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { |
| 301 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 318 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 302 intptr_t len = length.Value(); | 319 intptr_t len = length.Value(); |
| 303 LengthCheck(len, Uint8Array::kMaxElements); | 320 LengthCheck(len, Uint8Array::kMaxElements); |
| 304 return Uint8Array::New(len); | 321 return Uint8Array::New(len); |
| 305 } | 322 } |
| 306 | 323 |
| 307 | 324 |
| 325 DEFINE_NATIVE_ENTRY(Uint8Array_newTransferrable, 1) { | |
| 326 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 327 intptr_t len = length.Value(); | |
| 328 LengthCheck(len, Uint8Array::kMaxElements); | |
| 329 void* bytes = OS::AlignedAllocate(len * sizeof(uint8_t), | |
| 330 EXTERNAL_ALIGNMENT); | |
| 331 return ExternalUint8Array::New(reinterpret_cast<uint8_t*>(bytes), | |
| 332 len, | |
| 333 bytes, | |
| 334 FinalizeExternalBytes); | |
| 335 } | |
| 336 | |
| 337 | |
| 308 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { | 338 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { |
| 309 GETTER(Uint8Array, Smi, uint8_t); | 339 GETTER(Uint8Array, Smi, uint8_t); |
| 310 } | 340 } |
| 311 | 341 |
| 312 | 342 |
| 313 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { | 343 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { |
| 314 SETTER(Uint8Array, Smi, Value, uint8_t); | 344 SETTER(Uint8Array, Smi, Value, uint8_t); |
| 315 } | 345 } |
| 316 | 346 |
| 317 | 347 |
| 318 // Int16Array | 348 // Int16Array |
| 319 | 349 |
| 320 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { | 350 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { |
| 321 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 351 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 322 intptr_t len = length.Value(); | 352 intptr_t len = length.Value(); |
| 323 LengthCheck(len, Int16Array::kMaxElements); | 353 LengthCheck(len, Int16Array::kMaxElements); |
| 324 return Int16Array::New(len); | 354 return Int16Array::New(len); |
| 325 } | 355 } |
| 326 | 356 |
| 327 | 357 |
| 358 DEFINE_NATIVE_ENTRY(Int16Array_newTransferrable, 1) { | |
| 359 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 360 intptr_t len = length.Value(); | |
| 361 LengthCheck(len, Int16Array::kMaxElements); | |
| 362 void* bytes = OS::AlignedAllocate(len * sizeof(int16_t), | |
| 363 EXTERNAL_ALIGNMENT); | |
| 364 return ExternalInt16Array::New(reinterpret_cast<int16_t*>(bytes), | |
| 365 len, | |
| 366 bytes, | |
| 367 FinalizeExternalBytes); | |
| 368 } | |
| 369 | |
| 370 | |
| 328 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { | 371 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { |
| 329 GETTER(Int16Array, Smi, int16_t); | 372 GETTER(Int16Array, Smi, int16_t); |
| 330 } | 373 } |
| 331 | 374 |
| 332 | 375 |
| 333 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { | 376 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { |
| 334 SETTER(Int16Array, Smi, Value, int16_t); | 377 SETTER(Int16Array, Smi, Value, int16_t); |
| 335 } | 378 } |
| 336 | 379 |
| 337 | 380 |
| 338 // Uint16Array | 381 // Uint16Array |
| 339 | 382 |
| 340 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { | 383 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { |
| 341 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 384 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 342 intptr_t len = length.Value(); | 385 intptr_t len = length.Value(); |
| 343 LengthCheck(len, Uint16Array::kMaxElements); | 386 LengthCheck(len, Uint16Array::kMaxElements); |
| 344 return Uint16Array::New(len); | 387 return Uint16Array::New(len); |
| 345 } | 388 } |
| 346 | 389 |
| 347 | 390 |
| 391 DEFINE_NATIVE_ENTRY(Uint16Array_newTransferrable, 1) { | |
| 392 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 393 intptr_t len = length.Value(); | |
| 394 LengthCheck(len, Uint16Array::kMaxElements); | |
| 395 void* bytes = OS::AlignedAllocate(len * sizeof(uint16_t), | |
| 396 EXTERNAL_ALIGNMENT); | |
| 397 return ExternalUint16Array::New(reinterpret_cast<uint16_t*>(bytes), | |
| 398 len, | |
| 399 bytes, | |
| 400 FinalizeExternalBytes); | |
| 401 } | |
| 402 | |
| 403 | |
| 348 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { | 404 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { |
| 349 GETTER(Uint16Array, Smi, uint16_t); | 405 GETTER(Uint16Array, Smi, uint16_t); |
| 350 } | 406 } |
| 351 | 407 |
| 352 | 408 |
| 353 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { | 409 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { |
| 354 SETTER(Uint16Array, Smi, Value, uint16_t); | 410 SETTER(Uint16Array, Smi, Value, uint16_t); |
| 355 } | 411 } |
| 356 | 412 |
| 357 | 413 |
| 358 // Int32Array | 414 // Int32Array |
| 359 | 415 |
| 360 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { | 416 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { |
| 361 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 417 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 362 intptr_t len = length.Value(); | 418 intptr_t len = length.Value(); |
| 363 LengthCheck(len, Int32Array::kMaxElements); | 419 LengthCheck(len, Int32Array::kMaxElements); |
| 364 return Int32Array::New(len); | 420 return Int32Array::New(len); |
| 365 } | 421 } |
| 366 | 422 |
| 367 | 423 |
| 424 DEFINE_NATIVE_ENTRY(Int32Array_newTransferrable, 1) { | |
| 425 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 426 intptr_t len = length.Value(); | |
| 427 LengthCheck(len, Int32Array::kMaxElements); | |
| 428 void* bytes = OS::AlignedAllocate(len * sizeof(int32_t), | |
| 429 EXTERNAL_ALIGNMENT); | |
| 430 return ExternalInt32Array::New(reinterpret_cast<int32_t*>(bytes), | |
| 431 len, | |
| 432 bytes, | |
| 433 FinalizeExternalBytes); | |
| 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 void* bytes = OS::AlignedAllocate(len * sizeof(uint32_t), | |
| 462 EXTERNAL_ALIGNMENT); | |
| 463 return ExternalUint32Array::New(reinterpret_cast<uint32_t*>(bytes), | |
| 464 len, | |
| 465 bytes, | |
| 466 FinalizeExternalBytes); | |
| 467 } | |
| 468 | |
| 469 | |
| 388 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { | 470 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { |
| 389 GETTER(Uint32Array, Integer, uint32_t); | 471 GETTER(Uint32Array, Integer, uint32_t); |
| 390 } | 472 } |
| 391 | 473 |
| 392 | 474 |
| 393 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { | 475 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { |
| 394 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); | 476 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); |
| 395 } | 477 } |
| 396 | 478 |
| 397 | 479 |
| 398 // Int64Array | 480 // Int64Array |
| 399 | 481 |
| 400 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { | 482 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { |
| 401 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 483 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 402 intptr_t len = length.Value(); | 484 intptr_t len = length.Value(); |
| 403 LengthCheck(len, Int64Array::kMaxElements); | 485 LengthCheck(len, Int64Array::kMaxElements); |
| 404 return Int64Array::New(len); | 486 return Int64Array::New(len); |
| 405 } | 487 } |
| 406 | 488 |
| 407 | 489 |
| 490 DEFINE_NATIVE_ENTRY(Int64Array_newTransferrable, 1) { | |
| 491 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 492 intptr_t len = length.Value(); | |
| 493 LengthCheck(len, Int64Array::kMaxElements); | |
| 494 void* bytes = OS::AlignedAllocate(len * sizeof(int64_t), | |
| 495 EXTERNAL_ALIGNMENT); | |
| 496 return ExternalInt64Array::New(reinterpret_cast<int64_t*>(bytes), | |
| 497 len, | |
| 498 bytes, | |
| 499 FinalizeExternalBytes); | |
| 500 } | |
| 501 | |
| 502 | |
| 408 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { | 503 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { |
| 409 GETTER(Int64Array, Integer, int64_t); | 504 GETTER(Int64Array, Integer, int64_t); |
| 410 } | 505 } |
| 411 | 506 |
| 412 | 507 |
| 413 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { | 508 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { |
| 414 SETTER(Int64Array, Integer, AsInt64Value, int64_t); | 509 SETTER(Int64Array, Integer, AsInt64Value, int64_t); |
| 415 } | 510 } |
| 416 | 511 |
| 417 | 512 |
| 418 // Uint64Array | 513 // Uint64Array |
| 419 | 514 |
| 420 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { | 515 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { |
| 421 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 516 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 422 intptr_t len = length.Value(); | 517 intptr_t len = length.Value(); |
| 423 LengthCheck(len, Uint64Array::kMaxElements); | 518 LengthCheck(len, Uint64Array::kMaxElements); |
| 424 return Uint64Array::New(len); | 519 return Uint64Array::New(len); |
| 425 } | 520 } |
| 426 | 521 |
| 427 | 522 |
| 523 DEFINE_NATIVE_ENTRY(Uint64Array_newTransferrable, 1) { | |
| 524 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 525 intptr_t len = length.Value(); | |
| 526 LengthCheck(len, Uint64Array::kMaxElements); | |
| 527 void* bytes = OS::AlignedAllocate(len * sizeof(uint64_t), | |
| 528 EXTERNAL_ALIGNMENT); | |
| 529 return ExternalUint64Array::New(reinterpret_cast<uint64_t*>(bytes), | |
| 530 len, | |
| 531 bytes, | |
| 532 FinalizeExternalBytes); | |
| 533 } | |
| 534 | |
| 535 | |
| 428 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { | 536 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { |
| 429 GETTER_UINT64(Uint64Array); | 537 GETTER_UINT64(Uint64Array); |
| 430 } | 538 } |
| 431 | 539 |
| 432 | 540 |
| 433 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { | 541 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { |
| 434 SETTER_UINT64(Uint64Array); | 542 SETTER_UINT64(Uint64Array); |
| 435 } | 543 } |
| 436 | 544 |
| 437 | 545 |
| 438 // Float32Array | 546 // Float32Array |
| 439 | 547 |
| 440 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { | 548 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { |
| 441 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 549 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 442 intptr_t len = length.Value(); | 550 intptr_t len = length.Value(); |
| 443 LengthCheck(len, Float32Array::kMaxElements); | 551 LengthCheck(len, Float32Array::kMaxElements); |
| 444 return Float32Array::New(len); | 552 return Float32Array::New(len); |
| 445 } | 553 } |
| 446 | 554 |
| 447 | 555 |
| 556 DEFINE_NATIVE_ENTRY(Float32Array_newTransferrable, 1) { | |
| 557 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 558 intptr_t len = length.Value(); | |
| 559 LengthCheck(len, Float32Array::kMaxElements); | |
| 560 float foo; // quiet cpplint. | |
|
cshapiro
2012/11/29 21:28:17
cpplint does not want you using sizeof(<typename>)
Cutch
2012/11/29 23:53:17
Done.
| |
| 561 void* bytes = OS::AlignedAllocate(len * sizeof(foo), | |
| 562 EXTERNAL_ALIGNMENT); | |
| 563 return ExternalFloat32Array::New(reinterpret_cast<float*>(bytes), | |
| 564 len, | |
| 565 bytes, | |
| 566 FinalizeExternalBytes); | |
| 567 } | |
| 568 | |
| 569 | |
| 448 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { | 570 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { |
| 449 GETTER(Float32Array, Double, float); | 571 GETTER(Float32Array, Double, float); |
| 450 } | 572 } |
| 451 | 573 |
| 452 | 574 |
| 453 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { | 575 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { |
| 454 SETTER(Float32Array, Double, value, float); | 576 SETTER(Float32Array, Double, value, float); |
| 455 } | 577 } |
| 456 | 578 |
| 457 | 579 |
| 458 // Float64Array | 580 // Float64Array |
| 459 | 581 |
| 460 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { | 582 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { |
| 461 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | 583 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| 462 intptr_t len = length.Value(); | 584 intptr_t len = length.Value(); |
| 463 LengthCheck(len, Float64Array::kMaxElements); | 585 LengthCheck(len, Float64Array::kMaxElements); |
| 464 return Float64Array::New(len); | 586 return Float64Array::New(len); |
| 465 } | 587 } |
| 466 | 588 |
| 467 | 589 |
| 590 DEFINE_NATIVE_ENTRY(Float64Array_newTransferrable, 1) { | |
| 591 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); | |
| 592 intptr_t len = length.Value(); | |
| 593 LengthCheck(len, Float64Array::kMaxElements); | |
| 594 double foo; // quiet cpplint. | |
| 595 void* bytes = OS::AlignedAllocate(len * sizeof(foo), | |
| 596 EXTERNAL_ALIGNMENT); | |
| 597 return ExternalFloat64Array::New(reinterpret_cast<double*>(bytes), | |
| 598 len, | |
| 599 bytes, | |
| 600 FinalizeExternalBytes); | |
| 601 } | |
| 602 | |
| 603 | |
| 468 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { | 604 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { |
| 469 GETTER(Float64Array, Double, double); | 605 GETTER(Float64Array, Double, double); |
| 470 } | 606 } |
| 471 | 607 |
| 472 | 608 |
| 473 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) { | 609 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) { |
| 474 SETTER(Float64Array, Double, value, double); | 610 SETTER(Float64Array, Double, value, double); |
| 475 } | 611 } |
| 476 | 612 |
| 477 | 613 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 588 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { | 724 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { |
| 589 GETTER(ExternalFloat64Array, Double, double); | 725 GETTER(ExternalFloat64Array, Double, double); |
| 590 } | 726 } |
| 591 | 727 |
| 592 | 728 |
| 593 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { | 729 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { |
| 594 SETTER(ExternalFloat64Array, Double, value, double); | 730 SETTER(ExternalFloat64Array, Double, value, double); |
| 595 } | 731 } |
| 596 | 732 |
| 597 } // namespace dart | 733 } // namespace dart |
| OLD | NEW |