diff options
Diffstat (limited to 'deps/v8/test/unittests/wasm/struct-types-unittest.cc')
-rw-r--r-- | deps/v8/test/unittests/wasm/struct-types-unittest.cc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/wasm/struct-types-unittest.cc b/deps/v8/test/unittests/wasm/struct-types-unittest.cc new file mode 100644 index 0000000000..3ddf8b84f7 --- /dev/null +++ b/deps/v8/test/unittests/wasm/struct-types-unittest.cc @@ -0,0 +1,70 @@ +// Copyright 2022 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 "src/wasm/struct-types.h" + +#include "test/unittests/test-utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace v8::internal::wasm { +namespace struct_types_unittest { + +class StructTypesTest : public TestWithZone {}; + +TEST_F(StructTypesTest, Empty) { + StructType::Builder builder(this->zone(), 0); + StructType* type = builder.Build(); + EXPECT_EQ(0u, type->total_fields_size()); +} + +TEST_F(StructTypesTest, OneField) { + StructType::Builder builder(this->zone(), 1); + builder.AddField(kWasmI32, true); + StructType* type = builder.Build(); + uint32_t expected = std::max(kUInt32Size, kTaggedSize); + EXPECT_EQ(expected, type->total_fields_size()); + EXPECT_EQ(0u, type->field_offset(0)); +} + +TEST_F(StructTypesTest, Packing) { + StructType::Builder builder(this->zone(), 5); + builder.AddField(kWasmI64, true); + builder.AddField(kWasmI8, true); + builder.AddField(kWasmI32, true); + builder.AddField(kWasmI16, true); + builder.AddField(kWasmI8, true); + StructType* type = builder.Build(); + EXPECT_EQ(16u, type->total_fields_size()); + EXPECT_EQ(0u, type->field_offset(0)); + EXPECT_EQ(8u, type->field_offset(1)); + EXPECT_EQ(12u, type->field_offset(2)); + EXPECT_EQ(10u, type->field_offset(3)); + EXPECT_EQ(9u, type->field_offset(4)); +} + +TEST_F(StructTypesTest, CopyingOffsets) { + StructType::Builder builder(this->zone(), 5); + builder.AddField(kWasmI64, true); + builder.AddField(kWasmI8, true); + builder.AddField(kWasmI32, true); + builder.AddField(kWasmI16, true); + builder.AddField(kWasmI8, true); + StructType* type = builder.Build(); + + StructType::Builder copy_builder(this->zone(), type->field_count()); + for (uint32_t i = 0; i < type->field_count(); i++) { + copy_builder.AddField(type->field(i), type->mutability(i), + type->field_offset(i)); + } + copy_builder.set_total_fields_size(type->total_fields_size()); + + StructType* copy = copy_builder.Build(); + for (uint32_t i = 0; i < type->field_count(); i++) { + EXPECT_EQ(type->field_offset(i), copy->field_offset(i)); + } + EXPECT_EQ(type->total_fields_size(), copy->total_fields_size()); +} + +} // namespace struct_types_unittest +} // namespace v8::internal::wasm |