Chromium Code Reviews| Index: runtime/vm/kernel_reader.cc |
| diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc |
| index 231300e595be74842e241850bdf2144a308c403b..d896becf14c95de000e172b4ca637fbdf0ede750 100644 |
| --- a/runtime/vm/kernel_reader.cc |
| +++ b/runtime/vm/kernel_reader.cc |
| @@ -135,12 +135,39 @@ Object& KernelReader::ReadProgram() { |
| if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { |
| CanonicalName* main = program_->main_method(); |
| - dart::Library& library = LookupLibrary(main->EnclosingName()); |
| + if (main == NULL) { |
| + return dart::Library::Handle(Z); |
| + } |
| + CanonicalName* main_library = main->EnclosingName(); |
| + dart::Library& library = LookupLibrary(main_library); |
| // Sanity check that we can find the main entrypoint. |
| Object& main_obj = Object::Handle( |
| Z, library.LookupObjectAllowPrivate(H.DartSymbol("main"))); |
| ASSERT(!main_obj.IsNull()); |
| + |
| + // There is a function _getMainClosure in dart:_builtin that returns the |
|
Kevin Millikin (Google)
2017/03/31 10:05:42
I'm aware that this is ugly. It would be better t
Vyacheslav Egorov (Google)
2017/04/05 12:21:23
We would also need to come up with solution for th
Kevin Millikin (Google)
2017/04/25 18:20:29
I know, and those changes started landing before t
|
| + // main procedure. Since the platform libraries are compiled before the |
| + // program script, this function is patched here. |
| + dart::Library& builtin_library = |
| + dart::Library::Handle(Z, I->object_store()->builtin_library()); |
| + Function& to_patch = |
| + Function::Handle(builtin_library.LookupFunctionAllowPrivate( |
|
kustermann
2017/04/05 11:47:07
Handle(Z,
Kevin Millikin (Google)
2017/04/25 18:20:29
Done.
|
| + dart::String::Handle(dart::String::New("_getMainClosure")))); |
| + |
| + // Build a canonical name tree instead of sharing main's canonical name. |
| + CanonicalName* name = CanonicalName::NewRoot(); |
|
kustermann
2017/04/05 11:47:07
This will leak [name], right?
Please add a commen
|
| + name = name->AddChild(new String(main_library->name()->buffer(), |
| + main_library->name()->size())); |
|
kustermann
2017/04/05 11:47:07
This "new String()" will never be freed afaik! (al
Kevin Millikin (Google)
2017/04/25 18:20:29
Comment added that we are leaking the whole body.
|
| + CanonicalName* kind = main->parent(); |
| + name = name->AddChild( |
| + new String(kind->name()->buffer(), kind->name()->size())); |
| + name = name->AddChild(new String("main")); |
| + |
| + Procedure* procedure = |
| + reinterpret_cast<Procedure*>(to_patch.kernel_function()); |
| + procedure->function()->set_body(new ReturnStatement(new StaticGet(name))); |
|
kustermann
2017/04/05 11:47:07
I assume the function has already a body (like nsm
Kevin Millikin (Google)
2017/04/25 18:20:29
It doesn't have a body, it's treated as if it were
|
| + |
| return library; |
| } |
| } |
| @@ -211,7 +238,7 @@ void KernelReader::ReadLibrary(Library* kernel_library) { |
| toplevel_class.SetFunctions(Array::Handle(MakeFunctionsArray())); |
| const GrowableObjectArray& classes = |
| - GrowableObjectArray::Handle(I->object_store()->pending_classes()); |
| + GrowableObjectArray::Handle(Z, I->object_store()->pending_classes()); |
| // Load all classes. |
| for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { |