Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1258)

Unified Diff: runtime/vm/object.cc

Issue 54713003: VM: Fix initialization of statics in presence of exceptions. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/object.cc
===================================================================
--- runtime/vm/object.cc (revision 29680)
+++ runtime/vm/object.cc (working copy)
@@ -4202,6 +4202,21 @@
}
+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_);
@@ -5429,10 +5444,9 @@
}
-RawFunction* Function::NewStaticInitializer(const String& field_name,
- const AbstractType& result_type,
- const Class& cls,
- intptr_t initializer_pos) {
+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))));
@@ -5443,9 +5457,9 @@
false, // !const
false, // !abstract
false, // !external
- cls,
- initializer_pos));
- init_function.set_result_type(result_type);
+ 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
@@ -5454,6 +5468,7 @@
init_function.set_is_visible(false);
init_function.set_is_optimizable(false);
init_function.set_is_inlinable(false);
+ init_function.set_saved_static_field(field);
return init_function.raw();
}
« runtime/vm/class_finalizer.cc ('K') | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698