Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015, the Fletch project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Fletch 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
| 4 | 4 |
| 5 library fletchc.compiler; | 5 library fletchc.compiler; |
| 6 | 6 |
| 7 import 'dart:async' show | 7 import 'dart:async' show |
| 8 Future; | 8 Future; |
| 9 | 9 |
| 10 import 'dart:convert' show | 10 import 'dart:convert' show |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 SourceFileProvider; | 29 SourceFileProvider; |
| 30 | 30 |
| 31 import 'package:compiler/src/elements/elements.dart' show | 31 import 'package:compiler/src/elements/elements.dart' show |
| 32 ConstructorElement, | 32 ConstructorElement, |
| 33 ClassElement, | 33 ClassElement, |
| 34 FunctionElement; | 34 FunctionElement; |
| 35 | 35 |
| 36 import 'package:compiler/src/filenames.dart' show | 36 import 'package:compiler/src/filenames.dart' show |
| 37 appendSlash; | 37 appendSlash; |
| 38 | 38 |
| 39 import 'src/compiled_function.dart' show | 39 import 'src/fletch_function_builder.dart' show |
| 40 CompiledFunction; | 40 FletchFunctionBuilder; |
| 41 | 41 |
| 42 import 'src/debug_info.dart'; | 42 import 'src/debug_info.dart'; |
| 43 | 43 |
| 44 import 'src/fletch_native_descriptor.dart' show | 44 import 'src/fletch_native_descriptor.dart' show |
| 45 FletchNativeDescriptor; | 45 FletchNativeDescriptor; |
| 46 | 46 |
| 47 import 'src/fletch_backend.dart' show | 47 import 'src/fletch_backend.dart' show |
| 48 FletchBackend; | 48 FletchBackend; |
| 49 | 49 |
| 50 import 'src/compiled_class.dart' show | 50 import 'src/fletch_class_builder.dart' show |
| 51 CompiledClass; | 51 FletchClassBuilder; |
| 52 | 52 |
| 53 import 'package:compiler/src/apiimpl.dart' as apiimpl; | 53 import 'package:compiler/src/apiimpl.dart' as apiimpl; |
| 54 | 54 |
| 55 import 'src/fletch_compiler.dart' as implementation; | 55 import 'src/fletch_compiler.dart' as implementation; |
| 56 | 56 |
| 57 import 'bytecodes.dart' show | 57 import 'bytecodes.dart' show |
| 58 Bytecode; | 58 Bytecode; |
| 59 | 59 |
| 60 import 'src/fletch_selector.dart'; | 60 import 'src/fletch_selector.dart'; |
| 61 | 61 |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 Map<String, FletchNativeDescriptor> natives = | 235 Map<String, FletchNativeDescriptor> natives = |
| 236 <String, FletchNativeDescriptor>{}; | 236 <String, FletchNativeDescriptor>{}; |
| 237 Map<String, String> names = <String, String>{}; | 237 Map<String, String> names = <String, String>{}; |
| 238 FletchNativeDescriptor.decode(data, natives, names); | 238 FletchNativeDescriptor.decode(data, natives, names); |
| 239 _compiler.context.nativeDescriptors = natives; | 239 _compiler.context.nativeDescriptors = natives; |
| 240 _compiler.context.setNames(names); | 240 _compiler.context.setNames(names); |
| 241 } | 241 } |
| 242 | 242 |
| 243 Uri get fletchVm => _compiler.fletchVm; | 243 Uri get fletchVm => _compiler.fletchVm; |
| 244 | 244 |
| 245 CompiledFunction lookupCompiledFunction(int methodId) { | 245 FletchFunctionBuilder lookupFletchFunctionBuilder(int methodId) { |
| 246 CompiledFunction function = _compiler.context.backend.functions[methodId]; | 246 FletchFunctionBuilder function = _compiler.context.backend.functions[methodI d]; |
|
ahe
2015/06/09 09:14:56
Long line.
Anders Johnsen
2015/06/09 10:15:40
Done.
| |
| 247 assert(function.methodId == methodId); | 247 assert(function.methodId == methodId); |
| 248 return function; | 248 return function; |
| 249 } | 249 } |
| 250 | 250 |
| 251 String lookupFunctionName(int methodId) { | 251 String lookupFunctionName(int methodId) { |
| 252 CompiledFunction function = lookupCompiledFunction(methodId); | 252 FletchFunctionBuilder function = lookupFletchFunctionBuilder(methodId); |
| 253 if (function == null) return ''; | 253 if (function == null) return ''; |
| 254 if (function.isConstructor) { | 254 if (function.isConstructor) { |
| 255 ConstructorElement constructor = function.element; | 255 ConstructorElement constructor = function.element; |
| 256 ClassElement enclosing = constructor.enclosingClass; | 256 ClassElement enclosing = constructor.enclosingClass; |
| 257 String name = (constructor.name == null || constructor.name.length == 0) | 257 String name = (constructor.name == null || constructor.name.length == 0) |
| 258 ? '' | 258 ? '' |
| 259 : '.${constructor.name}'; | 259 : '.${constructor.name}'; |
| 260 String postfix = function.isInitializerList ? ' initializer' : ''; | 260 String postfix = function.isInitializerList ? ' initializer' : ''; |
| 261 return '${enclosing.name}$name$postfix'; | 261 return '${enclosing.name}$name$postfix'; |
| 262 } | 262 } |
| 263 String functionName = function.name; | 263 String functionName = function.name; |
| 264 if (functionName == null) return ''; | 264 if (functionName == null) return ''; |
| 265 CompiledClass memberOf = function.memberOf; | 265 FletchClassBuilder memberOf = function.memberOf; |
| 266 if (memberOf == null) return functionName; | 266 if (memberOf == null) return functionName; |
| 267 if (memberOf.element == null) return functionName; | 267 if (memberOf.element == null) return functionName; |
| 268 if (functionName.isEmpty) return memberOf.element.name; | 268 if (functionName.isEmpty) return memberOf.element.name; |
| 269 return '${memberOf.element.name}.$functionName'; | 269 return '${memberOf.element.name}.$functionName'; |
| 270 } | 270 } |
| 271 | 271 |
| 272 CompiledClass lookupCompiledClass(int classId) { | 272 FletchClassBuilder lookupFletchClassBuilder(int classId) { |
| 273 CompiledClass klass = _compiler.context.backend.classes[classId]; | 273 FletchClassBuilder klass = _compiler.context.backend.classes[classId]; |
| 274 assert(klass.id == classId); | 274 assert(klass.id == classId); |
| 275 return klass; | 275 return klass; |
| 276 } | 276 } |
| 277 | 277 |
| 278 String lookupClassName(int classId) { | 278 String lookupClassName(int classId) { |
| 279 CompiledClass klass = lookupCompiledClass(classId); | 279 FletchClassBuilder klass = lookupFletchClassBuilder(classId); |
| 280 if (klass.element != null) return klass.element.name; | 280 if (klass.element != null) return klass.element.name; |
| 281 // TODO(ager): Provide better information for closures. | 281 // TODO(ager): Provide better information for closures. |
| 282 if (_compiler.context.backend.closureClasses.values.contains(klass)) { | 282 if (_compiler.context.backend.closureClasses.values.contains(klass)) { |
| 283 return 'closure'; | 283 return 'closure'; |
| 284 } | 284 } |
| 285 CompiledFunction function = | 285 FletchFunctionBuilder function = |
| 286 _compiler.context.backend.compiledFunctionFromTearoffClass(klass); | 286 _compiler.context.backend.functionBuilderFromTearoffClass(klass); |
| 287 if (function != null) return 'tearoff of ${function.name}'; | 287 if (function != null) return 'tearoff of ${function.name}'; |
| 288 return 'unknown'; | 288 return 'unknown'; |
| 289 } | 289 } |
| 290 | 290 |
| 291 String lookupFunctionNameBySelector(int selector) { | 291 String lookupFunctionNameBySelector(int selector) { |
| 292 int id = FletchSelector.decodeId(selector); | 292 int id = FletchSelector.decodeId(selector); |
| 293 return _compiler.context.symbols[id]; | 293 return _compiler.context.symbols[id]; |
| 294 } | 294 } |
| 295 | 295 |
| 296 List<Bytecode> lookupFunctionBytecodes(int methodId) { | 296 List<Bytecode> lookupFunctionBytecodes(int methodId) { |
| 297 return lookupCompiledFunction(methodId).builder.bytecodes; | 297 return lookupFletchFunctionBuilder(methodId).builder.bytecodes; |
| 298 } | 298 } |
| 299 | 299 |
| 300 Iterable<int> lookupFunctionIdsByName(String name) { | 300 Iterable<int> lookupFunctionIdsByName(String name) { |
| 301 return _compiler.context.backend.functions | 301 return _compiler.context.backend.functions |
| 302 .where((f) => f.name == name) | 302 .where((f) => f.name == name) |
| 303 .map((f) => f.methodId); | 303 .map((f) => f.methodId); |
| 304 } | 304 } |
| 305 | 305 |
| 306 int mainMethodId() { | 306 int mainMethodId() { |
| 307 FunctionElement mainFunctionElement = _compiler.mainFunction; | 307 FunctionElement mainFunctionElement = _compiler.mainFunction; |
| 308 CompiledFunction mainMethod = | 308 FletchFunctionBuilder mainMethod = |
| 309 _compiler.context.backend.compiledFunctions[mainFunctionElement]; | 309 _compiler.context.backend.functionBuilders[mainFunctionElement]; |
| 310 return mainMethod.methodId; | 310 return mainMethod.methodId; |
| 311 } | 311 } |
| 312 | 312 |
| 313 String astString(int methodId, int bytecodeIndex) { | 313 String astString(int methodId, int bytecodeIndex) { |
| 314 CompiledFunction function = lookupCompiledFunction(methodId); | 314 FletchFunctionBuilder function = lookupFletchFunctionBuilder(methodId); |
| 315 _compiler.context.backend.ensureDebugInfo(function); | 315 _compiler.context.backend.ensureDebugInfo(function); |
| 316 return function.debugInfo.astStringFor(bytecodeIndex); | 316 return function.debugInfo.astStringFor(bytecodeIndex); |
| 317 } | 317 } |
| 318 | 318 |
| 319 String fileAndLineString(int methodId, int bytecodeIndex) { | 319 String fileAndLineString(int methodId, int bytecodeIndex) { |
| 320 CompiledFunction function = lookupCompiledFunction(methodId); | 320 FletchFunctionBuilder function = lookupFletchFunctionBuilder(methodId); |
| 321 _compiler.context.backend.ensureDebugInfo(function); | 321 _compiler.context.backend.ensureDebugInfo(function); |
| 322 return function.debugInfo.fileAndLineStringFor(bytecodeIndex); | 322 return function.debugInfo.fileAndLineStringFor(bytecodeIndex); |
| 323 } | 323 } |
| 324 | 324 |
| 325 String sourceListString(int methodId, | 325 String sourceListString(int methodId, |
| 326 int bytecodeIndex, | 326 int bytecodeIndex, |
| 327 {int contextLines : 5}) { | 327 {int contextLines : 5}) { |
| 328 CompiledFunction function = lookupCompiledFunction(methodId); | 328 FletchFunctionBuilder function = lookupFletchFunctionBuilder(methodId); |
| 329 _compiler.context.backend.ensureDebugInfo(function); | 329 _compiler.context.backend.ensureDebugInfo(function); |
| 330 return function.debugInfo.sourceListStringFor(bytecodeIndex, contextLines); | 330 return function.debugInfo.sourceListStringFor(bytecodeIndex, contextLines); |
| 331 } | 331 } |
| 332 | 332 |
| 333 SourceLocation sourceLocation(int methodId, int bytecodeIndex) { | 333 SourceLocation sourceLocation(int methodId, int bytecodeIndex) { |
| 334 CompiledFunction function = lookupCompiledFunction(methodId); | 334 FletchFunctionBuilder function = lookupFletchFunctionBuilder(methodId); |
| 335 _compiler.context.backend.ensureDebugInfo(function); | 335 _compiler.context.backend.ensureDebugInfo(function); |
| 336 return function.debugInfo.sourceLocationFor(bytecodeIndex); | 336 return function.debugInfo.sourceLocationFor(bytecodeIndex); |
| 337 } | 337 } |
| 338 | 338 |
| 339 ScopeInfo scopeInfo(int methodId, int bytecodeIndex) { | 339 ScopeInfo scopeInfo(int methodId, int bytecodeIndex) { |
| 340 CompiledFunction function = lookupCompiledFunction(methodId); | 340 FletchFunctionBuilder function = lookupFletchFunctionBuilder(methodId); |
| 341 _compiler.context.backend.ensureDebugInfo(function); | 341 _compiler.context.backend.ensureDebugInfo(function); |
| 342 return function.debugInfo.scopeInfoFor(bytecodeIndex); | 342 return function.debugInfo.scopeInfoFor(bytecodeIndex); |
| 343 } | 343 } |
| 344 | 344 |
| 345 DebugInfo debugInfoForPosition(String file, int position) { | 345 DebugInfo debugInfoForPosition(String file, int position) { |
| 346 return _compiler.debugInfoForPosition(file, position); | 346 return _compiler.debugInfoForPosition(file, position); |
| 347 } | 347 } |
| 348 | 348 |
| 349 int positionInFileFromPattern(String file, int line, String pattern) { | 349 int positionInFileFromPattern(String file, int line, String pattern) { |
| 350 return _compiler.positionInFileFromPattern(file, line, pattern); | 350 return _compiler.positionInFileFromPattern(file, line, pattern); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 460 | 460 |
| 461 Uri _guessPatchRoot(Uri libraryRoot) { | 461 Uri _guessPatchRoot(Uri libraryRoot) { |
| 462 Uri guess = libraryRoot.resolve('../../fletch/'); | 462 Uri guess = libraryRoot.resolve('../../fletch/'); |
| 463 if (_looksLikePatchRoot(guess)) return guess; | 463 if (_looksLikePatchRoot(guess)) return guess; |
| 464 return null; | 464 return null; |
| 465 } | 465 } |
| 466 | 466 |
| 467 bool _looksLikePatchRoot(Uri uri) { | 467 bool _looksLikePatchRoot(Uri uri) { |
| 468 return _containsFile(uri, 'lib/core/core_patch.dart'); | 468 return _containsFile(uri, 'lib/core/core_patch.dart'); |
| 469 } | 469 } |
| OLD | NEW |