| // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| library kernel.transformations.setup_builtin_library; |
| |
| import '../ast.dart'; |
| |
| // The DartVM has a special `dart:_builtin` library which exposes a |
| // `_getMainClosure()` method. We need to change this method to return a |
| // closure of `main()`. |
| Component transformComponent(Component component, |
| {String libraryUri: 'dart:_builtin'}) { |
| Procedure mainMethod = component.mainMethod; |
| |
| Library builtinLibrary; |
| for (Library library in component.libraries) { |
| if (library.importUri.toString() == libraryUri) { |
| builtinLibrary = library; |
| break; |
| } |
| } |
| |
| if (builtinLibrary == null) { |
| throw new Exception('Could not find "dart:_builtin" library'); |
| } |
| |
| FunctionNode getMainClosure; |
| for (Procedure procedure in builtinLibrary.procedures) { |
| if (procedure.name.name == '_getMainClosure') { |
| getMainClosure = procedure.function; |
| break; |
| } |
| } |
| |
| if (getMainClosure == null) { |
| throw new Exception('Could not find "_getMainClosure" in "$libraryUri"'); |
| } |
| |
| if (mainMethod != null) { |
| var returnMainStatement = new ReturnStatement(new StaticGet(mainMethod)); |
| getMainClosure.body = returnMainStatement; |
| returnMainStatement.parent = getMainClosure; |
| } else { |
| // TODO(ahe): This should throw no such method error. |
| getMainClosure.body = null; |
| } |
| |
| return component; |
| } |