blob: a58ce1cea61862e850508d66788e8d1a9980294d [file] [log] [blame]
// Copyright 2018 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_EXPR_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_EXPR_EXPR_H_
#include <optional>
#include "lib/fit/function.h"
#include "src/developer/debug/zxdb/expr/eval_callback.h"
#include "src/developer/debug/zxdb/expr/expr_value.h"
namespace zxdb {
class Err;
class EvalContext;
// Main entrypoint to evaluate an expression. This will parse the input, execute the result with the
// given context, and call the callback when complete.
//
// If follow_references is set, expressions that result in a reference will have the value of the
// referenced data computed. This is useful when the caller wants the result value of an expression
// but doesn't care about the exact type.
//
// The callback may get issued asynchronously in the future or it may get called synchronously in a
// reentrant fashion from this function.
void EvalExpression(const std::string& input, const fxl::RefPtr<EvalContext>& context,
bool follow_references, EvalCallback cb);
// Like EvalExpressions but evaluates a sequence of expressions, issuing the callback when they're
// all complete. The size order of the results in the callback vector will correspond to the inputs.
void EvalExpressions(const std::vector<std::string>& inputs,
const fxl::RefPtr<EvalContext>& context, bool follow_references,
fit::callback<void(std::vector<ErrOrValue>)> cb);
// Determines the memory location that the given value refers to. It is used by the frontend to get
// the address of what the user meant when they typed an expression.
//
// If the result has a type with a known size, that size will be put into *size. Otherwise it will
// be untouched (for example, raw numbers will be converted to pointers that have no intrinsic
// size).
//
// TODO(bug 44074) support non-pointer values and take their address implicitly.
Err ValueToAddressAndSize(const fxl::RefPtr<EvalContext>& context, const ExprValue& value,
uint64_t* address, std::optional<uint32_t>* size);
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_EXPR_EXPR_H_