blob: 6d6e8079d3f84297cfa02e83f173d641e14f612c [file] [log] [blame]
// Copyright 2022 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.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_EXPR_VARIABLE_DECL_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_EXPR_VARIABLE_DECL_H_
#include <string>
#include "src/developer/debug/zxdb/common/err_or.h"
#include "src/developer/debug/zxdb/expr/eval_callback.h"
#include "src/developer/debug/zxdb/expr/expr_language.h"
#include "src/developer/debug/zxdb/expr/vm_stream.h"
// This file contains the backend implementation for VariableDeclExprNode.
namespace zxdb {
class ExprNode;
// Stores the information for a variable declaration. Only some specific forms of "auto" are
// supported, see the .cc file for an overview.
struct VariableDeclTypeInfo {
std::string ToString() const;
enum Kind {
kCAuto, // auto
kCAutoRef, // auto&
kCAutoPtr, // auto*
kRustAuto, // Implicit type in a let statement.
kExplicit, // Explicitly-given type name.
};
Kind kind = kCAuto;
// When the type is kExplicit, this is the type requested.
fxl::RefPtr<Type> concrete_type;
};
// Decodes any auto type specifiers for the variable declaration of the given type.
ErrOr<VariableDeclTypeInfo> GetVariableDeclTypeInfo(ExprLanguage lang,
fxl::RefPtr<Type> concrete_type);
// Emits bytecode to the given stream to handle the following constructs:
//
// int i; (C, null init_expr)
// int i = 5 * something; (C, init_expr)
// let i: i32; (Rust, explicit type with no init_expr).
// let i = 99; (Rust, init_expr with null type).
//
// Since this function does not take an EvalContext the input type must be concrete if it is
// supplied. It may be null to indicate "auto" (takes the type from the init expression).
void EmitVariableInitializerOps(const VariableDeclTypeInfo& decl_info, uint32_t local_slot,
fxl::RefPtr<ExprNode> init_expr, VmStream& stream);
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_EXPR_VARIABLE_DECL_H_