Skip to content

Commit

Permalink
Track generated classes via a class name prefix
Browse files Browse the repository at this point in the history
Prefix all generated class names with "RLM:" and just check for that
rather than maintaining a map of them. Speeds up accessor class creation a bit.
  • Loading branch information
tgoyne committed Feb 17, 2017
1 parent 79a76bf commit 356166a
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 25 deletions.
3 changes: 0 additions & 3 deletions Realm/RLMAccessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@ NS_ASSUME_NONNULL_BEGIN
Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema, const char *name);
Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema);

// Check if a given class is a generated accessor class
bool RLMIsGeneratedClass(Class cls);

//
// Dynamic getters/setters
//
Expand Down
19 changes: 3 additions & 16 deletions Realm/RLMAccessor.mm
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,8 @@ void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema *schema)
cls = parent;
parent = class_getSuperclass(cls);
}
if (RLMIsGeneratedClass(cls)) {
const char *prefix = "RLM:";
if (strncmp(prefix, class_getName(cls), strlen(prefix)) == 0) {
return schema;
}

Expand All @@ -601,19 +602,6 @@ void RLMReplaceSharedSchemaMethod(Class accessorClass, RLMObjectSchema *schema)
class_addMethod(metaClass, @selector(sharedSchema), imp, "@@:");
}

static NSMutableSet *s_generatedClasses = [NSMutableSet new];
static void RLMMarkClassAsGenerated(Class cls) {
@synchronized (s_generatedClasses) {
[s_generatedClasses addObject:cls];
}
}

bool RLMIsGeneratedClass(Class cls) {
@synchronized (s_generatedClasses) {
return [s_generatedClasses containsObject:cls];
}
}

static Class RLMCreateAccessorClass(Class objectClass,
RLMObjectSchema *schema,
const char *accessorClassName,
Expand Down Expand Up @@ -654,7 +642,6 @@ static Class RLMCreateAccessorClass(Class objectClass,
}
}

RLMMarkClassAsGenerated(accClass);
objc_registerClassPair(accClass);

return accClass;
Expand All @@ -665,7 +652,7 @@ Class RLMManagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *
}

Class RLMUnmanagedAccessorClassForObjectClass(Class objectClass, RLMObjectSchema *schema) {
return RLMCreateAccessorClass(objectClass, schema, [@"RLMUnmanaged_" stringByAppendingString:schema.className].UTF8String,
return RLMCreateAccessorClass(objectClass, schema, [@"RLM:Unmanaged " stringByAppendingString:schema.className].UTF8String,
RLMAccessorUnmanagedGetter, RLMAccessorUnmanagedSetter);
}

Expand Down
2 changes: 1 addition & 1 deletion Realm/RLMObjectBase.mm
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath {

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
const char *className = class_getName(self);
const char accessorClassPrefix[] = "RLMAccessor_";
const char accessorClassPrefix[] = "RLM:Managed";
if (!strncmp(className, accessorClassPrefix, sizeof(accessorClassPrefix) - 1)) {
if (self.sharedSchema[key]) {
return NO;
Expand Down
6 changes: 3 additions & 3 deletions Realm/RLMObjectStore.mm
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@
using namespace realm;

void RLMRealmCreateAccessors(RLMSchema *schema) {
const size_t bufferSize = sizeof("RLMAccessor__") // includes null terminator
const size_t bufferSize = sizeof("RLM:Managed ") // includes null terminator
+ std::numeric_limits<unsigned long long>::digits10
+ realm::Group::max_table_name_length;

char className[bufferSize] = "RLMAccessor_";
char className[bufferSize] = "RLM:Managed ";
char *const start = className + strlen(className);

for (RLMObjectSchema *objectSchema in schema.objectSchema) {
Expand All @@ -54,7 +54,7 @@ void RLMRealmCreateAccessors(RLMSchema *schema) {
}

static unsigned long long count = 0;
sprintf(start, "%llu_%s", count++, objectSchema.className.UTF8String);
sprintf(start, "%llu %s", count++, objectSchema.className.UTF8String);
objectSchema.accessorClass = RLMManagedAccessorClassForObjectClass(objectSchema.objectClass, objectSchema, className);
}
}
Expand Down
7 changes: 5 additions & 2 deletions Realm/RLMSchema.mm
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,15 @@ @implementation RLMSchema {
static void RLMRegisterClassLocalNames(Class *classes, NSUInteger count) {
for (NSUInteger i = 0; i < count; i++) {
Class cls = classes[i];

if (!RLMIsObjectSubclass(cls) || RLMIsGeneratedClass(cls)) {
if (!RLMIsObjectSubclass(cls)) {
continue;
}

NSString *className = NSStringFromClass(cls);
if ([className hasPrefix:@"RLM:"]) {
continue;
}

if ([RLMSwiftSupport isSwiftClassName:className]) {
className = [RLMSwiftSupport demangleClassName:className];
}
Expand Down

0 comments on commit 356166a

Please sign in to comment.