| Index: runtime/vm/object.cc
 | 
| ===================================================================
 | 
| --- runtime/vm/object.cc	(revision 12785)
 | 
| +++ runtime/vm/object.cc	(working copy)
 | 
| @@ -87,6 +87,7 @@
 | 
|  RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 | 
|  RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 | 
|  RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 | 
| +RawClass* Object::namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 | 
|  RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 | 
|  RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 | 
|  RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 | 
| @@ -354,6 +355,9 @@
 | 
|    cls = Class::New<LibraryPrefix>();
 | 
|    library_prefix_class_ = cls.raw();
 | 
|  
 | 
| +  cls = Class::New<Namespace>();
 | 
| +  namespace_class_ = cls.raw();
 | 
| +
 | 
|    cls = Class::New<Code>();
 | 
|    code_class_ = cls.raw();
 | 
|  
 | 
| @@ -6271,16 +6275,15 @@
 | 
|      return Field::null();
 | 
|    }
 | 
|  
 | 
| -  // Now check if name is found in the top level scope of any imported
 | 
| -  // libs.
 | 
| +  // Now check if name is found in any imported libs.
 | 
|    const Array& imports = Array::Handle(this->imports());
 | 
| -  Library& import_lib = Library::Handle();
 | 
| +  Namespace& import = Namespace::Handle();
 | 
| +  Object& obj = Object::Handle();
 | 
|    for (intptr_t j = 0; j < this->num_imports(); j++) {
 | 
| -    import_lib ^= imports.At(j);
 | 
| -
 | 
| -
 | 
| -    field = import_lib.LookupLocalField(name);
 | 
| -    if (!field.IsNull()) {
 | 
| +    import ^= imports.At(j);
 | 
| +    obj = import.Lookup(name);
 | 
| +    if (!obj.IsNull() && obj.IsField()) {
 | 
| +      field ^= obj.raw();
 | 
|        return field.raw();
 | 
|      }
 | 
|    }
 | 
| @@ -6321,16 +6324,15 @@
 | 
|      return Function::null();
 | 
|    }
 | 
|  
 | 
| -  // Now check if name is found in the top level scope of any imported
 | 
| -  // libs.
 | 
| +  // Now check if name is found in any imported libs.
 | 
|    const Array& imports = Array::Handle(this->imports());
 | 
| -  Library& import_lib = Library::Handle();
 | 
| +  Namespace& import = Namespace::Handle();
 | 
| +  Object& obj = Object::Handle();
 | 
|    for (intptr_t j = 0; j < this->num_imports(); j++) {
 | 
| -    import_lib ^= imports.At(j);
 | 
| -
 | 
| -
 | 
| -    function = import_lib.LookupLocalFunction(name);
 | 
| -    if (!function.IsNull()) {
 | 
| +    import ^= imports.At(j);
 | 
| +    obj = import.Lookup(name);
 | 
| +    if (!obj.IsNull() && obj.IsFunction()) {
 | 
| +      function ^= obj.raw();
 | 
|        return function.raw();
 | 
|      }
 | 
|    }
 | 
| @@ -6361,12 +6363,12 @@
 | 
|    if (!obj.IsNull()) {
 | 
|      return obj.raw();
 | 
|    }
 | 
| -  // Now check if name is found in the top level scope of any imported libs.
 | 
| +  // Now check if name is found in any imported libs.
 | 
|    const Array& imports = Array::Handle(this->imports());
 | 
| -  Library& import_lib = Library::Handle();
 | 
| +  Namespace& import = Namespace::Handle();
 | 
|    for (intptr_t j = 0; j < this->num_imports(); j++) {
 | 
| -    import_lib ^= imports.At(j);
 | 
| -    obj = import_lib.LookupLocalObject(name);
 | 
| +    import ^= imports.At(j);
 | 
| +    obj = import.Lookup(name);
 | 
|      if (!obj.IsNull()) {
 | 
|        return obj.raw();
 | 
|      }
 | 
| @@ -6443,10 +6445,12 @@
 | 
|    Isolate* isolate = Isolate::Current();
 | 
|    const Array& imports = Array::Handle(isolate, this->imports());
 | 
|    intptr_t num_imports = this->num_imports();
 | 
| +  Namespace& import = Namespace::Handle(isolate, Namespace::null());
 | 
|    Library& lib = Library::Handle(isolate, Library::null());
 | 
|    String& import_url = String::Handle(isolate, String::null());
 | 
|    for (int i = 0; i < num_imports; i++) {
 | 
| -    lib ^= imports.At(i);
 | 
| +    import ^= imports.At(i);
 | 
| +    lib = import.library();
 | 
|      import_url = lib.url();
 | 
|      if (url.Equals(import_url)) {
 | 
|        return lib.raw();
 | 
| @@ -6456,34 +6460,23 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -RawLibrary* Library::ImportAt(intptr_t index) const {
 | 
| -  if ((index < 0) || index >= num_imports()) {
 | 
| +RawLibrary* Library::ImportLibraryAt(intptr_t index) const {
 | 
| +  Namespace& import = Namespace::Handle(ImportAt(index));
 | 
| +  if (import.IsNull()) {
 | 
|      return Library::null();
 | 
|    }
 | 
| -  const Array& import_list = Array::Handle(imports());
 | 
| -  Library& lib = Library::Handle();
 | 
| -  lib ^= import_list.At(index);
 | 
| -  return lib.raw();
 | 
| +  return import.library();
 | 
|  }
 | 
|  
 | 
|  
 | 
| -RawLibraryPrefix* Library::ImportPrefixAt(intptr_t index) const {
 | 
| -  const Library& imported = Library::Handle(ImportAt(index));
 | 
| -  if (imported.IsNull()) {
 | 
| -    return LibraryPrefix::null();
 | 
| +RawNamespace* Library::ImportAt(intptr_t index) const {
 | 
| +  if ((index < 0) || index >= num_imports()) {
 | 
| +    return Namespace::null();
 | 
|    }
 | 
| -  DictionaryIterator it(*this);
 | 
| -  Object& obj = Object::Handle();
 | 
| -  while (it.HasNext()) {
 | 
| -    obj = it.GetNext();
 | 
| -    if (obj.IsLibraryPrefix()) {
 | 
| -      const LibraryPrefix& lib_prefix = LibraryPrefix::Cast(obj);
 | 
| -      if (lib_prefix.ContainsLibrary(imported)) {
 | 
| -        return lib_prefix.raw();
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -  return LibraryPrefix::null();
 | 
| +  const Array& import_list = Array::Handle(imports());
 | 
| +  Namespace& import = Namespace::Handle();
 | 
| +  import ^= import_list.At(index);
 | 
| +  return import.raw();
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -6492,7 +6485,7 @@
 | 
|    Library& imported = Library::Handle(isolate);
 | 
|    intptr_t count = num_imports();
 | 
|    for (int i = 0; i < count; i++) {
 | 
| -    imported = ImportAt(i);
 | 
| +    imported = ImportLibraryAt(i);
 | 
|      if (imported.IsCoreLibrary()) {
 | 
|        return true;
 | 
|      }
 | 
| @@ -6501,7 +6494,7 @@
 | 
|    LibraryPrefixIterator it(*this);
 | 
|    while (it.HasNext()) {
 | 
|      prefix = it.GetNext();
 | 
| -    count = prefix.num_libs();
 | 
| +    count = prefix.num_imports();
 | 
|      for (int i = 0; i < count; i++) {
 | 
|        imported = prefix.GetLibrary(i);
 | 
|        if (imported.IsCoreLibrary()) {
 | 
| @@ -6513,7 +6506,7 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void Library::AddImport(const Library& library) const {
 | 
| +void Library::AddImport(const Namespace& ns) const {
 | 
|    Array& imports = Array::Handle(this->imports());
 | 
|    intptr_t capacity = imports.Length();
 | 
|    if (num_imports() == capacity) {
 | 
| @@ -6522,7 +6515,7 @@
 | 
|      StorePointer(&raw_ptr()->imports_, imports.raw());
 | 
|    }
 | 
|    intptr_t index = num_imports();
 | 
| -  imports.SetAt(index, library);
 | 
| +  imports.SetAt(index, ns);
 | 
|    set_num_imports(index + 1);
 | 
|  }
 | 
|  
 | 
| @@ -6575,9 +6568,11 @@
 | 
|    result.InitClassDictionary();
 | 
|    result.InitImportList();
 | 
|    if (import_core_lib) {
 | 
| -    Library& core_lib = Library::Handle(Library::CoreLibrary());
 | 
| +    const Library& core_lib = Library::Handle(Library::CoreLibrary());
 | 
|      ASSERT(!core_lib.IsNull());
 | 
| -    result.AddImport(core_lib);
 | 
| +    const Namespace& ns = Namespace::Handle(
 | 
| +        Namespace::New(core_lib, Array::Handle(), Array::Handle()));
 | 
| +    result.AddImport(ns);
 | 
|    }
 | 
|    return result.raw();
 | 
|  }
 | 
| @@ -6593,6 +6588,8 @@
 | 
|    const Library& core_lib =
 | 
|        Library::Handle(Library::NewLibraryHelper(core_lib_url, false));
 | 
|    core_lib.Register();
 | 
| +  const Namespace& core_ns = Namespace::Handle(
 | 
| +      Namespace::New(core_lib, Array::Handle(), Array::Handle()));
 | 
|    isolate->object_store()->set_core_library(core_lib);
 | 
|    const String& core_impl_lib_url =
 | 
|        String::Handle(Symbols::New("dart:coreimpl"));
 | 
| @@ -6600,12 +6597,16 @@
 | 
|        Library::Handle(Library::NewLibraryHelper(core_impl_lib_url, false));
 | 
|    isolate->object_store()->set_core_impl_library(core_impl_lib);
 | 
|    core_impl_lib.Register();
 | 
| -  core_lib.AddImport(core_impl_lib);
 | 
| -  core_impl_lib.AddImport(core_lib);
 | 
| +  const Namespace& impl_ns = Namespace::Handle(
 | 
| +      Namespace::New(core_impl_lib, Array::Handle(), Array::Handle()));
 | 
| +  core_lib.AddImport(impl_ns);
 | 
| +  core_impl_lib.AddImport(core_ns);
 | 
|    Library::InitMathLibrary(isolate);
 | 
|    const Library& math_lib = Library::Handle(Library::MathLibrary());
 | 
| -  core_lib.AddImport(math_lib);
 | 
| -  core_impl_lib.AddImport(math_lib);
 | 
| +  const Namespace& math_ns = Namespace::Handle(
 | 
| +      Namespace::New(math_lib, Array::Handle(), Array::Handle()));
 | 
| +  core_lib.AddImport(math_ns);
 | 
| +  core_impl_lib.AddImport(math_ns);
 | 
|    isolate->object_store()->set_root_library(Library::Handle());
 | 
|  
 | 
|    // Hook up predefined classes without setting their library pointers. These
 | 
| @@ -6621,7 +6622,9 @@
 | 
|    const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
 | 
|    lib.Register();
 | 
|    const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
 | 
| -  lib.AddImport(core_impl_lib);
 | 
| +  const Namespace& impl_ns = Namespace::Handle(
 | 
| +      Namespace::New(core_impl_lib, Array::Handle(), Array::Handle()));
 | 
| +  lib.AddImport(impl_ns);
 | 
|    isolate->object_store()->set_math_library(lib);
 | 
|  }
 | 
|  
 | 
| @@ -6639,10 +6642,14 @@
 | 
|    const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
 | 
|    lib.Register();
 | 
|    const Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
 | 
| -  lib.AddImport(isolate_lib);
 | 
| +  const Namespace& isolate_ns = Namespace::Handle(
 | 
| +      Namespace::New(isolate_lib, Array::Handle(), Array::Handle()));
 | 
| +  lib.AddImport(isolate_ns);
 | 
|    const Library& wrappers_lib =
 | 
|        Library::Handle(Library::NativeWrappersLibrary());
 | 
| -  lib.AddImport(wrappers_lib);
 | 
| +  const Namespace& wrappers_ns = Namespace::Handle(
 | 
| +      Namespace::New(wrappers_lib, Array::Handle(), Array::Handle()));
 | 
| +  lib.AddImport(wrappers_ns);
 | 
|    isolate->object_store()->set_mirrors_library(lib);
 | 
|  }
 | 
|  
 | 
| @@ -6652,7 +6659,9 @@
 | 
|    const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
 | 
|    lib.Register();
 | 
|    const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
 | 
| -  lib.AddImport(core_impl_lib);
 | 
| +  const Namespace& impl_ns = Namespace::Handle(
 | 
| +      Namespace::New(core_impl_lib, Array::Handle(), Array::Handle()));
 | 
| +  lib.AddImport(impl_ns);
 | 
|    isolate->object_store()->set_scalarlist_library(lib);
 | 
|  }
 | 
|  
 | 
| @@ -6806,22 +6815,22 @@
 | 
|  
 | 
|  
 | 
|  RawLibrary* LibraryPrefix::GetLibrary(int index) const {
 | 
| -  Library& lib = Library::Handle();
 | 
| -  if ((index >= 0) || (index < num_libs())) {
 | 
| -    Array& libs = Array::Handle(libraries());
 | 
| -    lib ^= libs.At(index);
 | 
| +  if ((index >= 0) || (index < num_imports())) {
 | 
| +    const Array& imports = Array::Handle(this->imports());
 | 
| +    const Namespace& import = Namespace::CheckedHandle(imports.At(index));
 | 
| +    return import.library();
 | 
|    }
 | 
| -  return lib.raw();
 | 
| +  return Library::null();
 | 
|  }
 | 
|  
 | 
|  
 | 
|  bool LibraryPrefix::ContainsLibrary(const Library& library) const {
 | 
| -  intptr_t num_current_libs = num_libs();
 | 
| -  if (num_current_libs > 0) {
 | 
| +  intptr_t num_current_imports = num_imports();
 | 
| +  if (num_current_imports > 0) {
 | 
|      Library& lib = Library::Handle();
 | 
|      const String& url = String::Handle(library.url());
 | 
|      String& lib_url = String::Handle();
 | 
| -    for (intptr_t i = 0; i < num_current_libs; i++) {
 | 
| +    for (intptr_t i = 0; i < num_current_imports; i++) {
 | 
|        lib = GetLibrary(i);
 | 
|        ASSERT(!lib.IsNull());
 | 
|        lib_url = lib.url();
 | 
| @@ -6833,38 +6842,34 @@
 | 
|    return false;
 | 
|  }
 | 
|  
 | 
| -void LibraryPrefix::AddLibrary(const Library& library) const {
 | 
| -  intptr_t num_current_libs = num_libs();
 | 
|  
 | 
| -  // First check if the library is already in the list of libraries imported.
 | 
| -  if (ContainsLibrary(library)) {
 | 
| -    return;  // Library already imported with same prefix.
 | 
| -  }
 | 
| +void LibraryPrefix::AddImport(const Namespace& import) const {
 | 
| +  intptr_t num_current_imports = num_imports();
 | 
|  
 | 
|    // The library needs to be added to the list.
 | 
| -  Array& libs = Array::Handle(libraries());
 | 
| -  const intptr_t length = (libs.IsNull()) ? 0 : libs.Length();
 | 
| +  Array& imports = Array::Handle(this->imports());
 | 
| +  const intptr_t length = (imports.IsNull()) ? 0 : imports.Length();
 | 
|    // Grow the list if it is full.
 | 
| -  if (num_current_libs >= length) {
 | 
| +  if (num_current_imports >= length) {
 | 
|      const intptr_t new_length = length + kIncrementSize;
 | 
| -    libs = Array::Grow(libs, new_length, Heap::kOld);
 | 
| -    set_libraries(libs);
 | 
| +    imports = Array::Grow(imports, new_length, Heap::kOld);
 | 
| +    set_imports(imports);
 | 
|    }
 | 
| -  libs.SetAt(num_current_libs, library);
 | 
| -  set_num_libs(num_current_libs + 1);
 | 
| +  imports.SetAt(num_current_imports, import);
 | 
| +  set_num_imports(num_current_imports + 1);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  RawClass* LibraryPrefix::LookupLocalClass(const String& class_name) const {
 | 
| -  Array& libs = Array::Handle(libraries());
 | 
| -  Class& resolved_class = Class::Handle();
 | 
| -  Library& lib = Library::Handle();
 | 
| -  for (intptr_t i = 0; i < num_libs(); i++) {
 | 
| -    lib ^= libs.At(i);
 | 
| -    ASSERT(!lib.IsNull());
 | 
| -    resolved_class = lib.LookupLocalClass(class_name);
 | 
| -    if (!resolved_class.IsNull()) {
 | 
| -      return resolved_class.raw();
 | 
| +  Array& imports = Array::Handle(this->imports());
 | 
| +  Object& obj = Object::Handle();
 | 
| +  Namespace& import = Namespace::Handle();
 | 
| +  for (intptr_t i = 0; i < num_imports(); i++) {
 | 
| +    import ^= imports.At(i);
 | 
| +    obj = import.Lookup(class_name);
 | 
| +    if (!obj.IsNull() && obj.IsClass()) {
 | 
| +      // TODO(hausner):
 | 
| +      return Class::Cast(obj).raw();
 | 
|      }
 | 
|    }
 | 
|    return Class::null();
 | 
| @@ -6880,15 +6885,33 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -RawLibraryPrefix* LibraryPrefix::New(const String& name, const Library& lib) {
 | 
| +RawLibraryPrefix* LibraryPrefix::New(const String& name,
 | 
| +                                     const Namespace& import) {
 | 
|    const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New());
 | 
|    result.set_name(name);
 | 
| -  result.set_num_libs(0);
 | 
| -  result.AddLibrary(lib);
 | 
| +  result.set_num_imports(0);
 | 
| +  result.set_imports(Array::Handle(Array::New(kInitialSize)));
 | 
| +  result.AddImport(import);
 | 
|    return result.raw();
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void LibraryPrefix::set_name(const String& value) const {
 | 
| +  ASSERT(value.IsSymbol());
 | 
| +  StorePointer(&raw_ptr()->name_, value.raw());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void LibraryPrefix::set_imports(const Array& value) const {
 | 
| +  StorePointer(&raw_ptr()->imports_, value.raw());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void LibraryPrefix::set_num_imports(intptr_t value) const {
 | 
| +  raw_ptr()->num_imports_ = value;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  const char* LibraryPrefix::ToCString() const {
 | 
|    const char* kFormat = "LibraryPrefix:'%s'";
 | 
|    const String& prefix = String::Handle(name());
 | 
| @@ -6899,22 +6922,83 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void LibraryPrefix::set_name(const String& value) const {
 | 
| -  ASSERT(value.IsSymbol());
 | 
| -  StorePointer(&raw_ptr()->name_, value.raw());
 | 
| +const char* Namespace::ToCString() const {
 | 
| +  const char* kFormat = "Namespace for library '%s'";
 | 
| +  const Library& lib = Library::Handle(library());
 | 
| +  intptr_t len = OS::SNPrint(NULL, 0, kFormat, lib.ToCString()) + 1;
 | 
| +  char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
 | 
| +  OS::SNPrint(chars, len, kFormat, lib.ToCString());
 | 
| +  return chars;
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void LibraryPrefix::set_libraries(const Array& value) const {
 | 
| -  StorePointer(&raw_ptr()->libraries_, value.raw());
 | 
| +bool Namespace::HidesName(const String& name) const {
 | 
| +  // Check whether the name is in the list of explicitly hidden names.
 | 
| +  if (hide_names() != Array::null()) {
 | 
| +    const Array& names = Array::Handle(hide_names());
 | 
| +    String& hidden = String::Handle();
 | 
| +    intptr_t num_names = names.Length();
 | 
| +    for (intptr_t i = 0; i < num_names; i++) {
 | 
| +      hidden ^= names.At(i);
 | 
| +      if (name.Equals(hidden)) {
 | 
| +        return true;
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
| +  // The name is not explicitly hidden. Now check whether it is in the
 | 
| +  // list of explicitly visible names, if there is one.
 | 
| +  if (show_names() != Array::null()) {
 | 
| +    const Array& names = Array::Handle(show_names());
 | 
| +    String& shown = String::Handle();
 | 
| +    intptr_t num_names = names.Length();
 | 
| +    for (intptr_t i = 0; i < num_names; i++) {
 | 
| +      shown ^= names.At(i);
 | 
| +      if (name.Equals(shown)) {
 | 
| +        return false;
 | 
| +      }
 | 
| +    }
 | 
| +    // There is a list of visible names. The name we're looking for is not
 | 
| +    // contained in the list, so it is hidden.
 | 
| +    return true;
 | 
| +  }
 | 
| +  // The name is not filtered out.
 | 
| +  return false;
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void LibraryPrefix::set_num_libs(intptr_t value) const {
 | 
| -  raw_ptr()->num_libs_ = value;
 | 
| +RawObject* Namespace::Lookup(const String& name) const {
 | 
| +  intptr_t i = 0;
 | 
| +  const Library& lib = Library::Handle(library());
 | 
| +  const Object& obj = Object::Handle(lib.LookupEntry(name, &i));
 | 
| +  if (obj.IsNull() || HidesName(name)) {
 | 
| +    return Object::null();
 | 
| +  }
 | 
| +  return obj.raw();
 | 
|  }
 | 
|  
 | 
|  
 | 
| +RawNamespace* Namespace::New() {
 | 
| +  ASSERT(Object::namespace_class() != Class::null());
 | 
| +  RawObject* raw = Object::Allocate(Namespace::kClassId,
 | 
| +                                    Namespace::InstanceSize(),
 | 
| +                                    Heap::kOld);
 | 
| +  return reinterpret_cast<RawNamespace*>(raw);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +RawNamespace* Namespace::New(const Library& library,
 | 
| +                             const Array& show_names,
 | 
| +                             const Array& hide_names) {
 | 
| +  ASSERT(show_names.IsNull() || (show_names.Length() > 0));
 | 
| +  ASSERT(hide_names.IsNull() || (hide_names.Length() > 0));
 | 
| +  const Namespace& result = Namespace::Handle(Namespace::New());
 | 
| +  result.StorePointer(&result.raw_ptr()->library_, library.raw());
 | 
| +  result.StorePointer(&result.raw_ptr()->show_names_, show_names.raw());
 | 
| +  result.StorePointer(&result.raw_ptr()->hide_names_, hide_names.raw());
 | 
| +  return result.raw();
 | 
| +}
 | 
| +
 | 
| +
 | 
|  RawError* Library::CompileAll() {
 | 
|    Error& error = Error::Handle();
 | 
|    const GrowableObjectArray& libs = GrowableObjectArray::Handle(
 | 
| 
 |