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
48 lines
589 B
Objective-C
48 lines
589 B
Objective-C
#import <Foundation/Foundation.h>
|
|
|
|
@interface ObjcClass : NSObject {
|
|
int field;
|
|
}
|
|
|
|
@property int property;
|
|
|
|
+(ObjcClass*)createNew;
|
|
|
|
-(id)init;
|
|
|
|
-(int)method;
|
|
|
|
@end
|
|
|
|
@implementation ObjcClass
|
|
|
|
+(ObjcClass*)createNew {
|
|
return [ObjcClass new];
|
|
}
|
|
|
|
-(id)init {
|
|
self = [super init];
|
|
if (self) {
|
|
field = 1111;
|
|
_property = 2222;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
-(int)method {
|
|
return 3333;
|
|
}
|
|
|
|
@end
|
|
|
|
int main()
|
|
{
|
|
@autoreleasepool {
|
|
ObjcClass* objcClass = [ObjcClass new];
|
|
|
|
int field = 4444;
|
|
|
|
return 0; // Break here
|
|
}
|
|
}
|