// Copyright 2021 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "src/objects/property-details.h" #include "test/cctest/cctest.h" namespace v8 { namespace internal { namespace { std::vector make_details() { std::vector result; for (PropertyKind kind : {PropertyKind::kData, PropertyKind::kAccessor}) { for (PropertyConstness constness : {PropertyConstness::kConst, PropertyConstness::kMutable}) { for (PropertyCellType cell_type : {PropertyCellType::kConstant, PropertyCellType::kConstantType, PropertyCellType::kMutable, PropertyCellType::kUndefined, PropertyCellType::kNoCell}) { for (int attrs = 0; attrs < 8; ++attrs) { PropertyAttributes attributes = static_cast(attrs); PropertyDetails details(kind, attributes, cell_type); details = details.CopyWithConstness(constness); result.push_back(details); } } } } return result; } } // namespace #ifndef DEBUG // This test will trigger a DCHECK failure in debug mode. We must ensure that in // release mode, the enum index doesn't interfere with other fields once it // becomes too large. TEST(ExceedMaxEnumerationIndex) { int too_large_enum_index = std::numeric_limits::max(); for (PropertyDetails d : make_details()) { PropertyDetails copy(d); d = d.set_index(too_large_enum_index); CHECK_EQ(copy.kind(), d.kind()); CHECK_EQ(copy.location(), d.location()); CHECK_EQ(copy.attributes(), d.attributes()); CHECK_EQ(copy.cell_type(), d.cell_type()); CHECK_EQ(PropertyDetails::DictionaryStorageField::kMax, d.dictionary_index()); } } #endif TEST(AsByte) { for (PropertyDetails original : make_details()) { if (original.cell_type() != PropertyCellType::kNoCell) continue; uint8_t as_byte = original.ToByte(); PropertyDetails from_byte = PropertyDetails::FromByte(as_byte); CHECK_EQ(original, from_byte); } } } // namespace internal } // namespace v8