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

Side by Side Diff: pkg/front_end/lib/src/fasta/source/source_loader.dart

Issue 2804843003: Fix some crashes. (Closed)
Patch Set: Created 3 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
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 library fasta.source_loader; 5 library fasta.source_loader;
6 6
7 import 'dart:async' show Future; 7 import 'dart:async' show Future;
8 8
9 import 'dart:io' show FileSystemException;
10
11 import 'dart:typed_data' show Uint8List; 9 import 'dart:typed_data' show Uint8List;
12 10
13 import 'package:kernel/ast.dart' show Program; 11 import 'package:kernel/ast.dart' show Program;
14 12
15 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; 13 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
16 14
17 import 'package:kernel/core_types.dart' show CoreTypes; 15 import 'package:kernel/core_types.dart' show CoreTypes;
18 16
19 import '../builder/builder.dart' show Builder, ClassBuilder, LibraryBuilder; 17 import '../builder/builder.dart' show Builder, ClassBuilder, LibraryBuilder;
20 18
21 import '../compiler_context.dart' show CompilerContext; 19 import '../compiler_context.dart' show CompilerContext;
22 20
23 import '../errors.dart' show inputError; 21 import '../errors.dart' show inputError;
24 22
25 import '../export.dart' show Export; 23 import '../export.dart' show Export;
26 24
27 import '../loader.dart' show Loader; 25 import '../loader.dart' show Loader;
28 26
29 import '../parser/class_member_parser.dart' show ClassMemberParser; 27 import '../parser/class_member_parser.dart' show ClassMemberParser;
30 28
31 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan; 29 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan;
32 30
33 import '../scanner/io.dart' show readBytesFromFile; 31 import '../io.dart' show readBytesFromFile;
34 32
35 import '../target_implementation.dart' show TargetImplementation; 33 import '../target_implementation.dart' show TargetImplementation;
36 34
37 import 'diet_listener.dart' show DietListener; 35 import 'diet_listener.dart' show DietListener;
38 36
39 import 'diet_parser.dart' show DietParser; 37 import 'diet_parser.dart' show DietParser;
40 38
41 import 'outline_builder.dart' show OutlineBuilder; 39 import 'outline_builder.dart' show OutlineBuilder;
42 40
43 import 'source_class_builder.dart' show SourceClassBuilder; 41 import 'source_class_builder.dart' show SourceClassBuilder;
44 42
45 import 'source_library_builder.dart' show SourceLibraryBuilder; 43 import 'source_library_builder.dart' show SourceLibraryBuilder;
46 44
47 class SourceLoader<L> extends Loader<L> { 45 class SourceLoader<L> extends Loader<L> {
48 final Map<Uri, List<int>> sourceBytes = <Uri, List<int>>{}; 46 final Map<Uri, List<int>> sourceBytes = <Uri, List<int>>{};
49 final bool excludeSource = CompilerContext.current.options.excludeSource; 47 final bool excludeSource = CompilerContext.current.options.excludeSource;
50 48
51 // Used when building directly to kernel. 49 // Used when building directly to kernel.
52 ClassHierarchy hierarchy; 50 ClassHierarchy hierarchy;
53 CoreTypes coreTypes; 51 CoreTypes coreTypes;
54 52
55 SourceLoader(TargetImplementation target) : super(target); 53 SourceLoader(TargetImplementation target) : super(target);
56 54
57 Future<Token> tokenize(SourceLibraryBuilder library, 55 Future<Token> tokenize(SourceLibraryBuilder library,
58 {bool suppressLexicalErrors: false}) async { 56 {bool suppressLexicalErrors: false}) async {
59 Uri uri = library.fileUri; 57 Uri uri = library.fileUri;
60 if (uri == null || uri.scheme != "file") { 58 if (uri == null || uri.scheme != "file") {
61 return inputError(library.uri, -1, "Not found: ${library.uri}."); 59 return inputError(library.uri, -1, "Not found: ${library.uri}.");
62 } 60 }
63 try { 61 List<int> bytes = sourceBytes[uri];
64 List<int> bytes = sourceBytes[uri]; 62 if (bytes == null) {
65 if (bytes == null) { 63 bytes = sourceBytes[uri] = await readBytesFromFile(uri);
66 bytes = sourceBytes[uri] = await readBytesFromFile(uri); 64 }
65 byteCount += bytes.length - 1;
66 ScannerResult result = scan(bytes);
67 Token token = result.tokens;
68 if (!suppressLexicalErrors) {
69 List<int> source = getSource(bytes);
70 target.addSourceInformation(library.fileUri, result.lineStarts, source);
71 }
72 while (token is ErrorToken) {
73 if (!suppressLexicalErrors) {
74 ErrorToken error = token;
75 library.addCompileTimeError(token.charOffset, error.assertionMessage,
76 fileUri: uri);
67 } 77 }
68 byteCount += bytes.length - 1; 78 token = token.next;
69 ScannerResult result = scan(bytes);
70 Token token = result.tokens;
71 if (!suppressLexicalErrors) {
72 List<int> source = getSource(bytes);
73 target.addSourceInformation(library.fileUri, result.lineStarts, source);
74 }
75 while (token is ErrorToken) {
76 if (!suppressLexicalErrors) {
77 ErrorToken error = token;
78 library.addCompileTimeError(token.charOffset, error.assertionMessage,
79 fileUri: uri);
80 }
81 token = token.next;
82 }
83 return token;
84 } on FileSystemException catch (e) {
85 String message = e.message;
86 String osMessage = e.osError?.message;
87 if (osMessage != null && osMessage.isNotEmpty) {
88 message = osMessage;
89 }
90 return inputError(uri, -1, message);
91 } 79 }
80 return token;
92 } 81 }
93 82
94 List<int> getSource(List<int> bytes) { 83 List<int> getSource(List<int> bytes) {
95 if (excludeSource) return const <int>[]; 84 if (excludeSource) return const <int>[];
96 85
97 // bytes is 0-terminated. We don't want that included. 86 // bytes is 0-terminated. We don't want that included.
98 if (bytes is Uint8List) { 87 if (bytes is Uint8List) {
99 return new Uint8List.view( 88 return new Uint8List.view(
100 bytes.buffer, bytes.offsetInBytes, bytes.length - 1); 89 bytes.buffer, bytes.offsetInBytes, bytes.length - 1);
101 } 90 }
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 void checkOverrides(List<SourceClassBuilder> sourceClasses) { 351 void checkOverrides(List<SourceClassBuilder> sourceClasses) {
363 assert(hierarchy != null); 352 assert(hierarchy != null);
364 for (SourceClassBuilder builder in sourceClasses) { 353 for (SourceClassBuilder builder in sourceClasses) {
365 builder.checkOverrides(hierarchy); 354 builder.checkOverrides(hierarchy);
366 } 355 }
367 ticker.logMs("Checked overrides"); 356 ticker.logMs("Checked overrides");
368 } 357 }
369 358
370 List<Uri> getDependencies() => sourceBytes.keys.toList(); 359 List<Uri> getDependencies() => sourceBytes.keys.toList();
371 } 360 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/body_builder.dart ('k') | pkg/front_end/lib/src/fasta/translate_uri.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698