@@ -233,10 +233,12 @@ enum ClassId : intptr_t {
233
233
#define DEFINE_OBJECT_KIND (clazz ) \
234
234
kTypedData ##clazz##Cid, \
235
235
kTypedData ##clazz##ViewCid, \
236
- kExternalTypedData ##clazz##Cid,
236
+ kExternalTypedData ##clazz##Cid, \
237
+ kUnmodifiableTypedData ##clazz##ViewCid,
237
238
CLASS_LIST_TYPED_DATA (DEFINE_OBJECT_KIND)
238
239
#undef DEFINE_OBJECT_KIND
239
240
kByteDataViewCid ,
241
+ kUnmodifiableByteDataViewCid ,
240
242
241
243
kByteBufferCid ,
242
244
// clang-format on
@@ -255,6 +257,7 @@ enum ClassId : intptr_t {
255
257
const int kTypedDataCidRemainderInternal = 0 ;
256
258
const int kTypedDataCidRemainderView = 1 ;
257
259
const int kTypedDataCidRemainderExternal = 2 ;
260
+ const int kTypedDataCidRemainderUnmodifiable = 3 ;
258
261
259
262
// Class Id predicates.
260
263
@@ -361,34 +364,45 @@ inline bool IsTypeClassId(intptr_t index) {
361
364
362
365
inline bool IsTypedDataBaseClassId (intptr_t index) {
363
366
// Make sure this is updated when new TypedData types are added.
364
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 3 == kTypedDataUint8ArrayCid );
367
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 4 == kTypedDataUint8ArrayCid );
365
368
return index >= kTypedDataInt8ArrayCid && index < kByteDataViewCid ;
366
369
}
367
370
368
371
inline bool IsTypedDataClassId (intptr_t index) {
369
372
// Make sure this is updated when new TypedData types are added.
370
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 3 == kTypedDataUint8ArrayCid );
373
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 4 == kTypedDataUint8ArrayCid );
371
374
return IsTypedDataBaseClassId (index ) && ((index - kTypedDataInt8ArrayCid ) %
372
- 3 ) == kTypedDataCidRemainderInternal ;
375
+ 4 ) == kTypedDataCidRemainderInternal ;
373
376
}
374
377
375
378
inline bool IsTypedDataViewClassId (intptr_t index) {
376
379
// Make sure this is updated when new TypedData types are added.
377
- COMPILE_ASSERT (kTypedDataInt8ArrayViewCid + 3 == kTypedDataUint8ArrayViewCid );
380
+ COMPILE_ASSERT (kTypedDataInt8ArrayViewCid + 4 == kTypedDataUint8ArrayViewCid );
378
381
379
382
const bool is_byte_data_view = index == kByteDataViewCid ;
380
383
return is_byte_data_view ||
381
384
(IsTypedDataBaseClassId (index ) &&
382
- ((index - kTypedDataInt8ArrayCid ) % 3 ) == kTypedDataCidRemainderView );
385
+ ((index - kTypedDataInt8ArrayCid ) % 4 ) == kTypedDataCidRemainderView );
383
386
}
384
387
385
388
inline bool IsExternalTypedDataClassId (intptr_t index) {
386
389
// Make sure this is updated when new TypedData types are added.
387
- COMPILE_ASSERT (kExternalTypedDataInt8ArrayCid + 3 ==
390
+ COMPILE_ASSERT (kExternalTypedDataInt8ArrayCid + 4 ==
388
391
kExternalTypedDataUint8ArrayCid );
389
392
390
393
return IsTypedDataBaseClassId (index ) && ((index - kTypedDataInt8ArrayCid ) %
391
- 3 ) == kTypedDataCidRemainderExternal ;
394
+ 4 ) == kTypedDataCidRemainderExternal ;
395
+ }
396
+
397
+ inline bool IsUnmodifiableTypedDataViewClassId (intptr_t index) {
398
+ // Make sure this is updated when new TypedData types are added.
399
+ COMPILE_ASSERT (kExternalTypedDataInt8ArrayCid + 4 ==
400
+ kExternalTypedDataUint8ArrayCid );
401
+
402
+ const bool is_byte_data_view = index == kUnmodifiableByteDataViewCid ;
403
+ return is_byte_data_view || (IsTypedDataBaseClassId (index ) &&
404
+ ((index - kTypedDataInt8ArrayCid ) % 4 ) ==
405
+ kTypedDataCidRemainderUnmodifiable );
392
406
}
393
407
394
408
inline bool IsFfiTypeClassId (intptr_t index) {
@@ -446,21 +460,21 @@ COMPILE_ASSERT(kTypedDataInt8ArrayCid + 1 == kTypedDataInt8ArrayViewCid);
446
460
COMPILE_ASSERT (kTypedDataInt8ArrayCid + 2 == kExternalTypedDataInt8ArrayCid );
447
461
448
462
// Ensure the order of the typed data members in 3-step.
449
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 1 * 3 == kTypedDataUint8ArrayCid );
450
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 2 * 3 ==
463
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 1 * 4 == kTypedDataUint8ArrayCid );
464
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 2 * 4 ==
451
465
kTypedDataUint8ClampedArrayCid );
452
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 3 * 3 == kTypedDataInt16ArrayCid );
453
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 4 * 3 == kTypedDataUint16ArrayCid );
454
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 5 * 3 == kTypedDataInt32ArrayCid );
455
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 6 * 3 == kTypedDataUint32ArrayCid );
456
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 7 * 3 == kTypedDataInt64ArrayCid );
457
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 8 * 3 == kTypedDataUint64ArrayCid );
458
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 9 * 3 == kTypedDataFloat32ArrayCid );
459
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 10 * 3 == kTypedDataFloat64ArrayCid );
460
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 11 * 3 == kTypedDataFloat32x4ArrayCid );
461
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 12 * 3 == kTypedDataInt32x4ArrayCid );
462
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 13 * 3 == kTypedDataFloat64x2ArrayCid );
463
- COMPILE_ASSERT (kTypedDataInt8ArrayCid + 14 * 3 == kByteDataViewCid );
466
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 3 * 4 == kTypedDataInt16ArrayCid );
467
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 4 * 4 == kTypedDataUint16ArrayCid );
468
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 5 * 4 == kTypedDataInt32ArrayCid );
469
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 6 * 4 == kTypedDataUint32ArrayCid );
470
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 7 * 4 == kTypedDataInt64ArrayCid );
471
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 8 * 4 == kTypedDataUint64ArrayCid );
472
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 9 * 4 == kTypedDataFloat32ArrayCid );
473
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 10 * 4 == kTypedDataFloat64ArrayCid );
474
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 11 * 4 == kTypedDataFloat32x4ArrayCid );
475
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 12 * 4 == kTypedDataInt32x4ArrayCid );
476
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 13 * 4 == kTypedDataFloat64x2ArrayCid );
477
+ COMPILE_ASSERT (kTypedDataInt8ArrayCid + 14 * 4 == kByteDataViewCid );
464
478
COMPILE_ASSERT (kByteBufferCid + 1 == kNullCid );
465
479
466
480
} // namespace dart
0 commit comments