blob: d147fb6d3c8da31b2fefa7da02085829608d3450 [file] [edit]
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart' as ast;
import 'package:kernel/src/printer.dart' as ast_printer show AstPrinter;
import 'package:kernel/type_environment.dart' show StaticTypeContext;
/// Kind of the unique VM object.
///
/// These unique objects are created by the VM at runtime,
/// so they are basically "runtime constants".
enum RuntimeConstantObjectKind {
// A unique `Object::uninitialized_index()` object.
// Result of '_uninitializedIndex' from dart:_compact_hash.
uninitializedIndex,
// A unique `Object::uninitialized_data()` object.
// Result of '_uninitializedData' from dart:_compact_hash.
uninitializedData,
}
/// Constant representing the unique VM object.
///
/// These objects are constant and canonical at runtime,
/// but they are not representable with regular Dart constants.
final class RuntimeConstantObject(final RuntimeConstantObjectKind kind)
extends ast.AuxiliaryConstant {
@override
void visitChildren(ast.Visitor v) {}
@override
void toTextInternal(ast_printer.AstPrinter printer) {
printer.write('#runtime-constant-object ${kind.name}');
}
@override
String toString() => 'RuntimeConstantObject(${kind.name})';
@override
int get hashCode => kind.hashCode;
@override
bool operator ==(Object other) =>
other is RuntimeConstantObject && other.kind == kind;
@override
ast.DartType getType(StaticTypeContext context) {
final coreTypes = context.typeEnvironment.coreTypes;
return switch (kind) {
.uninitializedIndex => coreTypes.nonNullableRawType(
coreTypes.index.getClass('dart:typed_data', 'Uint32List'),
),
.uninitializedData => coreTypes.listNonNullableRawType,
};
}
}