| // 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 |