Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index 4949390b70f3f35385b9d5bf04c426d35df03c11..5fdefa3f6001116a004f08a940f92a25ad216b91 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -5189,10 +5189,21 @@ void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { |
RawPatchClass* PatchClass::New(const Class& patched_class, |
- const Class& source_class) { |
+ const Class& origin_class) { |
const PatchClass& result = PatchClass::Handle(PatchClass::New()); |
result.set_patched_class(patched_class); |
- result.set_source_class(source_class); |
+ result.set_origin_class(origin_class); |
+ result.set_script(Script::Handle(origin_class.script())); |
+ return result.raw(); |
+} |
+ |
+ |
+RawPatchClass* PatchClass::New(const Class& patched_class, |
+ const Script& script) { |
+ const PatchClass& result = PatchClass::Handle(PatchClass::New()); |
+ result.set_patched_class(patched_class); |
+ result.set_origin_class(patched_class); |
+ result.set_script(script); |
return result.raw(); |
} |
@@ -5206,19 +5217,18 @@ RawPatchClass* PatchClass::New() { |
} |
-RawScript* PatchClass::Script() const { |
- const Class& source_class = Class::Handle(this->source_class()); |
- return source_class.script(); |
+void PatchClass::set_patched_class(const Class& value) const { |
+ StorePointer(&raw_ptr()->patched_class_, value.raw()); |
} |
-void PatchClass::set_patched_class(const Class& value) const { |
- StorePointer(&raw_ptr()->patched_class_, value.raw()); |
+void PatchClass::set_origin_class(const Class& value) const { |
+ StorePointer(&raw_ptr()->origin_class_, value.raw()); |
} |
-void PatchClass::set_source_class(const Class& value) const { |
- StorePointer(&raw_ptr()->source_class_, value.raw()); |
+void PatchClass::set_script(const Script& value) const { |
+ StorePointer(&raw_ptr()->script_, value.raw()); |
} |
@@ -6817,7 +6827,7 @@ RawClass* Function::origin() const { |
return Class::Cast(obj).raw(); |
} |
ASSERT(obj.IsPatchClass()); |
- return PatchClass::Cast(obj).source_class(); |
+ return PatchClass::Cast(obj).origin_class(); |
} |
@@ -6838,7 +6848,7 @@ RawScript* Function::script() const { |
return Class::Cast(obj).script(); |
} |
ASSERT(obj.IsPatchClass()); |
- return PatchClass::Cast(obj).Script(); |
+ return PatchClass::Cast(obj).script(); |
} |
@@ -7390,7 +7400,17 @@ RawClass* Field::origin() const { |
return Class::Cast(obj).raw(); |
} |
ASSERT(obj.IsPatchClass()); |
- return PatchClass::Cast(obj).source_class(); |
+ return PatchClass::Cast(obj).origin_class(); |
+} |
+ |
+ |
+RawScript* Field::script() const { |
+ const Object& obj = Object::Handle(raw_ptr()->owner_); |
+ if (obj.IsClass()) { |
+ return Class::Cast(obj).script(); |
+ } |
+ ASSERT(obj.IsPatchClass()); |
+ return PatchClass::Cast(obj).script(); |
} |
@@ -7450,6 +7470,35 @@ RawField* Field::New(const String& name, |
} |
+RawField* Field::NewTopLevel(const String& name, |
+ bool is_final, |
+ bool is_const, |
+ const Object& owner, |
+ intptr_t token_pos) { |
+ ASSERT(!owner.IsNull()); |
+ const Field& result = Field::Handle(Field::New()); |
+ result.set_name(name); |
+ result.set_is_static(true); |
+ result.set_is_final(is_final); |
+ result.set_is_const(is_const); |
+ result.set_is_reflectable(true); |
+ result.set_is_double_initialized(false); |
+ result.set_owner(owner); |
+ result.set_token_pos(token_pos); |
+ result.set_has_initializer(false); |
+ result.set_is_unboxing_candidate(true); |
+ result.set_guarded_cid(FLAG_use_field_guards ? kIllegalCid : kDynamicCid); |
+ result.set_is_nullable(FLAG_use_field_guards ? false : true); |
+ result.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); |
+ // Presently, we only attempt to remember the list length for final fields. |
+ if (is_final && FLAG_use_field_guards) { |
+ result.set_guarded_list_length(Field::kUnknownFixedLength); |
+ } else { |
+ result.set_guarded_list_length(Field::kNoFixedLength); |
+ } |
+ return result.raw(); |
+} |
+ |
RawField* Field::Clone(const Class& new_owner) const { |
Field& clone = Field::Handle(); |
@@ -9119,11 +9168,10 @@ void DictionaryIterator::MoveToNextObject() { |
ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, |
IterationKind kind) |
: DictionaryIterator(library), |
- anon_array_((kind == kIteratePrivate) ? |
- Array::Handle(library.anonymous_classes()) : Object::empty_array()), |
- anon_size_((kind == kIteratePrivate) ? |
- library.num_anonymous_classes() : 0), |
- anon_ix_(0) { |
+ toplevel_class_(Class::Handle( |
+ (kind == kIteratePrivate) |
+ ? library.toplevel_class() |
+ : Class::null())) { |
MoveToNextClass(); |
} |
@@ -9137,8 +9185,9 @@ RawClass* ClassDictionaryIterator::GetNextClass() { |
MoveToNextClass(); |
return cls.raw(); |
} |
- ASSERT(anon_ix_ < anon_size_); |
- cls ^= anon_array_.At(anon_ix_++); |
+ ASSERT(!toplevel_class_.IsNull()); |
+ cls = toplevel_class_.raw(); |
+ toplevel_class_ = Class::null(); |
return cls.raw(); |
} |
@@ -9323,32 +9372,31 @@ static RawString* MakeTypeParameterMetaName(const TypeParameter& param) { |
} |
-void Library::AddMetadata(const Class& cls, |
+void Library::AddMetadata(const Object& owner, |
const String& name, |
intptr_t token_pos) const { |
const String& metaname = String::Handle(Symbols::New(name)); |
- Field& field = Field::Handle(Field::New(metaname, |
- true, // is_static |
- false, // is_final |
- false, // is_const |
- false, // is_reflectable |
- cls, |
- Object::dynamic_type(), |
- token_pos)); |
+ const Field& field = Field::Handle( |
+ Field::NewTopLevel(metaname, |
+ false, // is_final |
+ false, // is_const |
+ owner, |
+ token_pos)); |
+ field.SetFieldType(Object::dynamic_type()); |
+ field.set_is_reflectable(false); |
field.SetStaticValue(Array::empty_array(), true); |
GrowableObjectArray& metadata = |
GrowableObjectArray::Handle(this->metadata()); |
metadata.Add(field, Heap::kOld); |
- cls.AddField(field); |
} |
void Library::AddClassMetadata(const Class& cls, |
- const Class& toplevel_class, |
+ const Object& tl_owner, |
intptr_t token_pos) const { |
// We use the toplevel class as the owner of a class's metadata field because |
// a class's metadata is in scope of the library, not the class. |
- AddMetadata(toplevel_class, |
+ AddMetadata(tl_owner, |
String::Handle(MakeClassMetaName(cls)), |
token_pos); |
} |
@@ -9356,7 +9404,7 @@ void Library::AddClassMetadata(const Class& cls, |
void Library::AddFieldMetadata(const Field& field, |
intptr_t token_pos) const { |
- AddMetadata(Class::Handle(field.origin()), |
+ AddMetadata(Object::Handle(field.RawOwner()), |
String::Handle(MakeFieldMetaName(field)), |
token_pos); |
} |
@@ -9364,7 +9412,7 @@ void Library::AddFieldMetadata(const Field& field, |
void Library::AddFunctionMetadata(const Function& func, |
intptr_t token_pos) const { |
- AddMetadata(Class::Handle(func.origin()), |
+ AddMetadata(Object::Handle(func.RawOwner()), |
String::Handle(MakeFunctionMetaName(func)), |
token_pos); |
} |
@@ -9378,8 +9426,9 @@ void Library::AddTypeParameterMetadata(const TypeParameter& param, |
} |
-void Library::AddLibraryMetadata(const Class& cls, intptr_t token_pos) const { |
- AddMetadata(cls, Symbols::TopLevel(), token_pos); |
+void Library::AddLibraryMetadata(const Object& tl_owner, |
+ intptr_t token_pos) const { |
+ AddMetadata(tl_owner, Symbols::TopLevel(), token_pos); |
} |
@@ -9431,8 +9480,7 @@ RawObject* Library::GetMetadata(const Object& obj) const { |
Object& metadata = Object::Handle(); |
metadata = field.StaticValue(); |
if (field.StaticValue() == Object::empty_array().raw()) { |
- metadata = Parser::ParseMetadata(Class::Handle(field.owner()), |
- field.token_pos()); |
+ metadata = Parser::ParseMetadata(field); |
if (metadata.IsArray()) { |
ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
field.SetStaticValue(Array::Cast(metadata), true); |
@@ -9710,8 +9758,7 @@ RawArray* Library::LoadedScripts() const { |
} else if (entry.IsFunction()) { |
owner_script = Function::Cast(entry).script(); |
} else if (entry.IsField()) { |
- cls = Field::Cast(entry).owner(); |
- owner_script = cls.script(); |
+ owner_script = Field::Cast(entry).script(); |
} else { |
continue; |
} |
@@ -9726,22 +9773,21 @@ RawArray* Library::LoadedScripts() const { |
AddScriptIfUnique(scripts, owner_script); |
} |
- // Special case: Scripts that only contain external top-level functions are |
- // not included above, but can be referenced through a library's anonymous |
- // classes. Example: dart-core:identical.dart. |
- Array& anon_classes = Array::Handle(anonymous_classes()); |
- Function& func = Function::Handle(); |
- Array& functions = Array::Handle(); |
- for (intptr_t i = 0; i < anon_classes.Length(); i++) { |
- cls ^= anon_classes.At(i); |
- if (cls.IsNull()) continue; |
+ cls ^= toplevel_class(); |
+ if (!cls.IsNull()) { |
owner_script = cls.script(); |
AddScriptIfUnique(scripts, owner_script); |
- functions = cls.functions(); |
+ // Special case: Scripts that only contain external top-level functions |
+ // are not included above, but can be referenced through a library's |
+ // anonymous classes. Example: dart-core:identical.dart. |
+ Function& func = Function::Handle(); |
+ Array& functions = Array::Handle(cls.functions()); |
for (intptr_t j = 0; j < functions.Length(); j++) { |
func ^= functions.At(j); |
- owner_script = func.script(); |
- AddScriptIfUnique(scripts, owner_script); |
+ if (func.is_external()) { |
+ owner_script = func.script(); |
+ AddScriptIfUnique(scripts, owner_script); |
+ } |
} |
} |
@@ -9959,17 +10005,9 @@ RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { |
} |
-void Library::AddAnonymousClass(const Class& cls) const { |
- intptr_t num_anonymous = this->raw_ptr()->num_anonymous_; |
- Array& anon_array = Array::Handle(this->raw_ptr()->anonymous_classes_); |
- if (num_anonymous == anon_array.Length()) { |
- intptr_t new_len = (num_anonymous == 0) ? 4 : num_anonymous * 2; |
- anon_array = Array::Grow(anon_array, new_len); |
- StorePointer(&raw_ptr()->anonymous_classes_, anon_array.raw()); |
- } |
- anon_array.SetAt(num_anonymous, cls); |
- num_anonymous++; |
- StoreNonPointer(&raw_ptr()->num_anonymous_, num_anonymous); |
+void Library::set_toplevel_class(const Class& value) const { |
+ ASSERT(raw_ptr()->toplevel_class_ == Class::null()); |
+ StorePointer(&raw_ptr()->toplevel_class_, value.raw()); |
} |
@@ -10099,12 +10137,10 @@ RawLibrary* Library::NewLibraryHelper(const String& url, |
Object::empty_array().raw()); |
result.StorePointer(&result.raw_ptr()->metadata_, |
GrowableObjectArray::New(4, Heap::kOld)); |
- result.StorePointer(&result.raw_ptr()->anonymous_classes_, |
- Object::empty_array().raw()); |
+ result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null()); |
result.StorePointer(&result.raw_ptr()->patch_classes_, |
GrowableObjectArray::New(Object::empty_array(), |
Heap::kOld)); |
- result.StoreNonPointer(&result.raw_ptr()->num_anonymous_, 0); |
result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); |
result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); |
result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); |
@@ -10159,12 +10195,8 @@ void Library::InitCoreLibrary(Isolate* isolate) { |
RawObject* Library::Evaluate(const String& expr, |
const Array& param_names, |
const Array& param_values) const { |
- // Take a top-level class and evaluate the expression |
- // as a static function of the class. |
- Class& top_level_class = Class::Handle(); |
- Array& top_level_classes = Array::Handle(anonymous_classes()); |
- ASSERT(top_level_classes.Length() > 0); |
- top_level_class ^= top_level_classes.At(0); |
+ // Evaluate the expression as a static function of the toplevel class. |
+ Class& top_level_class = Class::Handle(toplevel_class()); |
ASSERT(top_level_class.is_finalized()); |
return top_level_class.Evaluate(expr, param_names, param_values); |
} |
@@ -10829,19 +10861,17 @@ void Namespace::set_metadata_field(const Field& value) const { |
} |
-void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { |
+void Namespace::AddMetadata(const Object& owner, intptr_t token_pos) { |
ASSERT(Field::Handle(metadata_field()).IsNull()); |
- Field& field = Field::Handle(Field::New(Symbols::TopLevel(), |
- true, // is_static |
+ Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(), |
false, // is_final |
false, // is_const |
- false, // is_reflectable |
- owner_class, |
- Object::dynamic_type(), |
+ owner, |
token_pos)); |
+ field.set_is_reflectable(false); |
+ field.SetFieldType(Object::dynamic_type()); |
field.SetStaticValue(Array::empty_array(), true); |
set_metadata_field(field); |
- owner_class.AddField(field); |
} |
@@ -10854,8 +10884,7 @@ RawObject* Namespace::GetMetadata() const { |
Object& metadata = Object::Handle(); |
metadata = field.StaticValue(); |
if (field.StaticValue() == Object::empty_array().raw()) { |
- metadata = Parser::ParseMetadata(Class::Handle(field.owner()), |
- field.token_pos()); |
+ metadata = Parser::ParseMetadata(field); |
if (metadata.IsArray()) { |
ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
field.SetStaticValue(Array::Cast(metadata), true); |