| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- //
- // FLEXIvar.m
- // FLEX
- //
- // Derived from MirrorKit.
- // Created by Tanner on 6/30/15.
- // Copyright (c) 2015 Tanner Bennett. All rights reserved.
- //
- #import "FLEXIvar.h"
- #import "FLEXRuntimeUtility.h"
- @interface FLEXIvar () {
- NSString *_flex_description;
- }
- @end
- @implementation FLEXIvar
- #pragma mark Initializers
- - (id)init {
- [NSException
- raise:NSInternalInconsistencyException
- format:@"Class instance should not be created with -init"
- ];
- return nil;
- }
- + (instancetype)ivar:(Ivar)ivar {
- return [[self alloc] initWithIvar:ivar];
- }
- + (instancetype)named:(NSString *)name onClass:(Class)cls {
- Ivar ivar = class_getInstanceVariable(cls, name.UTF8String);
- return [self ivar:ivar];
- }
- - (id)initWithIvar:(Ivar)ivar {
- NSParameterAssert(ivar);
-
- self = [super init];
- if (self) {
- _objc_ivar = ivar;
- [self examine];
- }
-
- return self;
- }
- #pragma mark Other
- - (NSString *)description {
- if (!_flex_description) {
- NSString *readableType = [FLEXRuntimeUtility readableTypeForEncoding:self.typeEncoding];
- _flex_description = [FLEXRuntimeUtility appendName:self.name toType:readableType];
- }
- return _flex_description;
- }
- - (NSString *)debugDescription {
- return [NSString stringWithFormat:@"<%@ name=%@, encoding=%@, offset=%ld>",
- NSStringFromClass(self.class), self.name, self.typeEncoding, (long)self.offset];
- }
- - (void)examine {
- _name = @(ivar_getName(self.objc_ivar));
- _typeEncoding = @(ivar_getTypeEncoding(self.objc_ivar));
- _type = (FLEXTypeEncoding)[_typeEncoding characterAtIndex:0];
- _offset = ivar_getOffset(self.objc_ivar);
- }
- - (id)getValue:(id)target {
- return [FLEXRuntimeUtility valueForIvar:self.objc_ivar onObject:target];
- }
- - (id)getPotentiallyUnboxedValue:(id)target {
- return [FLEXRuntimeUtility
- potentiallyUnwrapBoxedPointer:[self getValue:target]
- type:self.typeEncoding.UTF8String
- ];
- }
- @end
|