Skip to content

Commit ab04ea1

Browse files
committed
Revert "Optimize class lookup"
This reverts commit 1de9728. Looks like the asm tick doesn't fly with bitcode. Fixes #322
1 parent 5f02dfd commit ab04ea1

File tree

1 file changed

+48
-29
lines changed

1 file changed

+48
-29
lines changed

Source/Objects/GTLRRuntimeCommon.m

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,9 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
320320
// These are the "fixed" return classes, but some properties will require
321321
// looking up the return class instead (because it is a subclass of
322322
// GTLRObject).
323+
const char *returnClassName;
323324
Class returnClass;
325+
BOOL extractReturnClass;
324326

325327
} GTLRDynamicImpInfo;
326328

@@ -345,18 +347,6 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
345347
// T@"GTLRLink",D
346348
// T@"NSArray",D
347349

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;
360350

361351
static GTLRDynamicImpInfo kImplInfo[] = {
362352
#if !defined(__LP64__) || !__LP64__
@@ -365,59 +355,67 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
365355
GTLRPropertyTypeInt32,
366356
"v@:i",
367357
"i@:",
368-
Nil,
358+
nil, nil,
359+
NO
369360
},
370361
{ // NSUInteger on 32bit
371362
"TI",
372363
GTLRPropertyTypeUInt32,
373364
"v@:I",
374365
"I@:",
375-
Nil,
366+
nil, nil,
367+
NO
376368
},
377369
#endif
378370
{ // NSInteger on 64bit, long long on 32bit and 64bit.
379371
"Tq",
380372
GTLRPropertyTypeLongLong,
381373
"v@:q",
382374
"q@:",
383-
Nil,
375+
nil, nil,
376+
NO
384377
},
385378
{ // NSUInteger on 64bit, long long on 32bit and 64bit.
386379
"TQ",
387380
GTLRPropertyTypeULongLong,
388381
"v@:Q",
389382
"Q@:",
390-
Nil,
383+
nil, nil,
384+
NO
391385
},
392386
{ // float
393387
"Tf",
394388
GTLRPropertyTypeFloat,
395389
"v@:f",
396390
"f@:",
397-
Nil,
391+
nil, nil,
392+
NO
398393
},
399394
{ // double
400395
"Td",
401396
GTLRPropertyTypeDouble,
402397
"v@:d",
403398
"d@:",
404-
Nil,
399+
nil, nil,
400+
NO
405401
},
406402
#if defined(OBJC_BOOL_IS_BOOL) && OBJC_BOOL_IS_BOOL
407403
{ // BOOL as bool
408404
"TB",
409405
GTLRPropertyTypeBool,
410406
"v@:B",
411407
"B@:",
412-
Nil,
408+
nil, nil,
409+
NO
413410
},
414411
#elif defined(OBJC_BOOL_IS_CHAR) && OBJC_BOOL_IS_CHAR
415412
{ // BOOL as char
416413
"Tc",
417414
GTLRPropertyTypeBool,
418415
"v@:c",
419416
"c@:",
420-
Nil,
417+
nil, nil,
418+
NO
421419
},
422420
#else
423421
#error unknown definition for ObjC BOOL type
@@ -427,52 +425,73 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
427425
GTLRPropertyTypeNSString,
428426
"v@:@",
429427
"@@:",
430-
(__bridge Class)&GTLRNSStringClass,
428+
"NSString", nil,
429+
NO
431430
},
432431
{ // NSNumber
433432
"T@\"NSNumber\"",
434433
GTLRPropertyTypeNSNumber,
435434
"v@:@",
436435
"@@:",
437-
(__bridge Class)&GTLRNSNumberClass,
436+
"NSNumber", nil,
437+
NO
438438
},
439439
{ // GTLRDateTime
440440
"T@\"" GTLR_CLASSNAME_CSTR(GTLRDateTime) "\"",
441441
GTLRPropertyTypeGTLRDateTime,
442442
"v@:@",
443443
"@@:",
444-
(__bridge Class)&GTLRNSNumberClass,
444+
GTLR_CLASSNAME_CSTR(GTLRDateTime), nil,
445+
NO
445446
},
446447
{ // GTLRDuration
447448
"T@\"" GTLR_CLASSNAME_CSTR(GTLRDuration) "\"",
448449
GTLRPropertyTypeGTLRDuration,
449450
"v@:@",
450451
"@@:",
451-
(__bridge Class)&GTLRDurationClass,
452+
GTLR_CLASSNAME_CSTR(GTLRDuration), nil,
453+
NO
452454
},
453455
{ // NSArray with type
454456
"T@\"NSArray\"",
455457
GTLRPropertyTypeNSArray,
456458
"v@:@",
457459
"@@:",
458-
(__bridge Class)&GTLRNSArrayClass,
460+
"NSArray", nil,
461+
NO
459462
},
460463
{ // id (any of the objects above)
461464
"T@,",
462465
GTLRPropertyTypeNSObject,
463466
"v@:@",
464467
"@@:",
465-
(__bridge Class)&GTLRNSObjectClass,
468+
"NSObject", nil,
469+
NO
466470
},
467471
{ // GTLRObject - Last, cause it's a special case and prefix is general
468472
"T@\"",
469473
GTLRPropertyTypeGTLRObject,
470474
"v@:@",
471475
"@@:",
472-
kLookupClass,
476+
nil, nil,
477+
YES
473478
},
474479
};
475480

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+
476495
const char *attr = property_getAttributes(prop);
477496

478497
const char *dynamicMarker = strstr(attr, ",D");
@@ -502,7 +521,7 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
502521
return NULL;
503522
}
504523

505-
if (result->returnClass == kLookupClass && outReturnClass) {
524+
if (result->extractReturnClass && outReturnClass) {
506525

507526
// add a null at the next quotation mark
508527
char *attrCopy = strdup(attr);
@@ -513,7 +532,7 @@ typedef NS_ENUM(NSUInteger, GTLRPropertyType) {
513532

514533
// Lookup the return class
515534
*outReturnClass = objc_getClass(classNameStart);
516-
if (*outReturnClass == Nil) {
535+
if (*outReturnClass == nil) {
517536
GTLR_DEBUG_LOG(@"GTLRRuntimeCommon: did not find class with name \"%s\" "
518537
@"for property \"%s\" with attributes \"%s\"",
519538
classNameStart, property_getName(prop), attr);

0 commit comments

Comments
 (0)