Skip to content

Commit df678db

Browse files
creliercommit-bot@chromium.org
authored andcommitted
[VM/nnbd] Introduce type Never in VM and bytecode.
Introduce enum NNBDMode for subtype test checking mode. Change-Id: Id9c39ee8c975c664ac58e313b7dd05e6e219dfc1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/123557 Reviewed-by: Ryan Macnak <rmacnak@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Régis Crelier <regis@google.com>
1 parent 917ba19 commit df678db

22 files changed

+130
-29
lines changed

pkg/front_end/testcases/strong.status

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
112112
instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # Expected
113113
instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
114114
nnbd/nullable_param: RuntimeError
115-
nnbd/simple_never: RuntimeError
116115
rasta/abstract_constructor: RuntimeError
117116
rasta/bad_constructor_redirection: RuntimeError
118117
rasta/bad_continue: RuntimeError

pkg/vm/lib/bytecode/dbc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ library vm.bytecode.dbc;
1010
/// Before bumping current bytecode version format, make sure that
1111
/// all users have switched to a VM which is able to consume new
1212
/// version of bytecode.
13-
const int currentBytecodeFormatVersion = 24;
13+
const int currentBytecodeFormatVersion = 25;
1414

1515
enum Opcode {
1616
kUnusedOpcode000,

pkg/vm/lib/bytecode/object_table.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,11 @@ type VoidType extends Type {
201201
typeTag (flags) = 2
202202
}
203203
204+
type NeverType extends Type {
205+
kind = 15
206+
typeTag (flags) = 9
207+
}
208+
204209
// SimpleType can be used only for types without instantiator type arguments.
205210
type SimpleType extends Type {
206211
kind = 15
@@ -321,6 +326,7 @@ enum TypeTag {
321326
kRecursiveGenericType,
322327
kRecursiveTypeRef,
323328
kFunctionType,
329+
kNever,
324330
}
325331

326332
/// Name of artificial class containing top-level members of a library.
@@ -419,6 +425,8 @@ abstract class ObjectHandle extends BytecodeObject {
419425
return new _DynamicTypeHandle();
420426
case TypeTag.kVoid:
421427
return new _VoidTypeHandle();
428+
case TypeTag.kNever:
429+
return new _NeverTypeHandle();
422430
case TypeTag.kSimpleType:
423431
return new _SimpleTypeHandle._empty(nullability);
424432
case TypeTag.kTypeParameter:
@@ -737,6 +745,25 @@ class _VoidTypeHandle extends _TypeHandle {
737745
String toString() => 'void';
738746
}
739747

748+
class _NeverTypeHandle extends _TypeHandle {
749+
_NeverTypeHandle() : super(TypeTag.kNever, Nullability.nonNullable);
750+
751+
@override
752+
void writeContents(BufferedWriter writer) {}
753+
754+
@override
755+
void readContents(BufferedReader reader) {}
756+
757+
@override
758+
int get hashCode => 2049;
759+
760+
@override
761+
bool operator ==(other) => other is _NeverTypeHandle;
762+
763+
@override
764+
String toString() => 'Never';
765+
}
766+
740767
class _SimpleTypeHandle extends _TypeHandle {
741768
_ClassHandle class_;
742769

@@ -1717,12 +1744,14 @@ class ObjectTable implements ObjectWriter, ObjectReader {
17171744
List<ObjectHandle> _indexTable;
17181745
_TypeHandle _dynamicType;
17191746
_TypeHandle _voidType;
1747+
_TypeHandle _neverType;
17201748
CoreTypes coreTypes;
17211749
_NodeVisitor _nodeVisitor;
17221750

17231751
ObjectTable() {
17241752
_dynamicType = getOrAddObject(new _DynamicTypeHandle());
17251753
_voidType = getOrAddObject(new _VoidTypeHandle());
1754+
_neverType = getOrAddObject(new _NeverTypeHandle());
17261755
_nodeVisitor = new _NodeVisitor(this);
17271756
}
17281757

@@ -2098,6 +2127,9 @@ class _NodeVisitor extends Visitor<ObjectHandle> {
20982127
@override
20992128
ObjectHandle visitVoidType(VoidType node) => objectTable._voidType;
21002129

2130+
@override
2131+
ObjectHandle visitNeverType(NeverType node) => objectTable._neverType;
2132+
21012133
@override
21022134
ObjectHandle visitBottomType(BottomType node) =>
21032135
objectTable.getHandle(objectTable.coreTypes.nullType);

runtime/lib/mirrors.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,10 @@ static RawInstance* CreateTypeMirror(const AbstractType& type) {
625625
Array& args = Array::Handle(Array::New(1));
626626
args.SetAt(0, Symbols::Dynamic());
627627
return CreateMirror(Symbols::_SpecialTypeMirror(), args);
628+
} else if (cls.IsNeverClass()) {
629+
Array& args = Array::Handle(Array::New(1));
630+
args.SetAt(0, Symbols::Never());
631+
return CreateMirror(Symbols::_SpecialTypeMirror(), args);
628632
}
629633
// TODO(regis): Until mirrors reflect nullability, force kLegacy, except for
630634
// Null type, which should remain nullable.

runtime/vm/class_id.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,11 @@ enum ClassId {
208208
// clang-format on
209209

210210
// The following entries do not describe a predefined class, but instead
211-
// are class indexes for pre-allocated instances (Null, dynamic and Void).
211+
// are class indexes for pre-allocated instances (Null, dynamic, void, Never).
212212
kNullCid,
213213
kDynamicCid,
214214
kVoidCid,
215+
kNeverCid,
215216

216217
kNumPredefinedCids,
217218
};

runtime/vm/class_table.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ SharedClassTable::SharedClassTable()
4444
vm_shared_class_table->SizeAt(kForwardingCorpse);
4545
table_[kDynamicCid] = vm_shared_class_table->SizeAt(kDynamicCid);
4646
table_[kVoidCid] = vm_shared_class_table->SizeAt(kVoidCid);
47+
table_[kNeverCid] = vm_shared_class_table->SizeAt(kNeverCid);
4748
}
4849
#ifndef PRODUCT
4950
class_heap_stats_table_ = static_cast<ClassHeapStats*>(
@@ -90,6 +91,7 @@ ClassTable::ClassTable(SharedClassTable* shared_class_table)
9091
table_[kForwardingCorpse] = vm_class_table->At(kForwardingCorpse);
9192
table_[kDynamicCid] = vm_class_table->At(kDynamicCid);
9293
table_[kVoidCid] = vm_class_table->At(kVoidCid);
94+
table_[kNeverCid] = vm_class_table->At(kNeverCid);
9395
}
9496
}
9597

runtime/vm/clustered_snapshot.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4902,6 +4902,7 @@ void Serializer::AddVMIsolateBaseObjects() {
49024902
}
49034903
AddBaseObject(table->At(kDynamicCid), "Class");
49044904
AddBaseObject(table->At(kVoidCid), "Class");
4905+
AddBaseObject(table->At(kNeverCid), "Class");
49054906

49064907
if (!Snapshot::IncludesCode(kind_)) {
49074908
for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
@@ -5360,6 +5361,7 @@ void Deserializer::AddVMIsolateBaseObjects() {
53605361
}
53615362
AddBaseObject(table->At(kDynamicCid));
53625363
AddBaseObject(table->At(kVoidCid));
5364+
AddBaseObject(table->At(kNeverCid));
53635365

53645366
if (!Snapshot::IncludesCode(kind_)) {
53655367
for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {

runtime/vm/compiler/aot/precompiler.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,8 +1573,9 @@ void Precompiler::AttachOptimizedTypeTestingStub() {
15731573
const AbstractType& type = types.At(i);
15741574

15751575
if (type.InVMIsolateHeap()) {
1576-
// The only important types in the vm isolate are "dynamic"/"void", which
1577-
// will get their optimized top-type testing stub installed at creation.
1576+
// The only important types in the vm isolate are
1577+
// "dynamic"/"void"/"Never", which will get their optimized
1578+
// testing stub installed at creation.
15781579
continue;
15791580
}
15801581

runtime/vm/compiler/backend/il.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ void HierarchyInfo::BuildRangesFor(ClassTable* table,
204204
if (cid == kTypeArgumentsCid) continue;
205205
if (cid == kVoidCid) continue;
206206
if (cid == kDynamicCid) continue;
207+
if (cid == kNeverCid) continue;
207208
if (cid == kNullCid && !exclude_null) continue;
208209
cls = table->At(cid);
209210
if (!include_abstract && cls.is_abstract()) continue;

runtime/vm/compiler/frontend/bytecode_reader.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,6 +1689,7 @@ RawObject* BytecodeReaderHelper::ReadType(intptr_t tag,
16891689
kRecursiveGenericType,
16901690
kRecursiveTypeRef,
16911691
kFunctionType,
1692+
kNever,
16921693
};
16931694

16941695
// FunctionType flags, must be in sync with _FunctionTypeHandle constants in
@@ -1705,6 +1706,8 @@ RawObject* BytecodeReaderHelper::ReadType(intptr_t tag,
17051706
return AbstractType::dynamic_type().raw();
17061707
case kVoid:
17071708
return AbstractType::void_type().raw();
1709+
case kNever:
1710+
return AbstractType::never_type().raw();
17081711
case kSimpleType: {
17091712
const Class& cls = Class::CheckedHandle(Z, ReadObject());
17101713
if (!cls.is_declaration_loaded()) {

0 commit comments

Comments
 (0)