blob: 8902ce15e573ea4a75c504e28a1c5dcd7ae4b388 [file] [log] [blame]
// 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