Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 library kernel.ast_from_binary; | 4 library kernel.ast_from_binary; |
| 5 | 5 |
| 6 import 'dart:convert'; | 6 import 'dart:convert'; |
| 7 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
| 8 | 8 |
| 9 import '../ast.dart'; | 9 import '../ast.dart'; |
| 10 import '../transformations/flags.dart'; | 10 import '../transformations/flags.dart'; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 | 23 |
| 24 class BinaryBuilder { | 24 class BinaryBuilder { |
| 25 final List<VariableDeclaration> variableStack = <VariableDeclaration>[]; | 25 final List<VariableDeclaration> variableStack = <VariableDeclaration>[]; |
| 26 final List<LabeledStatement> labelStack = <LabeledStatement>[]; | 26 final List<LabeledStatement> labelStack = <LabeledStatement>[]; |
| 27 int labelStackBase = 0; | 27 int labelStackBase = 0; |
| 28 final List<SwitchCase> switchCaseStack = <SwitchCase>[]; | 28 final List<SwitchCase> switchCaseStack = <SwitchCase>[]; |
| 29 final List<TypeParameter> typeParameterStack = <TypeParameter>[]; | 29 final List<TypeParameter> typeParameterStack = <TypeParameter>[]; |
| 30 final String filename; | 30 final String filename; |
| 31 final List<int> _bytes; | 31 final List<int> _bytes; |
| 32 int _byteIndex = 0; | 32 int _byteIndex = 0; |
| 33 List<String> _stringTable; | 33 final List<String> _stringTable = <String>[]; |
| 34 List<String> _sourceUriTable; | 34 final List<String> _sourceUriTable = <String>[]; |
| 35 List<CanonicalName> _linkTable; | 35 List<CanonicalName> _linkTable; |
| 36 int _transformerFlags = 0; | 36 int _transformerFlags = 0; |
| 37 Library _currentLibrary; | 37 Library _currentLibrary; |
| 38 | 38 |
| 39 // If something goes wrong, this list should indicate what library, | 39 // If something goes wrong, this list should indicate what library, |
| 40 // class, and member was being built. | 40 // class, and member was being built. |
| 41 List<String> debugPath = <String>[]; | 41 List<String> debugPath = <String>[]; |
| 42 | 42 |
| 43 bool _isReadingLibraryImplementation = false; | 43 bool _isReadingLibraryImplementation = false; |
| 44 | 44 |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 75 readByte(); | 75 readByte(); |
| 76 } | 76 } |
| 77 | 77 |
| 78 List<int> readUtf8Bytes() { | 78 List<int> readUtf8Bytes() { |
| 79 List<int> bytes = new Uint8List(readUInt()); | 79 List<int> bytes = new Uint8List(readUInt()); |
| 80 bytes.setRange(0, bytes.length, _bytes, _byteIndex); | 80 bytes.setRange(0, bytes.length, _bytes, _byteIndex); |
| 81 _byteIndex += bytes.length; | 81 _byteIndex += bytes.length; |
| 82 return bytes; | 82 return bytes; |
| 83 } | 83 } |
| 84 | 84 |
| 85 String readStringEntry() { | 85 String readStringEntry(int numBytes) { |
| 86 int numBytes = readUInt(); | |
| 87 // Utf8Decoder will skip leading BOM characters, but we must preserve them. | 86 // Utf8Decoder will skip leading BOM characters, but we must preserve them. |
| 88 // Collect leading BOMs before passing the bytes onto Utf8Decoder. | 87 // Collect leading BOMs before passing the bytes onto Utf8Decoder. |
| 89 int numByteOrderMarks = 0; | 88 int numByteOrderMarks = 0; |
| 90 while (_byteIndex + 2 < _bytes.length && | 89 while (_byteIndex + 2 < _bytes.length && |
| 91 _bytes[_byteIndex] == 0xef && | 90 _bytes[_byteIndex] == 0xef && |
| 92 _bytes[_byteIndex + 1] == 0xbb && | 91 _bytes[_byteIndex + 1] == 0xbb && |
| 93 _bytes[_byteIndex + 2] == 0xbf) { | 92 _bytes[_byteIndex + 2] == 0xbf) { |
| 94 ++numByteOrderMarks; | 93 ++numByteOrderMarks; |
| 95 _byteIndex += 3; | 94 _byteIndex += 3; |
| 96 numBytes -= 3; | 95 numBytes -= 3; |
| 97 } | 96 } |
| 98 String string = | 97 String string = |
| 99 const Utf8Decoder().convert(_bytes, _byteIndex, _byteIndex + numBytes); | 98 const Utf8Decoder().convert(_bytes, _byteIndex, _byteIndex + numBytes); |
| 100 _byteIndex += numBytes; | 99 _byteIndex += numBytes; |
| 101 if (numByteOrderMarks > 0) { | 100 if (numByteOrderMarks > 0) { |
| 102 return '\ufeff' * numByteOrderMarks + string; | 101 return '\ufeff' * numByteOrderMarks + string; |
| 103 } | 102 } |
| 104 return string; | 103 return string; |
| 105 } | 104 } |
| 106 | 105 |
| 107 void readStringTable() { | 106 void readStringTable(List<String> table) { |
| 107 // Read the table of end offsets. | |
| 108 int length = readUInt(); | 108 int length = readUInt(); |
| 109 _stringTable = new List<String>(length); | 109 List<int> endOffsets = new List<int>(length); |
| 110 for (int i = 0; i < length; ++i) { | 110 for (int i = 0; i < length; ++i) { |
| 111 _stringTable[i] = readStringEntry(); | 111 endOffsets[i] = readUInt(); |
| 112 } | |
| 113 // Read the UTF-8 encoded strings. | |
| 114 table.length = length; | |
| 115 int startOffset = 0; | |
| 116 for (int i = 0; i < length; ++i) { | |
| 117 table[i] = readStringEntry(endOffsets[i] - startOffset); | |
| 118 startOffset = endOffsets[i]; | |
| 112 } | 119 } |
| 113 } | 120 } |
| 114 | 121 |
| 115 String readUriReference() { | 122 String readUriReference() { |
| 116 return _sourceUriTable[readUInt()]; | 123 return _sourceUriTable[readUInt()]; |
| 117 } | 124 } |
| 118 | 125 |
| 119 void readSourceUriTable() { | 126 void readSourceUriTable() { |
|
jensj
2017/04/04 09:42:16
This method isn't called anymore is it? It doesn't
Kevin Millikin (Google)
2017/04/04 11:02:58
You are right. I've removed it.
| |
| 120 int length = readUInt(); | 127 int length = readUInt(); |
| 121 _sourceUriTable = new List<String>(length); | 128 _sourceUriTable = new List<String>(length); |
| 122 for (int i = 0; i < length; ++i) { | 129 for (int i = 0; i < length; ++i) { |
| 123 _sourceUriTable[i] = readStringEntry(); | 130 int numBytes = readUInt(); |
| 131 _sourceUriTable[i] = readStringEntry(numBytes); | |
| 124 } | 132 } |
| 125 } | 133 } |
| 126 | 134 |
| 127 String readStringReference() { | 135 String readStringReference() { |
| 128 return _stringTable[readUInt()]; | 136 return _stringTable[readUInt()]; |
| 129 } | 137 } |
| 130 | 138 |
| 131 String readStringOrNullIfEmpty() { | 139 String readStringOrNullIfEmpty() { |
| 132 var string = readStringReference(); | 140 var string = readStringReference(); |
| 133 return string.isEmpty ? null : string; | 141 return string.isEmpty ? null : string; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 throw 'Unrecognized bytes following program data'; | 251 throw 'Unrecognized bytes following program data'; |
| 244 } | 252 } |
| 245 } | 253 } |
| 246 | 254 |
| 247 void _readOneProgram(Program program) { | 255 void _readOneProgram(Program program) { |
| 248 int magic = readMagicWord(); | 256 int magic = readMagicWord(); |
| 249 if (magic != Tag.ProgramFile) { | 257 if (magic != Tag.ProgramFile) { |
| 250 throw fail('This is not a binary dart file. ' | 258 throw fail('This is not a binary dart file. ' |
| 251 'Magic number was: ${magic.toRadixString(16)}'); | 259 'Magic number was: ${magic.toRadixString(16)}'); |
| 252 } | 260 } |
| 253 readStringTable(); | 261 readStringTable(_stringTable); |
| 254 Map<String, Source> uriToSource = readUriToSource(); | 262 Map<String, Source> uriToSource = readUriToSource(); |
| 255 program.uriToSource.addAll(uriToSource); | 263 program.uriToSource.addAll(uriToSource); |
| 256 readLinkTable(program.root); | 264 readLinkTable(program.root); |
| 257 int numberOfLibraries = readUInt(); | 265 int numberOfLibraries = readUInt(); |
| 258 List<Library> libraries = new List<Library>(numberOfLibraries); | 266 List<Library> libraries = new List<Library>(numberOfLibraries); |
| 259 for (int i = 0; i < numberOfLibraries; ++i) { | 267 for (int i = 0; i < numberOfLibraries; ++i) { |
| 260 libraries[i] = readLibrary(program); | 268 libraries[i] = readLibrary(program); |
| 261 } | 269 } |
| 262 var mainMethod = readMemberReference(allowNull: true); | 270 var mainMethod = readMemberReference(allowNull: true); |
| 263 program.mainMethodName ??= mainMethod; | 271 program.mainMethodName ??= mainMethod; |
| 264 } | 272 } |
| 265 | 273 |
| 266 Map<String, Source> readUriToSource() { | 274 Map<String, Source> readUriToSource() { |
| 267 readSourceUriTable(); | 275 readStringTable(_sourceUriTable); |
| 268 int length = _sourceUriTable.length; | 276 int length = _sourceUriTable.length; |
| 269 Map<String, Source> uriToSource = <String, Source>{}; | 277 Map<String, Source> uriToSource = <String, Source>{}; |
| 270 for (int i = 0; i < length; ++i) { | 278 for (int i = 0; i < length; ++i) { |
| 271 String uri = _sourceUriTable[i]; | 279 String uri = _sourceUriTable[i]; |
| 272 List<int> sourceCode = readUtf8Bytes(); | 280 List<int> sourceCode = readUtf8Bytes(); |
| 273 int lineCount = readUInt(); | 281 int lineCount = readUInt(); |
| 274 List<int> lineStarts = new List<int>(lineCount); | 282 List<int> lineStarts = new List<int>(lineCount); |
| 275 int previousLineStart = 0; | 283 int previousLineStart = 0; |
| 276 for (int j = 0; j < lineCount; ++j) { | 284 for (int j = 0; j < lineCount; ++j) { |
| 277 int lineStart = readUInt() + previousLineStart; | 285 int lineStart = readUInt() + previousLineStart; |
| (...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1125 ..fileOffset = offset | 1133 ..fileOffset = offset |
| 1126 ..fileEqualsOffset = fileEqualsOffset; | 1134 ..fileEqualsOffset = fileEqualsOffset; |
| 1127 } | 1135 } |
| 1128 | 1136 |
| 1129 int readOffset() { | 1137 int readOffset() { |
| 1130 // Offset is saved as unsigned, | 1138 // Offset is saved as unsigned, |
| 1131 // but actually ranges from -1 and up (thus the -1) | 1139 // but actually ranges from -1 and up (thus the -1) |
| 1132 return readUInt() - 1; | 1140 return readUInt() - 1; |
| 1133 } | 1141 } |
| 1134 } | 1142 } |
| OLD | NEW |