blob: 07adcb4bb873562f3317bacb0837d25d3484c758 [file] [log] [blame]
// 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;
}