Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 39381) |
+++ runtime/vm/object.cc (working copy) |
@@ -2781,7 +2781,7 @@ |
new_list = Array::New(patch_len + orig_len); |
for (intptr_t i = 0; i < patch_len; i++) { |
field ^= patch_list.At(i); |
- field.set_owner(*this); |
+ field.set_owner(patch_class); |
member_name = field.name(); |
// TODO(iposva): Verify non-public fields only. |
@@ -5207,21 +5207,6 @@ |
} |
-RawField* Function::saved_static_field() const { |
- ASSERT(kind() == RawFunction::kStaticInitializer); |
- const Object& obj = Object::Handle(raw_ptr()->data_); |
- ASSERT(obj.IsField()); |
- return Field::Cast(obj).raw(); |
-} |
- |
- |
-void Function::set_saved_static_field(const Field& value) const { |
- ASSERT(kind() == RawFunction::kStaticInitializer); |
- ASSERT(raw_ptr()->data_ == Object::null()); |
- set_data(value); |
-} |
- |
- |
RawFunction* Function::parent_function() const { |
if (IsClosureFunction()) { |
const Object& obj = Object::Handle(raw_ptr()->data_); |
@@ -5246,7 +5231,6 @@ |
RawFunction* Function::implicit_closure_function() const { |
if (IsClosureFunction() || |
IsSignatureFunction() || |
- IsStaticInitializerFunction() || |
IsFactory()) { |
return Function::null(); |
} |
@@ -5340,9 +5324,6 @@ |
case RawFunction::kImplicitStaticFinalGetter: |
return "kImplicitStaticFinalGetter"; |
break; |
- case RawFunction::kStaticInitializer: |
- return "kStaticInitializer"; |
- break; |
case RawFunction::kMethodExtractor: |
return "kMethodExtractor"; |
break; |
@@ -6688,36 +6669,6 @@ |
} |
-RawFunction* Function::NewStaticInitializer(const Field& field) { |
- ASSERT(field.is_static()); |
- const String& field_name = String::Handle(field.name()); |
- const String& init_name = |
- String::Handle(Symbols::New(String::Handle( |
- String::Concat(Symbols::InitPrefix(), field_name)))); |
- const Function& init_function = Function::ZoneHandle( |
- Function::New(init_name, |
- RawFunction::kStaticInitializer, |
- true, // static |
- false, // !const |
- false, // !abstract |
- false, // !external |
- false, // !native |
- Class::Handle(field.owner()), |
- field.token_pos())); |
- init_function.set_result_type(AbstractType::Handle(field.type())); |
- // Static initializer functions are generated by the VM and are therfore |
- // hidden from the user. Since they are only executed once, we avoid |
- // optimizing and inlining them. After the field is initialized, the |
- // optimizing compiler can eliminate the call to the static initializer |
- // via constant folding. |
- init_function.set_is_visible(false); |
- init_function.SetIsOptimizable(false); |
- init_function.set_is_inlinable(false); |
- init_function.set_saved_static_field(field); |
- return init_function.raw(); |
-} |
- |
- |
const char* Function::ToCString() const { |
const char* static_str = is_static() ? " static" : ""; |
const char* abstract_str = is_abstract() ? " abstract" : ""; |
@@ -6742,9 +6693,6 @@ |
case RawFunction::kImplicitSetter: |
kind_str = " setter"; |
break; |
- case RawFunction::kStaticInitializer: |
- kind_str = " static-initializer"; |
- break; |
case RawFunction::kImplicitStaticFinalGetter: |
kind_str = " static-final-getter"; |
break; |
@@ -7280,6 +7228,33 @@ |
} |
+void Field::EvaluateInitializer() const { |
+ ASSERT(is_static()); |
+ if (value() == Object::sentinel().raw()) { |
+ set_value(Object::transition_sentinel()); |
+ Object& value = Object::Handle(Compiler::EvaluateStaticInitializer(*this)); |
+ if (value.IsError()) { |
+ set_value(Object::null_instance()); |
+ Exceptions::PropagateError(Error::Cast(value)); |
+ UNREACHABLE(); |
+ } |
+ ASSERT(value.IsNull() || value.IsInstance()); |
+ set_value(value.IsNull() ? Instance::null_instance() |
+ : Instance::Cast(value)); |
+ return; |
+ } else if (value() == Object::transition_sentinel().raw()) { |
+ set_value(Object::null_instance()); |
+ const Array& ctor_args = Array::Handle(Array::New(1)); |
+ const String& field_name = String::Handle(name()); |
+ ctor_args.SetAt(0, field_name); |
+ Exceptions::ThrowByType(Exceptions::kCyclicInitializationError, ctor_args); |
+ UNREACHABLE(); |
+ return; |
+ } |
+ UNREACHABLE(); |
+} |
+ |
+ |
static intptr_t GetListLength(const Object& value) { |
if (value.IsTypedData()) { |
const TypedData& list = TypedData::Cast(value); |