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

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

Issue 1059493002: Fixes bug in typed data read/write for floats and doubles. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 8 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 | runtime/vm/method_recognizer.h » ('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 import "dart:_internal"; 7 import "dart:_internal";
8 import 'dart:math' show Random; 8 import 'dart:math' show Random;
9 9
10 patch class Int8List { 10 patch class Int8List {
(...skipping 3428 matching lines...) Expand 10 before | Expand all | Expand 10 after
3439 } 3439 }
3440 _typedData._setUint64(_offset + byteOffset, 3440 _typedData._setUint64(_offset + byteOffset,
3441 identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value)); 3441 identical(endian, Endianness.HOST_ENDIAN) ? value : _byteSwap64(value));
3442 } 3442 }
3443 3443
3444 double getFloat32(int byteOffset, 3444 double getFloat32(int byteOffset,
3445 [Endianness endian = Endianness.BIG_ENDIAN]) { 3445 [Endianness endian = Endianness.BIG_ENDIAN]) {
3446 if (byteOffset < 0 || byteOffset + 3 >= length) { 3446 if (byteOffset < 0 || byteOffset + 3 >= length) {
3447 throw _newRangeError(byteOffset + 3, length); 3447 throw _newRangeError(byteOffset + 3, length);
3448 } 3448 }
3449 var result = _typedData._getFloat32(_offset + byteOffset);
3450 if (identical(endian, Endianness.HOST_ENDIAN)) { 3449 if (identical(endian, Endianness.HOST_ENDIAN)) {
3451 return result; 3450 return _typedData._getFloat32(_offset + byteOffset);
3452 } 3451 }
3453 return _byteSwapFloat32(result); 3452 _convU32[0] = _byteSwap32(_typedData._getUint32(_offset + byteOffset));
3453 return _convF32[0];
3454 } 3454 }
3455 void setFloat32(int byteOffset, 3455 void setFloat32(int byteOffset,
3456 double value, 3456 double value,
3457 [Endianness endian = Endianness.BIG_ENDIAN]) { 3457 [Endianness endian = Endianness.BIG_ENDIAN]) {
3458 if (byteOffset < 0 || byteOffset + 3 >= length) { 3458 if (byteOffset < 0 || byteOffset + 3 >= length) {
3459 throw _newRangeError(byteOffset + 3, length); 3459 throw _newRangeError(byteOffset + 3, length);
3460 } 3460 }
3461 _typedData._setFloat32(_offset + byteOffset, 3461 if (identical(endian, Endianness.HOST_ENDIAN)) {
3462 identical(endian, Endianness.HOST_ENDIAN) ? value 3462 _typedData._setFloat32(_offset + byteOffset, value);
3463 : _byteSwapFloat32(value)); 3463 return;
3464 }
3465 _convF32[0] = value;
3466 _typedData._setUint32(_offset + byteOffset, _byteSwap32(_convU32[0]));
3464 } 3467 }
3465 3468
3466 double getFloat64(int byteOffset, 3469 double getFloat64(int byteOffset,
3467 [Endianness endian = Endianness.BIG_ENDIAN]) { 3470 [Endianness endian = Endianness.BIG_ENDIAN]) {
3468 if (byteOffset < 0 || byteOffset + 7 >= length) { 3471 if (byteOffset < 0 || byteOffset + 7 >= length) {
3469 throw _newRangeError(byteOffset + 7, length); 3472 throw _newRangeError(byteOffset + 7, length);
3470 } 3473 }
3471 var result = _typedData._getFloat64(_offset + byteOffset);
3472 if (identical(endian, Endianness.HOST_ENDIAN)) { 3474 if (identical(endian, Endianness.HOST_ENDIAN)) {
3473 return result; 3475 return _typedData._getFloat64(_offset + byteOffset);
3474 } 3476 }
3475 return _byteSwapFloat64(result); 3477 _convU64[0] = _byteSwap64(_typedData._getUint64(_offset + byteOffset));
3478 return _convF64[0];
3476 } 3479 }
3477 void setFloat64(int byteOffset, 3480 void setFloat64(int byteOffset,
3478 double value, 3481 double value,
3479 [Endianness endian = Endianness.BIG_ENDIAN]) { 3482 [Endianness endian = Endianness.BIG_ENDIAN]) {
3480 if (byteOffset < 0 || byteOffset + 7 >= length) { 3483 if (byteOffset < 0 || byteOffset + 7 >= length) {
3481 throw _newRangeError(byteOffset + 7, length); 3484 throw _newRangeError(byteOffset + 7, length);
3482 } 3485 }
3483 _typedData._setFloat64(_offset + byteOffset, 3486 if (identical(endian, Endianness.HOST_ENDIAN)) {
3484 identical(endian, Endianness.HOST_ENDIAN) ? value 3487 _typedData._setFloat64(_offset + byteOffset, value);
3485 : _byteSwapFloat64(value)); 3488 return;
3489 }
3490 _convF64[0] = value;
3491 _typedData._setUint64(_offset + byteOffset, _byteSwap64(_convU64[0]));
3486 } 3492 }
3487 3493
3488 Float32x4 getFloat32x4(int byteOffset, 3494 Float32x4 getFloat32x4(int byteOffset,
3489 [Endianness endian = Endianness.BIG_ENDIAN]) { 3495 [Endianness endian = Endianness.BIG_ENDIAN]) {
3490 if (byteOffset < 0 || byteOffset + 3 >= length) { 3496 if (byteOffset < 0 || byteOffset + 3 >= length) {
3491 throw _newRangeError(byteOffset + 3, length); 3497 throw _newRangeError(byteOffset + 3, length);
3492 } 3498 }
3493 // TODO(johnmccutchan) : Need to resolve this for endianity. 3499 // TODO(johnmccutchan) : Need to resolve this for endianity.
3494 return _typedData._getFloat32x4(_offset + byteOffset); 3500 return _typedData._getFloat32x4(_offset + byteOffset);
3495 } 3501 }
(...skipping 22 matching lines...) Expand all
3518 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); 3524 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
3519 value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16); 3525 value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16);
3520 return value; 3526 return value;
3521 } 3527 }
3522 3528
3523 int _byteSwap64(int value) { 3529 int _byteSwap64(int value) {
3524 return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32); 3530 return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32);
3525 } 3531 }
3526 3532
3527 final _convU32 = new Uint32List(2); 3533 final _convU32 = new Uint32List(2);
3534 final _convU64 = new Uint64List.view(_convU32.buffer);
3528 final _convF32 = new Float32List.view(_convU32.buffer); 3535 final _convF32 = new Float32List.view(_convU32.buffer);
3529 final _convF64 = new Float64List.view(_convU32.buffer); 3536 final _convF64 = new Float64List.view(_convU32.buffer);
3530 3537
3531 double _byteSwapFloat32(double value) {
3532 _convF32[0] = value;
3533 _convU32[0] = _byteSwap32(_convU32[0]);
3534 return _convF32[0];
3535 }
3536
3537 double _byteSwapFloat64(double value) {
3538 _convF64[0] = value;
3539 var lo = _convU32[0];
3540 _convU32[0] = _byteSwap32(_convU32[1]);
3541 _convU32[1] = _byteSwap32(lo);
3542 return _convF64[0];
3543 }
3544
3545 // Top level utility methods. 3538 // Top level utility methods.
3546 int _toInt(int value, int mask) { 3539 int _toInt(int value, int mask) {
3547 value &= mask; 3540 value &= mask;
3548 if (value > (mask >> 1)) value -= mask + 1; 3541 if (value > (mask >> 1)) value -= mask + 1;
3549 return value; 3542 return value;
3550 } 3543 }
3551 3544
3552 3545
3553 int _toInt8(int value) { 3546 int _toInt8(int value) {
3554 return _toInt(value, 0xFF); 3547 return _toInt(value, 0xFF);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3627 return value; 3620 return value;
3628 } 3621 }
3629 return object; 3622 return object;
3630 } 3623 }
3631 3624
3632 3625
3633 _newRangeError(int index, int length) { 3626 _newRangeError(int index, int length) {
3634 String message = "$index must be in the range [0..$length)"; 3627 String message = "$index must be in the range [0..$length)";
3635 return new RangeError(message); 3628 return new RangeError(message);
3636 } 3629 }
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/method_recognizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698