// 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; }