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

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

Issue 11414211: Expose transferable constructor to Int8List (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Review fixes Created 8 years 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 | « no previous file | runtime/lib/byte_array.dart » ('j') | runtime/vm/os_android.cc » ('J')
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 "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
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>
cshapiro 2012/11/30 00:23:25 Sorry, this is not what I meant. You should make
Cutch 2012/11/30 04:09:54 If OS::AlignedAllocate is a template where should
cshapiro 2012/11/30 18:02:15 Adding the OS::AllocateAlignedArray<T> template so
48 T* AllocateAlignedExternalArray(intptr_t n) {
49 intptr_t size = n*sizeof(T); // NOLINT
50 void* p = OS::AlignedAllocate(size,
51 ExternalByteArrayData<T>::Alignment);
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
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
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
OLDNEW
« no previous file with comments | « no previous file | runtime/lib/byte_array.dart » ('j') | runtime/vm/os_android.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698