Version 2.14.0-55.0.dev
Merge commit '820cdc926551e62f1b491a9e7f48c4bf92b2aac9' into 'dev'
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 9dfcc4e..47e9439 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -155,7 +155,7 @@
LeaveCompilerScope cs(H.thread());
field.RecordStore(Object::null_object());
} else {
- ASSERT(field.is_nullable(/* silence_assert = */ true));
+ ASSERT(field.is_nullable_unsafe());
}
return Fragment();
}
@@ -187,7 +187,7 @@
LeaveCompilerScope cs(H.thread());
field.RecordStore(Object::null_object());
} else {
- ASSERT(field.is_nullable(/* silence_assert = */ true));
+ ASSERT(field.is_nullable_unsafe());
}
return Fragment();
}
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 3c3c21a..ade7623 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -10235,21 +10235,18 @@
&untag()->guarded_cid_);
}
-bool Field::is_nullable(bool silence_assert) const {
+bool Field::is_nullable() const {
#if defined(DEBUG)
- if (!silence_assert) {
- // Same assert as guarded_cid(), because is_nullable() also needs to be
- // consistent for the background compiler.
- Thread* thread = Thread::Current();
- ASSERT(
- !thread->IsInsideCompiler() ||
+ // Same assert as guarded_cid(), because is_nullable() also needs to be
+ // consistent for the background compiler.
+ Thread* thread = Thread::Current();
+ ASSERT(!thread->IsInsideCompiler() ||
#if !defined(DART_PRECOMPILED_RUNTIME)
- ((CompilerState::Current().should_clone_fields() == !IsOriginal())) ||
+ ((CompilerState::Current().should_clone_fields() == !IsOriginal())) ||
#endif
- is_static());
- }
+ is_static());
#endif
- return untag()->is_nullable_ == kNullCid;
+ return is_nullable_unsafe();
}
void Field::SetOriginal(const Field& value) const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 078af85..75bab66 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4224,14 +4224,19 @@
// Internally we is_nullable_ field contains either kNullCid (nullable) or
// kInvalidCid (non-nullable) instead of boolean. This is done to simplify
// guarding sequence in the generated code.
- bool is_nullable(bool silence_assert = false) const;
+ bool is_nullable() const;
void set_is_nullable(bool val) const {
DEBUG_ASSERT(
IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
set_is_nullable_unsafe(val);
}
+ bool is_nullable_unsafe() const {
+ return LoadNonPointer<ClassIdTagType, std::memory_order_relaxed>(
+ &untag()->is_nullable_) == kNullCid;
+ }
void set_is_nullable_unsafe(bool val) const {
- StoreNonPointer(&untag()->is_nullable_, val ? kNullCid : kIllegalCid);
+ StoreNonPointer<ClassIdTagType, ClassIdTagType, std::memory_order_relaxed>(
+ &untag()->is_nullable_, val ? kNullCid : kIllegalCid);
}
static intptr_t is_nullable_offset() {
return OFFSET_OF(UntaggedField, is_nullable_);
diff --git a/tools/VERSION b/tools/VERSION
index 2bb6277..4343132 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 54
+PRERELEASE 55
PRERELEASE_PATCH 0
\ No newline at end of file