FLEXIvar.m 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. //
  2. // FLEXIvar.m
  3. // FLEX
  4. //
  5. // Derived from MirrorKit.
  6. // Created by Tanner on 6/30/15.
  7. // Copyright (c) 2015 Tanner Bennett. All rights reserved.
  8. //
  9. #import "FLEXIvar.h"
  10. #import "FLEXRuntimeUtility.h"
  11. @interface FLEXIvar () {
  12. NSString *_flex_description;
  13. }
  14. @end
  15. @implementation FLEXIvar
  16. #pragma mark Initializers
  17. - (id)init {
  18. [NSException
  19. raise:NSInternalInconsistencyException
  20. format:@"Class instance should not be created with -init"
  21. ];
  22. return nil;
  23. }
  24. + (instancetype)ivar:(Ivar)ivar {
  25. return [[self alloc] initWithIvar:ivar];
  26. }
  27. + (instancetype)named:(NSString *)name onClass:(Class)cls {
  28. Ivar ivar = class_getInstanceVariable(cls, name.UTF8String);
  29. return [self ivar:ivar];
  30. }
  31. - (id)initWithIvar:(Ivar)ivar {
  32. NSParameterAssert(ivar);
  33. self = [super init];
  34. if (self) {
  35. _objc_ivar = ivar;
  36. [self examine];
  37. }
  38. return self;
  39. }
  40. #pragma mark Other
  41. - (NSString *)description {
  42. if (!_flex_description) {
  43. NSString *readableType = [FLEXRuntimeUtility readableTypeForEncoding:self.typeEncoding];
  44. _flex_description = [FLEXRuntimeUtility appendName:self.name toType:readableType];
  45. }
  46. return _flex_description;
  47. }
  48. - (NSString *)debugDescription {
  49. return [NSString stringWithFormat:@"<%@ name=%@, encoding=%@, offset=%ld>",
  50. NSStringFromClass(self.class), self.name, self.typeEncoding, (long)self.offset];
  51. }
  52. - (void)examine {
  53. _name = @(ivar_getName(self.objc_ivar));
  54. _typeEncoding = @(ivar_getTypeEncoding(self.objc_ivar));
  55. _type = (FLEXTypeEncoding)[_typeEncoding characterAtIndex:0];
  56. _offset = ivar_getOffset(self.objc_ivar);
  57. }
  58. - (id)getValue:(id)target {
  59. return [FLEXRuntimeUtility valueForIvar:self.objc_ivar onObject:target];
  60. }
  61. - (id)getPotentiallyUnboxedValue:(id)target {
  62. return [FLEXRuntimeUtility
  63. potentiallyUnwrapBoxedPointer:[self getValue:target]
  64. type:self.typeEncoding.UTF8String
  65. ];
  66. }
  67. @end