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

Side by Side Diff: runtime/lib/byte_array.cc

Issue 12093071: - Change the layout of external typed array objects to avoid the extra indirection when accessing e… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698