Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parse extended method types for protocols #30

Merged
merged 2 commits into from Sep 19, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 27 additions & 4 deletions Source/CDObjectiveC2Processor.m
Expand Up @@ -80,6 +80,19 @@ - (CDOCProtocol *)protocolAtAddress:(uint64_t)address;
objc2Protocol.optionalInstanceMethods = [cursor readPtr];
objc2Protocol.optionalClassMethods = [cursor readPtr];
objc2Protocol.instanceProperties = [cursor readPtr];
objc2Protocol.size = [cursor readInt32];
objc2Protocol.flags = [cursor readInt32];
objc2Protocol.extendedMethodTypes = 0;

CDMachOFileDataCursor *extendedMethodTypesCursor = nil;
BOOL hasExtendedMethodTypesField = objc2Protocol.size > 8 * [self.machOFile ptrSize] + 2 * sizeof(uint32_t);
if (hasExtendedMethodTypesField) {
objc2Protocol.extendedMethodTypes = [cursor readPtr];
if (objc2Protocol.extendedMethodTypes != 0) {
extendedMethodTypesCursor = [[CDMachOFileDataCursor alloc] initWithFile:self.machOFile address:objc2Protocol.extendedMethodTypes];
NSParameterAssert([extendedMethodTypesCursor offset] != 0);
}
}

//NSLog(@"----------------------------------------");
//NSLog(@"%016lx %016lx %016lx %016lx", objc2Protocol.isa, objc2Protocol.name, objc2Protocol.protocols, objc2Protocol.instanceMethods);
Expand All @@ -102,16 +115,16 @@ - (CDOCProtocol *)protocolAtAddress:(uint64_t)address;
}
}

for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.instanceMethods])
for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.instanceMethods extendedMethodTypesCursor:extendedMethodTypesCursor])
[protocol addInstanceMethod:method];

for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.classMethods])
for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.classMethods extendedMethodTypesCursor:extendedMethodTypesCursor])
[protocol addClassMethod:method];

for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.optionalInstanceMethods])
for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.optionalInstanceMethods extendedMethodTypesCursor:extendedMethodTypesCursor])
[protocol addOptionalInstanceMethod:method];

for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.optionalClassMethods])
for (CDOCMethod *method in [self loadMethodsAtAddress:objc2Protocol.optionalClassMethods extendedMethodTypesCursor:extendedMethodTypesCursor])
[protocol addOptionalClassMethod:method];

for (CDOCProperty *property in [self loadPropertiesAtAddress:objc2Protocol.instanceProperties])
Expand Down Expand Up @@ -343,6 +356,11 @@ - (NSArray *)loadMethodsOfMetaClassAtAddress:(uint64_t)address;
}

- (NSArray *)loadMethodsAtAddress:(uint64_t)address;
{
return [self loadMethodsAtAddress:address extendedMethodTypesCursor:nil];
}

- (NSArray *)loadMethodsAtAddress:(uint64_t)address extendedMethodTypesCursor:(CDMachOFileDataCursor *)extendedMethodTypesCursor;
{
NSMutableArray *methods = [NSMutableArray array];

Expand All @@ -366,6 +384,11 @@ - (NSArray *)loadMethodsAtAddress:(uint64_t)address;
NSString *name = [self.machOFile stringAtAddress:objc2Method.name];
NSString *types = [self.machOFile stringAtAddress:objc2Method.types];

if (extendedMethodTypesCursor) {
uint64_t extendedMethodTypes = [extendedMethodTypesCursor readPtr];
types = [self.machOFile stringAtAddress:extendedMethodTypes];
}

//NSLog(@"%3u: %016lx %016lx %016lx", index, objc2Method.name, objc2Method.types, objc2Method.imp);
//NSLog(@"name: %@", name);
//NSLog(@"types: %@", types);
Expand Down
3 changes: 3 additions & 0 deletions Source/cd_objc2.h
Expand Up @@ -66,6 +66,9 @@ struct cd_objc2_protocol {
uint64_t optionalInstanceMethods;
uint64_t optionalClassMethods;
uint64_t instanceProperties; // So far, always 0
uint32_t size; // sizeof(cd_objc2_protocol)
uint32_t flags;
uint64_t extendedMethodTypes;
};

struct cd_objc2_category {
Expand Down