blob: cfb5444b07d25c6d04336c4957f31cf8fb2be3fd [file] [log] [blame]
// -*- mode: ObjC -*-
// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files.
// Copyright (C) 1997-2019 Steve Nygard.
#import "CDStructureInfo.h"
#import "CDType.h"
#import "CDTypeName.h"
// If it's used in a method, then it should be declared at the top. (name or typedef)
@implementation CDStructureInfo
{
CDType *_type;
NSUInteger _referenceCount;
BOOL _isUsedInMethod;
NSString *_typedefName;
}
- (id)initWithType:(CDType *)type;
{
if ((self = [super init])) {
_type = [type copy];
_referenceCount = 1;
_isUsedInMethod = NO;
_typedefName = nil;
}
return self;
}
#pragma mark - NSCopying
- (id)copyWithZone:(NSZone *)zone;
{
CDStructureInfo *copy = [[CDStructureInfo alloc] initWithType:self.type]; // type gets copied
copy.referenceCount = self.referenceCount;
copy.isUsedInMethod = self.isUsedInMethod;
copy.typedefName = self.typedefName;
return copy;
}
#pragma mark - Debugging
- (NSString *)description;
{
return [NSString stringWithFormat:@"<%@:%p> depth: %lu, refcount: %lu, isUsedInMethod: %u, type: %p",
NSStringFromClass([self class]), self,
self.type.structureDepth, self.referenceCount, self.isUsedInMethod, self.type];
}
- (NSString *)shortDescription;
{
return [NSString stringWithFormat:@"%lu %lu m?%u %@ %@", self.type.structureDepth, self.referenceCount, self.isUsedInMethod, self.type.bareTypeString, self.type.typeString];
}
#pragma mark -
- (void)addReferenceCount:(NSUInteger)count;
{
self.referenceCount += count;
}
// Do this before generating member names.
- (void)generateTypedefName:(NSString *)baseName;
{
NSString *digest = [self.type.typeString SHA1DigestString];
NSUInteger length = [digest length];
if (length > 8)
digest = [digest substringFromIndex:length - 8];
self.typedefName = [NSString stringWithFormat:@"%@%@", baseName, digest];
//NSLog(@"typedefName: %@", self.typedefName);
}
- (NSString *)name;
{
return [self.type.typeName description];
}
#pragma mark - Sorting
// Structure depth, reallyBareTypeString, typeString
- (NSComparisonResult)ascendingCompareByStructureDepth:(CDStructureInfo *)other;
{
NSUInteger thisDepth = self.type.structureDepth;
NSUInteger otherDepth = other.type.structureDepth;
if (thisDepth < otherDepth) return NSOrderedAscending;
if (thisDepth > otherDepth) return NSOrderedDescending;
NSString *str1 = self.type.reallyBareTypeString;
NSString *str2 = other.type.reallyBareTypeString;
NSComparisonResult result = [str1 compare:str2];
if (result == NSOrderedSame) {
str1 = self.type.typeString;
str2 = other.type.typeString;
result = [str1 compare:str2];
}
return result;
}
- (NSComparisonResult)descendingCompareByStructureDepth:(CDStructureInfo *)other;
{
NSUInteger thisDepth = self.type.structureDepth;
NSUInteger otherDepth = other.type.structureDepth;
if (thisDepth < otherDepth) return NSOrderedDescending;
if (thisDepth > otherDepth) return NSOrderedAscending;
NSString *str1 = self.type.reallyBareTypeString;
NSString *str2 = other.type.reallyBareTypeString;
NSComparisonResult result = -[str1 compare:str2];
if (result == NSOrderedSame) {
str1 = self.type.typeString;
str2 = other.type.typeString;
result = -[str1 compare:str2];
}
return result;
}
@end