Переглянути джерело

Fix crash from trying to read isa fields as Class pointers on arm64

The isa field is not guaranteed to be a Class pointer on arm64, even though the type encoding indicates that it's a Class pointer.
Ryan Olson 10 роки тому
батько
коміт
30f1fecc54
1 змінених файлів з 7 додано та 0 видалено
  1. 7 0
      Classes/Utility/FLEXRuntimeUtility.m

+ 7 - 0
Classes/Utility/FLEXRuntimeUtility.m

@@ -206,6 +206,13 @@ const unsigned int kFLEXNumberOfImplicitArgs = 2;
 {
     id value = nil;
     const char *type = ivar_getTypeEncoding(ivar);
+#ifdef __arm64__
+    // See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html
+    const char *name = ivar_getName(ivar);
+    if (type[0] == @encode(Class)[0] && strcmp(name, "isa") != 0) {
+        value = object_getClass(object);
+    } else
+#endif
     if (type[0] == @encode(id)[0] || type[0] == @encode(Class)[0]) {
         value = object_getIvar(object, ivar);
     } else {