[vm] Refactor typed data cid handling.
No changes in cids, just defining kFirstTypedDataCid and
kLastTypedDataCid to avoid assumptions that kTypedDataInt8ArrayCid is
the first one and that kByteDataViewCid comes after the last one
(outside of compile-time checks for possible new typed data cids before
kTypedDataInt8ArrayCid and kByteDataViewCid).
Also defining kNumTypedDataCidRemainders to be used in the place of the
appropriate hardcoded 4s.
TEST=ci
Change-Id: Ic9f937ef0fa670b3331b9079090596d9a120ee15
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/352862
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index cae4b76..c093985 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -264,6 +264,7 @@
const int kTypedDataCidRemainderView = 1;
const int kTypedDataCidRemainderExternal = 2;
const int kTypedDataCidRemainderUnmodifiable = 3;
+const int kNumTypedDataCidRemainders = kTypedDataCidRemainderUnmodifiable + 1;
// Class Id predicates.
@@ -383,47 +384,88 @@
index == kRecordTypeCid;
}
+static const ClassId kFirstTypedDataCid = kTypedDataInt8ArrayCid;
+static const ClassId kLastTypedDataCid =
+ kUnmodifiableTypedDataFloat64x2ArrayViewCid;
+
+// Make sure the following checks are updated when adding new TypedData types.
+
+// The following asserts assume this.
+COMPILE_ASSERT(kTypedDataCidRemainderInternal == 0);
+// Ensure that each typed data type comes in internal/view/external variants
+// next to each other.
+COMPILE_ASSERT(kTypedDataInt8ArrayCid + kTypedDataCidRemainderView ==
+ kTypedDataInt8ArrayViewCid);
+COMPILE_ASSERT(kTypedDataInt8ArrayCid + kTypedDataCidRemainderExternal ==
+ kExternalTypedDataInt8ArrayCid);
+COMPILE_ASSERT(kTypedDataInt8ArrayCid + kTypedDataCidRemainderUnmodifiable ==
+ kUnmodifiableTypedDataInt8ArrayViewCid);
+// Ensure the order of the typed data members in 3-step.
+COMPILE_ASSERT(kFirstTypedDataCid == kTypedDataInt8ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 1 * kNumTypedDataCidRemainders ==
+ kTypedDataUint8ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 2 * kNumTypedDataCidRemainders ==
+ kTypedDataUint8ClampedArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 3 * kNumTypedDataCidRemainders ==
+ kTypedDataInt16ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 4 * kNumTypedDataCidRemainders ==
+ kTypedDataUint16ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 5 * kNumTypedDataCidRemainders ==
+ kTypedDataInt32ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 6 * kNumTypedDataCidRemainders ==
+ kTypedDataUint32ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 7 * kNumTypedDataCidRemainders ==
+ kTypedDataInt64ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 8 * kNumTypedDataCidRemainders ==
+ kTypedDataUint64ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 9 * kNumTypedDataCidRemainders ==
+ kTypedDataFloat32ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 10 * kNumTypedDataCidRemainders ==
+ kTypedDataFloat64ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 11 * kNumTypedDataCidRemainders ==
+ kTypedDataFloat32x4ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 12 * kNumTypedDataCidRemainders ==
+ kTypedDataInt32x4ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 13 * kNumTypedDataCidRemainders ==
+ kTypedDataFloat64x2ArrayCid);
+COMPILE_ASSERT(kFirstTypedDataCid + 13 * kNumTypedDataCidRemainders +
+ kTypedDataCidRemainderUnmodifiable ==
+ kLastTypedDataCid);
+// Checks for possible new typed data entries added before or after the current
+// entries.
+COMPILE_ASSERT(kFfiStructCid + 1 == kFirstTypedDataCid);
+COMPILE_ASSERT(kLastTypedDataCid + 1 == kByteDataViewCid);
+
inline bool IsTypedDataBaseClassId(intptr_t index) {
- // Make sure this is updated when new TypedData types are added.
- COMPILE_ASSERT(kTypedDataInt8ArrayCid + 4 == kTypedDataUint8ArrayCid);
- return index >= kTypedDataInt8ArrayCid && index < kByteDataViewCid;
+ return index >= kFirstTypedDataCid && index <= kLastTypedDataCid;
}
inline bool IsTypedDataClassId(intptr_t index) {
- // Make sure this is updated when new TypedData types are added.
- COMPILE_ASSERT(kTypedDataInt8ArrayCid + 4 == kTypedDataUint8ArrayCid);
- return IsTypedDataBaseClassId(index) && ((index - kTypedDataInt8ArrayCid) %
- 4) == kTypedDataCidRemainderInternal;
+ return IsTypedDataBaseClassId(index) &&
+ ((index - kFirstTypedDataCid) % kNumTypedDataCidRemainders) ==
+ kTypedDataCidRemainderInternal;
}
inline bool IsTypedDataViewClassId(intptr_t index) {
- // Make sure this is updated when new TypedData types are added.
- COMPILE_ASSERT(kTypedDataInt8ArrayViewCid + 4 == kTypedDataUint8ArrayViewCid);
-
const bool is_byte_data_view = index == kByteDataViewCid;
return is_byte_data_view ||
(IsTypedDataBaseClassId(index) &&
- ((index - kTypedDataInt8ArrayCid) % 4) == kTypedDataCidRemainderView);
+ ((index - kFirstTypedDataCid) % kNumTypedDataCidRemainders) ==
+ kTypedDataCidRemainderView);
}
inline bool IsExternalTypedDataClassId(intptr_t index) {
- // Make sure this is updated when new TypedData types are added.
- COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid + 4 ==
- kExternalTypedDataUint8ArrayCid);
-
- return IsTypedDataBaseClassId(index) && ((index - kTypedDataInt8ArrayCid) %
- 4) == kTypedDataCidRemainderExternal;
+ return IsTypedDataBaseClassId(index) &&
+ ((index - kFirstTypedDataCid) % kNumTypedDataCidRemainders) ==
+ kTypedDataCidRemainderExternal;
}
inline bool IsUnmodifiableTypedDataViewClassId(intptr_t index) {
- // Make sure this is updated when new TypedData types are added.
- COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid + 4 ==
- kExternalTypedDataUint8ArrayCid);
-
const bool is_byte_data_view = index == kUnmodifiableByteDataViewCid;
- return is_byte_data_view || (IsTypedDataBaseClassId(index) &&
- ((index - kTypedDataInt8ArrayCid) % 4) ==
- kTypedDataCidRemainderUnmodifiable);
+ return is_byte_data_view ||
+ (IsTypedDataBaseClassId(index) &&
+ ((index - kFirstTypedDataCid) % kNumTypedDataCidRemainders) ==
+ kTypedDataCidRemainderUnmodifiable);
}
inline bool ShouldHaveImmutabilityBitSet(intptr_t index) {
@@ -483,29 +525,6 @@
return index == kByteBufferCid;
}
-// Make sure the following checks are updated when adding new TypedData types.
-
-// Ensure that each typed data type comes in internal/view/external variants
-// next to each other.
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 1 == kTypedDataInt8ArrayViewCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 2 == kExternalTypedDataInt8ArrayCid);
-
-// Ensure the order of the typed data members in 3-step.
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 1 * 4 == kTypedDataUint8ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 2 * 4 ==
- kTypedDataUint8ClampedArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 3 * 4 == kTypedDataInt16ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 4 * 4 == kTypedDataUint16ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 5 * 4 == kTypedDataInt32ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 6 * 4 == kTypedDataUint32ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 7 * 4 == kTypedDataInt64ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 8 * 4 == kTypedDataUint64ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 9 * 4 == kTypedDataFloat32ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 10 * 4 == kTypedDataFloat64ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 11 * 4 == kTypedDataFloat32x4ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 12 * 4 == kTypedDataInt32x4ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 13 * 4 == kTypedDataFloat64x2ArrayCid);
-COMPILE_ASSERT(kTypedDataInt8ArrayCid + 14 * 4 == kByteDataViewCid);
COMPILE_ASSERT(kByteBufferCid + 1 == kNullCid);
} // namespace dart
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index a9949aa..24fd6e5 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -11673,21 +11673,24 @@
return kUint8ArrayElement;
} else if (IsTypedDataClassId(cid)) {
const intptr_t index =
- (cid - kTypedDataInt8ArrayCid - kTypedDataCidRemainderInternal) / 4;
+ (cid - kFirstTypedDataCid - kTypedDataCidRemainderInternal) /
+ kNumTypedDataCidRemainders;
return static_cast<TypedDataElementType>(index);
} else if (IsTypedDataViewClassId(cid)) {
const intptr_t index =
- (cid - kTypedDataInt8ArrayCid - kTypedDataCidRemainderView) / 4;
+ (cid - kFirstTypedDataCid - kTypedDataCidRemainderView) /
+ kNumTypedDataCidRemainders;
return static_cast<TypedDataElementType>(index);
} else if (IsExternalTypedDataClassId(cid)) {
const intptr_t index =
- (cid - kTypedDataInt8ArrayCid - kTypedDataCidRemainderExternal) / 4;
+ (cid - kFirstTypedDataCid - kTypedDataCidRemainderExternal) /
+ kNumTypedDataCidRemainders;
return static_cast<TypedDataElementType>(index);
} else {
ASSERT(IsUnmodifiableTypedDataViewClassId(cid));
const intptr_t index =
- (cid - kTypedDataInt8ArrayCid - kTypedDataCidRemainderUnmodifiable) /
- 4;
+ (cid - kFirstTypedDataCid - kTypedDataCidRemainderUnmodifiable) /
+ kNumTypedDataCidRemainders;
return static_cast<TypedDataElementType>(index);
}
}
@@ -11753,7 +11756,8 @@
return size;
}
static constexpr intptr_t kNumElementSizes =
- (kTypedDataFloat64x2ArrayCid - kTypedDataInt8ArrayCid) / 4 + 1;
+ ((kLastTypedDataCid + 1) - kFirstTypedDataCid) /
+ kNumTypedDataCidRemainders;
static const intptr_t element_size_table[kNumElementSizes];
HEAP_OBJECT_IMPLEMENTATION(TypedDataBase, PointerBase);
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 03250fd..3823908 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2318,8 +2318,8 @@
Random random(42);
- for (classid_t cid = kTypedDataInt8ArrayCid; cid < kByteDataViewCid;
- cid += 4) {
+ for (classid_t cid = kFirstTypedDataCid; cid <= kLastTypedDataCid;
+ cid += kNumTypedDataCidRemainders) {
ASSERT(IsTypedDataClassId(cid));
const auto& small = TypedData::Handle(TypedData::New(cid, kSmallSize));