summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/API/ObjcRuntimeExtras.h
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/API/ObjcRuntimeExtras.h
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/API/ObjcRuntimeExtras.h')
-rw-r--r--Source/JavaScriptCore/API/ObjcRuntimeExtras.h19
1 files changed, 15 insertions, 4 deletions
diff --git a/Source/JavaScriptCore/API/ObjcRuntimeExtras.h b/Source/JavaScriptCore/API/ObjcRuntimeExtras.h
index 48c112093..128df5c90 100644
--- a/Source/JavaScriptCore/API/ObjcRuntimeExtras.h
+++ b/Source/JavaScriptCore/API/ObjcRuntimeExtras.h
@@ -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();