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