OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 2763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2774 orig_list = fields(); | 2774 orig_list = fields(); |
2775 orig_len = orig_list.Length(); | 2775 orig_len = orig_list.Length(); |
2776 patch_list = patch.fields(); | 2776 patch_list = patch.fields(); |
2777 patch_len = patch_list.Length(); | 2777 patch_len = patch_list.Length(); |
2778 | 2778 |
2779 Field& field = Field::Handle(); | 2779 Field& field = Field::Handle(); |
2780 Field& orig_field = Field::Handle(); | 2780 Field& orig_field = Field::Handle(); |
2781 new_list = Array::New(patch_len + orig_len); | 2781 new_list = Array::New(patch_len + orig_len); |
2782 for (intptr_t i = 0; i < patch_len; i++) { | 2782 for (intptr_t i = 0; i < patch_len; i++) { |
2783 field ^= patch_list.At(i); | 2783 field ^= patch_list.At(i); |
2784 field.set_owner(*this); | 2784 field.set_owner(patch_class); |
2785 member_name = field.name(); | 2785 member_name = field.name(); |
2786 // TODO(iposva): Verify non-public fields only. | 2786 // TODO(iposva): Verify non-public fields only. |
2787 | 2787 |
2788 // Verify no duplicate additions. | 2788 // Verify no duplicate additions. |
2789 orig_field ^= LookupField(member_name); | 2789 orig_field ^= LookupField(member_name); |
2790 if (!orig_field.IsNull()) { | 2790 if (!orig_field.IsNull()) { |
2791 *error = LanguageError::NewFormatted( | 2791 *error = LanguageError::NewFormatted( |
2792 *error, // No previous error. | 2792 *error, // No previous error. |
2793 Script::Handle(patch.script()), | 2793 Script::Handle(patch.script()), |
2794 field.token_pos(), | 2794 field.token_pos(), |
(...skipping 2405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5200 | 5200 |
5201 | 5201 |
5202 void Function::set_saved_args_desc(const Array& value) const { | 5202 void Function::set_saved_args_desc(const Array& value) const { |
5203 ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher || | 5203 ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher || |
5204 kind() == RawFunction::kInvokeFieldDispatcher); | 5204 kind() == RawFunction::kInvokeFieldDispatcher); |
5205 ASSERT(raw_ptr()->data_ == Object::null()); | 5205 ASSERT(raw_ptr()->data_ == Object::null()); |
5206 set_data(value); | 5206 set_data(value); |
5207 } | 5207 } |
5208 | 5208 |
5209 | 5209 |
5210 RawField* Function::saved_static_field() const { | |
5211 ASSERT(kind() == RawFunction::kStaticInitializer); | |
5212 const Object& obj = Object::Handle(raw_ptr()->data_); | |
5213 ASSERT(obj.IsField()); | |
5214 return Field::Cast(obj).raw(); | |
5215 } | |
5216 | |
5217 | |
5218 void Function::set_saved_static_field(const Field& value) const { | |
5219 ASSERT(kind() == RawFunction::kStaticInitializer); | |
5220 ASSERT(raw_ptr()->data_ == Object::null()); | |
5221 set_data(value); | |
5222 } | |
5223 | |
5224 | |
5225 RawFunction* Function::parent_function() const { | 5210 RawFunction* Function::parent_function() const { |
5226 if (IsClosureFunction()) { | 5211 if (IsClosureFunction()) { |
5227 const Object& obj = Object::Handle(raw_ptr()->data_); | 5212 const Object& obj = Object::Handle(raw_ptr()->data_); |
5228 ASSERT(!obj.IsNull()); | 5213 ASSERT(!obj.IsNull()); |
5229 return ClosureData::Cast(obj).parent_function(); | 5214 return ClosureData::Cast(obj).parent_function(); |
5230 } | 5215 } |
5231 return Function::null(); | 5216 return Function::null(); |
5232 } | 5217 } |
5233 | 5218 |
5234 | 5219 |
5235 void Function::set_parent_function(const Function& value) const { | 5220 void Function::set_parent_function(const Function& value) const { |
5236 if (IsClosureFunction()) { | 5221 if (IsClosureFunction()) { |
5237 const Object& obj = Object::Handle(raw_ptr()->data_); | 5222 const Object& obj = Object::Handle(raw_ptr()->data_); |
5238 ASSERT(!obj.IsNull()); | 5223 ASSERT(!obj.IsNull()); |
5239 ClosureData::Cast(obj).set_parent_function(value); | 5224 ClosureData::Cast(obj).set_parent_function(value); |
5240 return; | 5225 return; |
5241 } | 5226 } |
5242 UNREACHABLE(); | 5227 UNREACHABLE(); |
5243 } | 5228 } |
5244 | 5229 |
5245 | 5230 |
5246 RawFunction* Function::implicit_closure_function() const { | 5231 RawFunction* Function::implicit_closure_function() const { |
5247 if (IsClosureFunction() || | 5232 if (IsClosureFunction() || |
5248 IsSignatureFunction() || | 5233 IsSignatureFunction() || |
5249 IsStaticInitializerFunction() || | |
5250 IsFactory()) { | 5234 IsFactory()) { |
5251 return Function::null(); | 5235 return Function::null(); |
5252 } | 5236 } |
5253 const Object& obj = Object::Handle(raw_ptr()->data_); | 5237 const Object& obj = Object::Handle(raw_ptr()->data_); |
5254 ASSERT(obj.IsNull() || obj.IsScript() || obj.IsFunction()); | 5238 ASSERT(obj.IsNull() || obj.IsScript() || obj.IsFunction()); |
5255 return (obj.IsNull() || obj.IsScript()) ? Function::null() | 5239 return (obj.IsNull() || obj.IsScript()) ? Function::null() |
5256 : Function::Cast(obj).raw(); | 5240 : Function::Cast(obj).raw(); |
5257 } | 5241 } |
5258 | 5242 |
5259 | 5243 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5333 break; | 5317 break; |
5334 case RawFunction::kImplicitGetter: | 5318 case RawFunction::kImplicitGetter: |
5335 return "kImplicitGetter"; | 5319 return "kImplicitGetter"; |
5336 break; | 5320 break; |
5337 case RawFunction::kImplicitSetter: | 5321 case RawFunction::kImplicitSetter: |
5338 return "kImplicitSetter"; | 5322 return "kImplicitSetter"; |
5339 break; | 5323 break; |
5340 case RawFunction::kImplicitStaticFinalGetter: | 5324 case RawFunction::kImplicitStaticFinalGetter: |
5341 return "kImplicitStaticFinalGetter"; | 5325 return "kImplicitStaticFinalGetter"; |
5342 break; | 5326 break; |
5343 case RawFunction::kStaticInitializer: | |
5344 return "kStaticInitializer"; | |
5345 break; | |
5346 case RawFunction::kMethodExtractor: | 5327 case RawFunction::kMethodExtractor: |
5347 return "kMethodExtractor"; | 5328 return "kMethodExtractor"; |
5348 break; | 5329 break; |
5349 case RawFunction::kNoSuchMethodDispatcher: | 5330 case RawFunction::kNoSuchMethodDispatcher: |
5350 return "kNoSuchMethodDispatcher"; | 5331 return "kNoSuchMethodDispatcher"; |
5351 break; | 5332 break; |
5352 case RawFunction::kInvokeFieldDispatcher: | 5333 case RawFunction::kInvokeFieldDispatcher: |
5353 return "kInvokeFieldDispatcher"; | 5334 return "kInvokeFieldDispatcher"; |
5354 break; | 5335 break; |
5355 default: | 5336 default: |
(...skipping 1325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6681 ToFullyQualifiedCString(), | 6662 ToFullyQualifiedCString(), |
6682 fp, | 6663 fp, |
6683 SourceFingerprint()); | 6664 SourceFingerprint()); |
6684 return false; | 6665 return false; |
6685 } | 6666 } |
6686 } | 6667 } |
6687 return true; | 6668 return true; |
6688 } | 6669 } |
6689 | 6670 |
6690 | 6671 |
6691 RawFunction* Function::NewStaticInitializer(const Field& field) { | |
6692 ASSERT(field.is_static()); | |
6693 const String& field_name = String::Handle(field.name()); | |
6694 const String& init_name = | |
6695 String::Handle(Symbols::New(String::Handle( | |
6696 String::Concat(Symbols::InitPrefix(), field_name)))); | |
6697 const Function& init_function = Function::ZoneHandle( | |
6698 Function::New(init_name, | |
6699 RawFunction::kStaticInitializer, | |
6700 true, // static | |
6701 false, // !const | |
6702 false, // !abstract | |
6703 false, // !external | |
6704 false, // !native | |
6705 Class::Handle(field.owner()), | |
6706 field.token_pos())); | |
6707 init_function.set_result_type(AbstractType::Handle(field.type())); | |
6708 // Static initializer functions are generated by the VM and are therfore | |
6709 // hidden from the user. Since they are only executed once, we avoid | |
6710 // optimizing and inlining them. After the field is initialized, the | |
6711 // optimizing compiler can eliminate the call to the static initializer | |
6712 // via constant folding. | |
6713 init_function.set_is_visible(false); | |
6714 init_function.SetIsOptimizable(false); | |
6715 init_function.set_is_inlinable(false); | |
6716 init_function.set_saved_static_field(field); | |
6717 return init_function.raw(); | |
6718 } | |
6719 | |
6720 | |
6721 const char* Function::ToCString() const { | 6672 const char* Function::ToCString() const { |
6722 const char* static_str = is_static() ? " static" : ""; | 6673 const char* static_str = is_static() ? " static" : ""; |
6723 const char* abstract_str = is_abstract() ? " abstract" : ""; | 6674 const char* abstract_str = is_abstract() ? " abstract" : ""; |
6724 const char* kind_str = NULL; | 6675 const char* kind_str = NULL; |
6725 const char* const_str = is_const() ? " const" : ""; | 6676 const char* const_str = is_const() ? " const" : ""; |
6726 switch (kind()) { | 6677 switch (kind()) { |
6727 case RawFunction::kRegularFunction: | 6678 case RawFunction::kRegularFunction: |
6728 case RawFunction::kClosureFunction: | 6679 case RawFunction::kClosureFunction: |
6729 case RawFunction::kGetterFunction: | 6680 case RawFunction::kGetterFunction: |
6730 case RawFunction::kSetterFunction: | 6681 case RawFunction::kSetterFunction: |
6731 kind_str = ""; | 6682 kind_str = ""; |
6732 break; | 6683 break; |
6733 case RawFunction::kSignatureFunction: | 6684 case RawFunction::kSignatureFunction: |
6734 kind_str = " signature"; | 6685 kind_str = " signature"; |
6735 break; | 6686 break; |
6736 case RawFunction::kConstructor: | 6687 case RawFunction::kConstructor: |
6737 kind_str = is_static() ? " factory" : " constructor"; | 6688 kind_str = is_static() ? " factory" : " constructor"; |
6738 break; | 6689 break; |
6739 case RawFunction::kImplicitGetter: | 6690 case RawFunction::kImplicitGetter: |
6740 kind_str = " getter"; | 6691 kind_str = " getter"; |
6741 break; | 6692 break; |
6742 case RawFunction::kImplicitSetter: | 6693 case RawFunction::kImplicitSetter: |
6743 kind_str = " setter"; | 6694 kind_str = " setter"; |
6744 break; | 6695 break; |
6745 case RawFunction::kStaticInitializer: | |
6746 kind_str = " static-initializer"; | |
6747 break; | |
6748 case RawFunction::kImplicitStaticFinalGetter: | 6696 case RawFunction::kImplicitStaticFinalGetter: |
6749 kind_str = " static-final-getter"; | 6697 kind_str = " static-final-getter"; |
6750 break; | 6698 break; |
6751 case RawFunction::kMethodExtractor: | 6699 case RawFunction::kMethodExtractor: |
6752 kind_str = " method-extractor"; | 6700 kind_str = " method-extractor"; |
6753 break; | 6701 break; |
6754 case RawFunction::kNoSuchMethodDispatcher: | 6702 case RawFunction::kNoSuchMethodDispatcher: |
6755 kind_str = " no-such-method-dispatcher"; | 6703 kind_str = " no-such-method-dispatcher"; |
6756 break; | 6704 break; |
6757 case RawFunction::kInvokeFieldDispatcher: | 6705 case RawFunction::kInvokeFieldDispatcher: |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7273 } | 7221 } |
7274 | 7222 |
7275 | 7223 |
7276 bool Field::IsUninitialized() const { | 7224 bool Field::IsUninitialized() const { |
7277 const Instance& value = Instance::Handle(raw_ptr()->value_); | 7225 const Instance& value = Instance::Handle(raw_ptr()->value_); |
7278 ASSERT(value.raw() != Object::transition_sentinel().raw()); | 7226 ASSERT(value.raw() != Object::transition_sentinel().raw()); |
7279 return value.raw() == Object::sentinel().raw(); | 7227 return value.raw() == Object::sentinel().raw(); |
7280 } | 7228 } |
7281 | 7229 |
7282 | 7230 |
| 7231 void Field::EvaluateInitializer() const { |
| 7232 ASSERT(is_static()); |
| 7233 if (value() == Object::sentinel().raw()) { |
| 7234 set_value(Object::transition_sentinel()); |
| 7235 Object& value = Object::Handle(Compiler::EvaluateStaticInitializer(*this)); |
| 7236 if (value.IsError()) { |
| 7237 set_value(Object::null_instance()); |
| 7238 Exceptions::PropagateError(Error::Cast(value)); |
| 7239 UNREACHABLE(); |
| 7240 } |
| 7241 ASSERT(value.IsNull() || value.IsInstance()); |
| 7242 set_value(value.IsNull() ? Instance::null_instance() |
| 7243 : Instance::Cast(value)); |
| 7244 return; |
| 7245 } else if (value() == Object::transition_sentinel().raw()) { |
| 7246 set_value(Object::null_instance()); |
| 7247 const Array& ctor_args = Array::Handle(Array::New(1)); |
| 7248 const String& field_name = String::Handle(name()); |
| 7249 ctor_args.SetAt(0, field_name); |
| 7250 Exceptions::ThrowByType(Exceptions::kCyclicInitializationError, ctor_args); |
| 7251 UNREACHABLE(); |
| 7252 return; |
| 7253 } |
| 7254 UNREACHABLE(); |
| 7255 } |
| 7256 |
| 7257 |
7283 static intptr_t GetListLength(const Object& value) { | 7258 static intptr_t GetListLength(const Object& value) { |
7284 if (value.IsTypedData()) { | 7259 if (value.IsTypedData()) { |
7285 const TypedData& list = TypedData::Cast(value); | 7260 const TypedData& list = TypedData::Cast(value); |
7286 return list.Length(); | 7261 return list.Length(); |
7287 } else if (value.IsArray()) { | 7262 } else if (value.IsArray()) { |
7288 const Array& list = Array::Cast(value); | 7263 const Array& list = Array::Cast(value); |
7289 return list.Length(); | 7264 return list.Length(); |
7290 } else if (value.IsGrowableObjectArray()) { | 7265 } else if (value.IsGrowableObjectArray()) { |
7291 // List length is variable. | 7266 // List length is variable. |
7292 return Field::kNoFixedLength; | 7267 return Field::kNoFixedLength; |
(...skipping 12190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19483 return tag_label.ToCString(); | 19458 return tag_label.ToCString(); |
19484 } | 19459 } |
19485 | 19460 |
19486 | 19461 |
19487 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 19462 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
19488 Instance::PrintJSONImpl(stream, ref); | 19463 Instance::PrintJSONImpl(stream, ref); |
19489 } | 19464 } |
19490 | 19465 |
19491 | 19466 |
19492 } // namespace dart | 19467 } // namespace dart |
OLD | NEW |