| // Copyright 2020 The Fuchsia 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/developer/debug/zxdb/expr/expr.h" | |
| #include <gtest/gtest.h> | |
| #include "src/developer/debug/zxdb/expr/mock_eval_context.h" | |
| #include "src/developer/debug/zxdb/symbols/modified_type.h" | |
| #include "src/developer/debug/zxdb/symbols/type_test_support.h" | |
| namespace zxdb { | |
| TEST(Expr, ValueToAddressAndSize) { | |
| auto eval_context = fxl::MakeRefCounted<MockEvalContext>(); | |
| // Ints are OK but have no size. | |
| uint64_t address = 0; | |
| std::optional<uint32_t> size; | |
| ASSERT_TRUE(ValueToAddressAndSize(eval_context, ExprValue(23), &address, &size).ok()); | |
| EXPECT_EQ(23u, address); | |
| EXPECT_EQ(std::nullopt, size); | |
| // Structure. | |
| auto uint64_type = MakeUint64Type(); | |
| auto collection = | |
| MakeCollectionType(DwarfTag::kStructureType, "Foo", {{"a", uint64_type}, {"b", uint64_type}}); | |
| std::vector<uint8_t> collection_data; | |
| collection_data.resize(collection->byte_size()); | |
| // Currently evaluating a structure is expected to fail. | |
| // TODO(bug 44074) support non-pointer values and take their address implicitly. | |
| address = 0; | |
| size = std::nullopt; | |
| Err err = ValueToAddressAndSize( | |
| eval_context, ExprValue(collection, collection_data, ExprValueSource(0x12345678)), &address, | |
| &size); | |
| ASSERT_TRUE(err.has_error()); | |
| EXPECT_EQ("Can't convert 'Foo' to an address.", err.msg()); | |
| EXPECT_EQ(0u, address); | |
| EXPECT_EQ(std::nullopt, size); | |
| // Pointer to a collection. | |
| auto collection_ptr = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kPointerType, collection); | |
| std::vector<uint8_t> ptr_data{8, 7, 6, 5, 4, 3, 2, 1}; | |
| address = 0; | |
| size = std::nullopt; | |
| err = ValueToAddressAndSize(eval_context, ExprValue(collection_ptr, ptr_data), &address, &size); | |
| ASSERT_TRUE(err.ok()); | |
| EXPECT_EQ(0x0102030405060708u, address); | |
| ASSERT_TRUE(size); | |
| EXPECT_EQ(collection->byte_size(), *size); | |
| } | |
| } // namespace zxdb |