73 lines
2.2 KiB
C++
73 lines
2.2 KiB
C++
|
// 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 <limits>
|
||
|
|
||
|
#include "src/objects/property-details.h"
|
||
|
#include "test/cctest/cctest.h"
|
||
|
|
||
|
namespace v8 {
|
||
|
namespace internal {
|
||
|
|
||
|
namespace {
|
||
|
|
||
|
std::vector<PropertyDetails> make_details() {
|
||
|
std::vector<PropertyDetails> 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<PropertyAttributes>(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<int>::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
|