@@ -320,7 +320,9 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
320
320
// These are the "fixed" return classes, but some properties will require
321
321
// looking up the return class instead (because it is a subclass of
322
322
// GTLRObject).
323
+ const char *returnClassName;
323
324
Class returnClass;
325
+ BOOL extractReturnClass;
324
326
325
327
} GTLRDynamicImpInfo;
326
328
@@ -345,18 +347,6 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
345
347
// T@"GTLRLink",D
346
348
// T@"NSArray",D
347
349
348
- // References to classes that we can put in static structures.
349
- extern const struct {} GTLRNSArrayClass __asm__ (" _OBJC_CLASS_$_NSArray" );
350
- extern const struct {} GTLRNSObjectClass __asm__ (" _OBJC_CLASS_$_NSObject" );
351
- extern const struct {} GTLRNSStringClass __asm__ (" _OBJC_CLASS_$_NSString" );
352
- extern const struct {} GTLRNSNumberClass __asm__ (" _OBJC_CLASS_$_NSNumber" );
353
- extern const struct {} GTLRDateTimeClass
354
- __asm__ (" _OBJC_CLASS_$_" GTLR_CLASSNAME_CSTR (GTLRDateTime));
355
- extern const struct {} GTLRDurationClass
356
- __asm__ (" _OBJC_CLASS_$_" GTLR_CLASSNAME_CSTR (GTLRDuration));
357
-
358
- // Denotes that the class is dynamic and must be resolved.
359
- const Class kLookupClass = (__bridge Class )(void *)0x1 ;
360
350
361
351
static GTLRDynamicImpInfo kImplInfo [] = {
362
352
#if !defined(__LP64__) || !__LP64__
@@ -365,59 +355,67 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
365
355
GTLRPropertyTypeInt32,
366
356
" v@:i" ,
367
357
" i@:" ,
368
- Nil ,
358
+ nil , nil ,
359
+ NO
369
360
},
370
361
{ // NSUInteger on 32bit
371
362
" TI" ,
372
363
GTLRPropertyTypeUInt32,
373
364
" v@:I" ,
374
365
" I@:" ,
375
- Nil ,
366
+ nil , nil ,
367
+ NO
376
368
},
377
369
#endif
378
370
{ // NSInteger on 64bit, long long on 32bit and 64bit.
379
371
" Tq" ,
380
372
GTLRPropertyTypeLongLong,
381
373
" v@:q" ,
382
374
" q@:" ,
383
- Nil ,
375
+ nil , nil ,
376
+ NO
384
377
},
385
378
{ // NSUInteger on 64bit, long long on 32bit and 64bit.
386
379
" TQ" ,
387
380
GTLRPropertyTypeULongLong,
388
381
" v@:Q" ,
389
382
" Q@:" ,
390
- Nil ,
383
+ nil , nil ,
384
+ NO
391
385
},
392
386
{ // float
393
387
" Tf" ,
394
388
GTLRPropertyTypeFloat,
395
389
" v@:f" ,
396
390
" f@:" ,
397
- Nil ,
391
+ nil , nil ,
392
+ NO
398
393
},
399
394
{ // double
400
395
" Td" ,
401
396
GTLRPropertyTypeDouble,
402
397
" v@:d" ,
403
398
" d@:" ,
404
- Nil ,
399
+ nil , nil ,
400
+ NO
405
401
},
406
402
#if defined(OBJC_BOOL_IS_BOOL) && OBJC_BOOL_IS_BOOL
407
403
{ // BOOL as bool
408
404
" TB" ,
409
405
GTLRPropertyTypeBool,
410
406
" v@:B" ,
411
407
" B@:" ,
412
- Nil ,
408
+ nil , nil ,
409
+ NO
413
410
},
414
411
#elif defined(OBJC_BOOL_IS_CHAR) && OBJC_BOOL_IS_CHAR
415
412
{ // BOOL as char
416
413
" Tc" ,
417
414
GTLRPropertyTypeBool,
418
415
" v@:c" ,
419
416
" c@:" ,
420
- Nil ,
417
+ nil , nil ,
418
+ NO
421
419
},
422
420
#else
423
421
#error unknown definition for ObjC BOOL type
@@ -427,52 +425,73 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
427
425
GTLRPropertyTypeNSString,
428
426
" v@:@" ,
429
427
" @@:" ,
430
- (__bridge Class )>LRNSStringClass,
428
+ " NSString" , nil ,
429
+ NO
431
430
},
432
431
{ // NSNumber
433
432
" T@\" NSNumber\" " ,
434
433
GTLRPropertyTypeNSNumber,
435
434
" v@:@" ,
436
435
" @@:" ,
437
- (__bridge Class )>LRNSNumberClass,
436
+ " NSNumber" , nil ,
437
+ NO
438
438
},
439
439
{ // GTLRDateTime
440
440
" T@\" " GTLR_CLASSNAME_CSTR (GTLRDateTime) " \" " ,
441
441
GTLRPropertyTypeGTLRDateTime,
442
442
" v@:@" ,
443
443
" @@:" ,
444
- (__bridge Class )>LRNSNumberClass,
444
+ GTLR_CLASSNAME_CSTR (GTLRDateTime), nil ,
445
+ NO
445
446
},
446
447
{ // GTLRDuration
447
448
" T@\" " GTLR_CLASSNAME_CSTR (GTLRDuration) " \" " ,
448
449
GTLRPropertyTypeGTLRDuration,
449
450
" v@:@" ,
450
451
" @@:" ,
451
- (__bridge Class )>LRDurationClass,
452
+ GTLR_CLASSNAME_CSTR (GTLRDuration), nil ,
453
+ NO
452
454
},
453
455
{ // NSArray with type
454
456
" T@\" NSArray\" " ,
455
457
GTLRPropertyTypeNSArray,
456
458
" v@:@" ,
457
459
" @@:" ,
458
- (__bridge Class )>LRNSArrayClass,
460
+ " NSArray" , nil ,
461
+ NO
459
462
},
460
463
{ // id (any of the objects above)
461
464
" T@," ,
462
465
GTLRPropertyTypeNSObject,
463
466
" v@:@" ,
464
467
" @@:" ,
465
- (__bridge Class )>LRNSObjectClass,
468
+ " NSObject" , nil ,
469
+ NO
466
470
},
467
471
{ // GTLRObject - Last, cause it's a special case and prefix is general
468
472
" T@\" " ,
469
473
GTLRPropertyTypeGTLRObject,
470
474
" v@:@" ,
471
475
" @@:" ,
472
- kLookupClass ,
476
+ nil , nil ,
477
+ YES
473
478
},
474
479
};
475
480
481
+ static BOOL hasLookedUpClasses = NO ;
482
+ if (!hasLookedUpClasses) {
483
+ // Unfortunately, you can't put [NSString class] into the static structure,
484
+ // so this lookup has to be done at runtime.
485
+ hasLookedUpClasses = YES ;
486
+ for (uint32_t idx = 0 ; idx < sizeof (kImplInfo )/sizeof (kImplInfo [0 ]); ++idx) {
487
+ if (kImplInfo [idx].returnClassName ) {
488
+ kImplInfo [idx].returnClass = objc_getClass (kImplInfo [idx].returnClassName );
489
+ NSCAssert1 (kImplInfo [idx].returnClass != nil ,
490
+ @" GTLRRuntimeCommon: class lookup failed: %s " , kImplInfo [idx].returnClassName);
491
+ }
492
+ }
493
+ }
494
+
476
495
const char *attr = property_getAttributes (prop);
477
496
478
497
const char *dynamicMarker = strstr (attr, " ,D" );
@@ -502,7 +521,7 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
502
521
return NULL ;
503
522
}
504
523
505
- if (result->returnClass == kLookupClass && outReturnClass) {
524
+ if (result->extractReturnClass && outReturnClass) {
506
525
507
526
// add a null at the next quotation mark
508
527
char *attrCopy = strdup (attr);
@@ -513,7 +532,7 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
513
532
514
533
// Lookup the return class
515
534
*outReturnClass = objc_getClass (classNameStart);
516
- if (*outReturnClass == Nil ) {
535
+ if (*outReturnClass == nil ) {
517
536
GTLR_DEBUG_LOG (@" GTLRRuntimeCommon: did not find class with name \" %s \" "
518
537
@" for property \" %s \" with attributes \" %s \" " ,
519
538
classNameStart, property_getName (prop), attr);
0 commit comments