| Index: runtime/bin/file_impl.dart
|
| diff --git a/runtime/bin/file_impl.dart b/runtime/bin/file_impl.dart
|
| index 4e0f2a3e63fd2e520f0aa5930a6ba35978951a6a..10a5cfc9b393f835ab03825f7a5dcabc3e2c79ce 100644
|
| --- a/runtime/bin/file_impl.dart
|
| +++ b/runtime/bin/file_impl.dart
|
| @@ -650,8 +650,8 @@ class _File extends _FileBase implements File {
|
|
|
| Future<String> readAsText([Encoding encoding = Encoding.UTF_8]) {
|
| _ensureFileService();
|
| + var decoder = _StringDecoders.decoder(encoding);
|
| return readAsBytes().transform((bytes) {
|
| - var decoder = _StringDecoders.decoder(encoding);
|
| decoder.write(bytes);
|
| return decoder.decoded;
|
| });
|
| @@ -683,8 +683,8 @@ class _File extends _FileBase implements File {
|
| Future<List<String>> readAsLines([Encoding encoding = Encoding.UTF_8]) {
|
| _ensureFileService();
|
| Completer<List<String>> completer = new Completer<List<String>>();
|
| + var decoder = _StringDecoders.decoder(encoding);
|
| return readAsBytes().transform((bytes) {
|
| - var decoder = _StringDecoders.decoder(encoding);
|
| decoder.write(bytes);
|
| return _getDecodedLines(decoder);
|
| });
|
| @@ -716,7 +716,16 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
|
|
| Future<RandomAccessFile> close() {
|
| Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| + if (_id == 0) {
|
| + // Complete asynchronously so the user has a chance to setup
|
| + // handlers without getting exceptions when registering the
|
| + // then handler.
|
| + new Timer(0, (t) {
|
| + completer.completeException(
|
| + new FileIOException("Cannot close file '$_name'"));
|
| + });
|
| + return completer.future;
|
| + }
|
| _ensureFileService();
|
| List request = new List(2);
|
| request[0] = _FileUtils.kCloseRequest;
|
| @@ -747,7 +756,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| Future<int> readByte() {
|
| _ensureFileService();
|
| Completer<int> completer = new Completer<int>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(2);
|
| request[0] = _FileUtils.kReadByteRequest;
|
| request[1] = _id;
|
| @@ -785,7 +793,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| });
|
| return completer.future;
|
| };
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(3);
|
| request[0] = _FileUtils.kReadListRequest;
|
| request[1] = _id;
|
| @@ -838,7 +845,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| });
|
| return completer.future;
|
| }
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(3);
|
| request[0] = _FileUtils.kWriteByteRequest;
|
| request[1] = _id;
|
| @@ -882,7 +888,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| });
|
| return completer.future;
|
| }
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
|
|
| List result =
|
| _FileUtils.ensureFastAndSerializableBuffer(buffer, offset, bytes);
|
| @@ -930,7 +935,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| [Encoding encoding = Encoding.UTF_8]) {
|
| _ensureFileService();
|
| Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(3);
|
| request[0] = _FileUtils.kWriteStringRequest;
|
| request[1] = _id;
|
| @@ -959,7 +963,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| Future<int> position() {
|
| _ensureFileService();
|
| Completer<int> completer = new Completer<int>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(2);
|
| request[0] = _FileUtils.kPositionRequest;
|
| request[1] = _id;
|
| @@ -987,7 +990,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| Future<RandomAccessFile> setPosition(int position) {
|
| _ensureFileService();
|
| Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(3);
|
| request[0] = _FileUtils.kSetPositionRequest;
|
| request[1] = _id;
|
| @@ -1015,7 +1017,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| Future<RandomAccessFile> truncate(int length) {
|
| _ensureFileService();
|
| Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(3);
|
| request[0] = _FileUtils.kTruncateRequest;
|
| request[1] = _id;
|
| @@ -1043,7 +1044,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| Future<int> length() {
|
| _ensureFileService();
|
| Completer<int> completer = new Completer<int>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(2);
|
| request[0] = _FileUtils.kLengthRequest;
|
| request[1] = _id;
|
| @@ -1071,7 +1071,6 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| Future<RandomAccessFile> flush() {
|
| _ensureFileService();
|
| Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
|
| - if (_isClosed) return _completeWithClosedException(completer);
|
| List request = new List(2);
|
| request[0] = _FileUtils.kFlushRequest;
|
| request[1] = _id;
|
| @@ -1103,22 +1102,12 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile {
|
| }
|
| }
|
|
|
| - bool get _isClosed() => _id == 0;
|
| -
|
| void _checkNotClosed() {
|
| - if (_isClosed) {
|
| + if (_id == 0) {
|
| throw new FileIOException("File closed '$_name'");
|
| }
|
| }
|
|
|
| - Future _completeWithClosedException(Completer completer) {
|
| - new Timer(0, (t) {
|
| - completer.completeException(
|
| - new FileIOException("File closed '$_name'"));
|
| - });
|
| - return completer.future;
|
| - }
|
| -
|
| final String _name;
|
| int _id;
|
|
|
|
|