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

Side by Side Diff: runtime/lib/typed_data.dart

Issue 23686003: Add alignment checks to typed_data views (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 3 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 | « no previous file | tests/co19/co19-runtime.status » ('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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 // patch classes for Int8List ..... Float64List and ByteData implementations. 5 // patch classes for Int8List ..... Float64List and ByteData implementations.
6 6
7 patch class Int8List { 7 patch class Int8List {
8 /* patch */ factory Int8List(int length) { 8 /* patch */ factory Int8List(int length) {
9 return new _Int8Array(length); 9 return new _Int8Array(length);
10 } 10 }
(...skipping 2307 matching lines...) Expand 10 before | Expand all | Expand 10 after
2318 class _Int16ArrayView extends _TypedListView implements Int16List { 2318 class _Int16ArrayView extends _TypedListView implements Int16List {
2319 // Constructor. 2319 // Constructor.
2320 _Int16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2320 _Int16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2321 : super(buffer, _offsetInBytes, 2321 : super(buffer, _offsetInBytes,
2322 _defaultIfNull(_length, 2322 _defaultIfNull(_length,
2323 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2323 ((buffer.lengthInBytes - _offsetInBytes) ~/
2324 Int16List.BYTES_PER_ELEMENT))) { 2324 Int16List.BYTES_PER_ELEMENT))) {
2325 _rangeCheck(buffer.lengthInBytes, 2325 _rangeCheck(buffer.lengthInBytes,
2326 offsetInBytes, 2326 offsetInBytes,
2327 length * Int16List.BYTES_PER_ELEMENT); 2327 length * Int16List.BYTES_PER_ELEMENT);
2328 _offsetAlignmentCheck(_offsetInBytes, Int16List.BYTES_PER_ELEMENT);
2328 } 2329 }
2329 2330
2330 2331
2331 // Method(s) implementing List interface. 2332 // Method(s) implementing List interface.
2332 2333
2333 int operator[](int index) { 2334 int operator[](int index) {
2334 if (index < 0 || index >= length) { 2335 if (index < 0 || index >= length) {
2335 _throwRangeError(index, length); 2336 _throwRangeError(index, length);
2336 } 2337 }
2337 return _typedData._getInt16(offsetInBytes + 2338 return _typedData._getInt16(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2369 class _Uint16ArrayView extends _TypedListView implements Uint16List { 2370 class _Uint16ArrayView extends _TypedListView implements Uint16List {
2370 // Constructor. 2371 // Constructor.
2371 _Uint16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2372 _Uint16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2372 : super(buffer, _offsetInBytes, 2373 : super(buffer, _offsetInBytes,
2373 _defaultIfNull(_length, 2374 _defaultIfNull(_length,
2374 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2375 ((buffer.lengthInBytes - _offsetInBytes) ~/
2375 Uint16List.BYTES_PER_ELEMENT))) { 2376 Uint16List.BYTES_PER_ELEMENT))) {
2376 _rangeCheck(buffer.lengthInBytes, 2377 _rangeCheck(buffer.lengthInBytes,
2377 offsetInBytes, 2378 offsetInBytes,
2378 length * Uint16List.BYTES_PER_ELEMENT); 2379 length * Uint16List.BYTES_PER_ELEMENT);
2380 _offsetAlignmentCheck(_offsetInBytes, Uint16List.BYTES_PER_ELEMENT);
2379 } 2381 }
2380 2382
2381 2383
2382 // Method(s) implementing List interface. 2384 // Method(s) implementing List interface.
2383 2385
2384 int operator[](int index) { 2386 int operator[](int index) {
2385 if (index < 0 || index >= length) { 2387 if (index < 0 || index >= length) {
2386 _throwRangeError(index, length); 2388 _throwRangeError(index, length);
2387 } 2389 }
2388 return _typedData._getUint16(offsetInBytes + 2390 return _typedData._getUint16(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2420 class _Int32ArrayView extends _TypedListView implements Int32List { 2422 class _Int32ArrayView extends _TypedListView implements Int32List {
2421 // Constructor. 2423 // Constructor.
2422 _Int32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2424 _Int32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2423 : super(buffer, _offsetInBytes, 2425 : super(buffer, _offsetInBytes,
2424 _defaultIfNull(_length, 2426 _defaultIfNull(_length,
2425 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2427 ((buffer.lengthInBytes - _offsetInBytes) ~/
2426 Int32List.BYTES_PER_ELEMENT))) { 2428 Int32List.BYTES_PER_ELEMENT))) {
2427 _rangeCheck(buffer.lengthInBytes, 2429 _rangeCheck(buffer.lengthInBytes,
2428 offsetInBytes, 2430 offsetInBytes,
2429 length * Int32List.BYTES_PER_ELEMENT); 2431 length * Int32List.BYTES_PER_ELEMENT);
2432 _offsetAlignmentCheck(_offsetInBytes, Int32List.BYTES_PER_ELEMENT);
2430 } 2433 }
2431 2434
2432 2435
2433 // Method(s) implementing List interface. 2436 // Method(s) implementing List interface.
2434 2437
2435 int operator[](int index) { 2438 int operator[](int index) {
2436 if (index < 0 || index >= length) { 2439 if (index < 0 || index >= length) {
2437 _throwRangeError(index, length); 2440 _throwRangeError(index, length);
2438 } 2441 }
2439 return _typedData._getInt32(offsetInBytes + 2442 return _typedData._getInt32(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2471 class _Uint32ArrayView extends _TypedListView implements Uint32List { 2474 class _Uint32ArrayView extends _TypedListView implements Uint32List {
2472 // Constructor. 2475 // Constructor.
2473 _Uint32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2476 _Uint32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2474 : super(buffer, _offsetInBytes, 2477 : super(buffer, _offsetInBytes,
2475 _defaultIfNull(_length, 2478 _defaultIfNull(_length,
2476 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2479 ((buffer.lengthInBytes - _offsetInBytes) ~/
2477 Uint32List.BYTES_PER_ELEMENT))) { 2480 Uint32List.BYTES_PER_ELEMENT))) {
2478 _rangeCheck(buffer.lengthInBytes, 2481 _rangeCheck(buffer.lengthInBytes,
2479 offsetInBytes, 2482 offsetInBytes,
2480 length * Uint32List.BYTES_PER_ELEMENT); 2483 length * Uint32List.BYTES_PER_ELEMENT);
2484 _offsetAlignmentCheck(_offsetInBytes, Uint32List.BYTES_PER_ELEMENT);
2481 } 2485 }
2482 2486
2483 2487
2484 // Method(s) implementing List interface. 2488 // Method(s) implementing List interface.
2485 2489
2486 int operator[](int index) { 2490 int operator[](int index) {
2487 if (index < 0 || index >= length) { 2491 if (index < 0 || index >= length) {
2488 _throwRangeError(index, length); 2492 _throwRangeError(index, length);
2489 } 2493 }
2490 return _typedData._getUint32(offsetInBytes + 2494 return _typedData._getUint32(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2522 class _Int64ArrayView extends _TypedListView implements Int64List { 2526 class _Int64ArrayView extends _TypedListView implements Int64List {
2523 // Constructor. 2527 // Constructor.
2524 _Int64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2528 _Int64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2525 : super(buffer, _offsetInBytes, 2529 : super(buffer, _offsetInBytes,
2526 _defaultIfNull(_length, 2530 _defaultIfNull(_length,
2527 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2531 ((buffer.lengthInBytes - _offsetInBytes) ~/
2528 Int64List.BYTES_PER_ELEMENT))) { 2532 Int64List.BYTES_PER_ELEMENT))) {
2529 _rangeCheck(buffer.lengthInBytes, 2533 _rangeCheck(buffer.lengthInBytes,
2530 offsetInBytes, 2534 offsetInBytes,
2531 length * Int64List.BYTES_PER_ELEMENT); 2535 length * Int64List.BYTES_PER_ELEMENT);
2536 _offsetAlignmentCheck(_offsetInBytes, Int64List.BYTES_PER_ELEMENT);
2532 } 2537 }
2533 2538
2534 2539
2535 // Method(s) implementing List interface. 2540 // Method(s) implementing List interface.
2536 2541
2537 int operator[](int index) { 2542 int operator[](int index) {
2538 if (index < 0 || index >= length) { 2543 if (index < 0 || index >= length) {
2539 _throwRangeError(index, length); 2544 _throwRangeError(index, length);
2540 } 2545 }
2541 return _typedData._getInt64(offsetInBytes + 2546 return _typedData._getInt64(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2573 class _Uint64ArrayView extends _TypedListView implements Uint64List { 2578 class _Uint64ArrayView extends _TypedListView implements Uint64List {
2574 // Constructor. 2579 // Constructor.
2575 _Uint64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2580 _Uint64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2576 : super(buffer, _offsetInBytes, 2581 : super(buffer, _offsetInBytes,
2577 _defaultIfNull(_length, 2582 _defaultIfNull(_length,
2578 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2583 ((buffer.lengthInBytes - _offsetInBytes) ~/
2579 Uint64List.BYTES_PER_ELEMENT))) { 2584 Uint64List.BYTES_PER_ELEMENT))) {
2580 _rangeCheck(buffer.lengthInBytes, 2585 _rangeCheck(buffer.lengthInBytes,
2581 offsetInBytes, 2586 offsetInBytes,
2582 length * Uint64List.BYTES_PER_ELEMENT); 2587 length * Uint64List.BYTES_PER_ELEMENT);
2588 _offsetAlignmentCheck(_offsetInBytes, Uint64List.BYTES_PER_ELEMENT);
2583 } 2589 }
2584 2590
2585 2591
2586 // Method(s) implementing List interface. 2592 // Method(s) implementing List interface.
2587 2593
2588 int operator[](int index) { 2594 int operator[](int index) {
2589 if (index < 0 || index >= length) { 2595 if (index < 0 || index >= length) {
2590 _throwRangeError(index, length); 2596 _throwRangeError(index, length);
2591 } 2597 }
2592 return _typedData._getUint64(offsetInBytes + 2598 return _typedData._getUint64(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2624 class _Float32ArrayView extends _TypedListView implements Float32List { 2630 class _Float32ArrayView extends _TypedListView implements Float32List {
2625 // Constructor. 2631 // Constructor.
2626 _Float32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2632 _Float32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2627 : super(buffer, _offsetInBytes, 2633 : super(buffer, _offsetInBytes,
2628 _defaultIfNull(_length, 2634 _defaultIfNull(_length,
2629 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2635 ((buffer.lengthInBytes - _offsetInBytes) ~/
2630 Float32List.BYTES_PER_ELEMENT))) { 2636 Float32List.BYTES_PER_ELEMENT))) {
2631 _rangeCheck(buffer.lengthInBytes, 2637 _rangeCheck(buffer.lengthInBytes,
2632 offsetInBytes, 2638 offsetInBytes,
2633 length * Float32List.BYTES_PER_ELEMENT); 2639 length * Float32List.BYTES_PER_ELEMENT);
2640 _offsetAlignmentCheck(_offsetInBytes, Float32List.BYTES_PER_ELEMENT);
2634 } 2641 }
2635 2642
2636 2643
2637 // Method(s) implementing List interface. 2644 // Method(s) implementing List interface.
2638 2645
2639 double operator[](int index) { 2646 double operator[](int index) {
2640 if (index < 0 || index >= length) { 2647 if (index < 0 || index >= length) {
2641 _throwRangeError(index, length); 2648 _throwRangeError(index, length);
2642 } 2649 }
2643 return _typedData._getFloat32(offsetInBytes + 2650 return _typedData._getFloat32(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2675 class _Float64ArrayView extends _TypedListView implements Float64List { 2682 class _Float64ArrayView extends _TypedListView implements Float64List {
2676 // Constructor. 2683 // Constructor.
2677 _Float64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2684 _Float64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2678 : super(buffer, _offsetInBytes, 2685 : super(buffer, _offsetInBytes,
2679 _defaultIfNull(_length, 2686 _defaultIfNull(_length,
2680 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2687 ((buffer.lengthInBytes - _offsetInBytes) ~/
2681 Float64List.BYTES_PER_ELEMENT))) { 2688 Float64List.BYTES_PER_ELEMENT))) {
2682 _rangeCheck(buffer.lengthInBytes, 2689 _rangeCheck(buffer.lengthInBytes,
2683 offsetInBytes, 2690 offsetInBytes,
2684 length * Float64List.BYTES_PER_ELEMENT); 2691 length * Float64List.BYTES_PER_ELEMENT);
2692 _offsetAlignmentCheck(_offsetInBytes, Float64List.BYTES_PER_ELEMENT);
2685 } 2693 }
2686 2694
2687 2695
2688 // Method(s) implementing List interface. 2696 // Method(s) implementing List interface.
2689 2697
2690 double operator[](int index) { 2698 double operator[](int index) {
2691 if (index < 0 || index >= length) { 2699 if (index < 0 || index >= length) {
2692 _throwRangeError(index, length); 2700 _throwRangeError(index, length);
2693 } 2701 }
2694 return _typedData._getFloat64(offsetInBytes + 2702 return _typedData._getFloat64(offsetInBytes +
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2726 class _Float32x4ArrayView extends _TypedListView implements Float32x4List { 2734 class _Float32x4ArrayView extends _TypedListView implements Float32x4List {
2727 // Constructor. 2735 // Constructor.
2728 _Float32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length]) 2736 _Float32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
2729 : super(buffer, _offsetInBytes, 2737 : super(buffer, _offsetInBytes,
2730 _defaultIfNull(_length, 2738 _defaultIfNull(_length,
2731 ((buffer.lengthInBytes - _offsetInBytes) ~/ 2739 ((buffer.lengthInBytes - _offsetInBytes) ~/
2732 Float32x4List.BYTES_PER_ELEMENT))) { 2740 Float32x4List.BYTES_PER_ELEMENT))) {
2733 _rangeCheck(buffer.lengthInBytes, 2741 _rangeCheck(buffer.lengthInBytes,
2734 offsetInBytes, 2742 offsetInBytes,
2735 length * Float32x4List.BYTES_PER_ELEMENT); 2743 length * Float32x4List.BYTES_PER_ELEMENT);
2744 _offsetAlignmentCheck(_offsetInBytes, Float32x4List.BYTES_PER_ELEMENT);
2736 } 2745 }
2737 2746
2738 2747
2739 // Method(s) implementing List interface. 2748 // Method(s) implementing List interface.
2740 2749
2741 Float32x4 operator[](int index) { 2750 Float32x4 operator[](int index) {
2742 if (index < 0 || index >= length) { 2751 if (index < 0 || index >= length) {
2743 _throwRangeError(index, length); 2752 _throwRangeError(index, length);
2744 } 2753 }
2745 return _typedData._getFloat32x4(offsetInBytes + 2754 return _typedData._getFloat32x4(offsetInBytes +
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
3118 } 3127 }
3119 if (start < 0) { 3128 if (start < 0) {
3120 throw new RangeError.value(start); 3129 throw new RangeError.value(start);
3121 } 3130 }
3122 if (start + length > listLength) { 3131 if (start + length > listLength) {
3123 throw new RangeError.value(start + length); 3132 throw new RangeError.value(start + length);
3124 } 3133 }
3125 } 3134 }
3126 3135
3127 3136
3137 void _offsetAlignmentCheck(int offset, int alignment) {
3138 if ((offset % alignment) != 0) {
3139 throw new RangeError('Offset ($offset) must be a multiple of '
3140 'BYTES_PER_ELEMENT ($alignment)');
3141 }
3142 }
3143
3144
3128 int _defaultIfNull(object, value) { 3145 int _defaultIfNull(object, value) {
3129 if (object == null) { 3146 if (object == null) {
3130 return value; 3147 return value;
3131 } 3148 }
3132 return object; 3149 return object;
3133 } 3150 }
3134 3151
3135 3152
3136 void _throwRangeError(int index, int length) { 3153 void _throwRangeError(int index, int length) {
3137 String message = "$index must be in the range [0..$length)"; 3154 String message = "$index must be in the range [0..$length)";
3138 throw new RangeError(message); 3155 throw new RangeError(message);
3139 } 3156 }
OLDNEW
« no previous file with comments | « no previous file | tests/co19/co19-runtime.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698