]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - API/ObjcRuntimeExtras.h
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / API / ObjcRuntimeExtras.h
index 48c11209396befd29a5b382b41bdc8ed31a87389..128df5c905db610ad82c7392210cf91159b34108 100644 (file)
@@ -23,6 +23,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
+#import <objc/Protocol.h>
 #import <objc/runtime.h>
 #import <wtf/HashSet.h>
 #import <wtf/Vector.h>
@@ -163,7 +164,7 @@ typename DelegateType::ResultType parseObjCType(const char*& position)
     case 'l':
         return DelegateType::template typeInteger<long>();
     case 'q':
-        return DelegateType::template typeDouble<unsigned long long>();
+        return DelegateType::template typeDouble<long long>();
     case 'C':
         return DelegateType::template typeInteger<unsigned char>();
     case 'I':
@@ -192,9 +193,19 @@ typename DelegateType::ResultType parseObjCType(const char*& position)
         }
 
         if (*position == '"') {
-            const char* begin = ++position;
-            position = index(position, '"');
-            return DelegateType::typeOfClass(begin, position++);
+            const char* begin = position + 1;
+            const char* protocolPosition = strchr(begin, '<');
+            const char* endOfType = strchr(begin, '"');
+            position = endOfType + 1;
+
+            // There's no protocol involved in this type, so just handle the class name.
+            if (!protocolPosition || protocolPosition > endOfType)
+                return DelegateType::typeOfClass(begin, endOfType);
+            // We skipped the class name and went straight to the protocol, so this is an id type.
+            if (begin == protocolPosition)
+                return DelegateType::typeId();
+            // We have a class name with a protocol. For now, ignore the protocol.
+            return DelegateType::typeOfClass(begin, protocolPosition);
         }
 
         return DelegateType::typeId();