From 40624a085c03fb6d41834885d41f7158ab72950e Mon Sep 17 00:00:00 2001 From: Aleksandr Urakov Date: Tue, 5 Feb 2019 09:14:36 +0000 Subject: [Expressions] Add support of expressions evaluation in some object's context Summary: This patch adds support of expression evaluation in a context of some object. Consider the following example: ``` struct S { int a = 11; int b = 12; }; int main() { S s; int a = 1; int b = 2; // We have stopped here return 0; } ``` This patch allows to do something like that: ``` lldb.frame.FindVariable("s").EvaluateExpression("a + b") ``` and the result will be `33` (not `3`) because fields `a` and `b` of `s` will be used (not locals `a` and `b`). This is achieved by replacing of `this` type and object for the expression. This has some limitations: an expression can be evaluated only for values located in the debuggee process memory (they must have an address of `eAddressTypeLoad` type). Reviewers: teemperor, clayborg, jingham, zturner, labath, davide, spyffe, serge-sans-paille Reviewed By: jingham Subscribers: abidh, lldb-commits, leonid.mashinskiy Tags: #lldb Differential Revision: https://reviews.llvm.org/D55318 llvm-svn: 353149 --- .../expression_command/context-object/main.cpp | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lldb/packages/Python/lldbsuite/test/expression_command/context-object/main.cpp (limited to 'lldb/packages/Python/lldbsuite/test/expression_command/context-object/main.cpp') diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/context-object/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/context-object/main.cpp new file mode 100644 index 00000000000..098b6089fce --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/expression_command/context-object/main.cpp @@ -0,0 +1,46 @@ +namespace cpp_namespace { + struct CppStruct { + int field = 1111; + + int function() { + return 2222; + } + }; + + union CppUnion { + char field_char; + short field_short; + int field_int; + }; + + CppStruct GetCppStruct() { + return CppStruct(); + } + + CppStruct global; + + CppStruct *GetCppStructPtr() { + return &global; + } +} + +int global = 3333; + +int main() +{ + cpp_namespace::CppStruct cpp_struct = cpp_namespace::GetCppStruct(); + cpp_struct.function(); + + int field = 4444; + + cpp_namespace::CppUnion cpp_union; + cpp_union.field_int = 5555; + + int cpp_scalar = 6666; + + cpp_namespace::CppStruct cpp_array[16]; + + cpp_namespace::CppStruct *cpp_pointer = cpp_namespace::GetCppStructPtr(); + + return 0; // Break here +} -- cgit v1.2.3