FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
WebKit/Source/JavaScriptCore/API/ObjcRuntimeExtras.h at main · WebKit/WebKit · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
WebKit
/
WebKit
Public
Notifications
You must be signed in to change notification settings
Fork
2.1k
Star
10.1k
Code
Pull requests
2.6k
Actions
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
WebKit
/
Source
/
JavaScriptCore
/
API
/
ObjcRuntimeExtras.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
238 lines (209 loc) · 8.15 KB
Breadcrumbs
WebKit
/
Source
/
JavaScriptCore
/
API
/
ObjcRuntimeExtras.h
Copy path
File metadata and controls
238 lines (209 loc) · 8.15 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
/*
* Copyright (C) 2013, 2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#
import
<
memory
>
#
import
<
objc/Protocol.h
>
#
import
<
objc/runtime.h
>
#
import
<
wtf/HashSet.h
>
#
import
<
wtf/ObjCRuntimeExtras.h
>
#
import
<
wtf/SystemFree.h
>
#
import
<
wtf/Vector.h
>
#
import
<
wtf/text/CString.h
>
WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN
inline
bool
protocolImplementsProtocol
(Protocol *candidate, Protocol *target)
{
auto
protocolProtocols =
protocol_copyProtocolListSpan
(candidate);
for
(RetainPtr protocolProtocol : protocolProtocols.
span
()) {
if
(
protocol_isEqual
(protocolProtocol.
get
(), target))
return
true
;
}
return
false
;
}
inline
void
forEachProtocolImplementingProtocol
(
Class
cls, Protocol *target,
void
(^callback)(Protocol *,
bool
& stop))
{
ASSERT
(cls);
ASSERT
(target);
Vector<Protocol*> worklist;
UncheckedKeyHashSet<
void
*> visited;
//
Initially fill the worklist with the Class's protocols.
{
auto
protocols =
class_copyProtocolListSpan
(cls);
worklist.
append
(protocols.
span
());
}
bool
stop =
false
;
while
(!worklist.
isEmpty
()) {
RetainPtr protocol = worklist.
last
();
worklist.
removeLast
();
//
Are we encountering this Protocol for the first time?
if
(!visited.
add
((__bridge
void
*)protocol.
get
()).
isNewEntry
)
continue
;
//
If it implements the protocol, make the callback.
if
(
protocolImplementsProtocol
(protocol.
get
(), target)) {
callback
(protocol.
get
(), stop);
if
(stop)
break
;
}
//
Add incorporated protocols to the worklist.
worklist.
append
(
protocol_copyProtocolListSpan
(protocol.
get
()).
span
());
}
}
inline
void
forEachMethodInClass
(
Class
cls,
void
(^callback)(
Method
))
{
auto
methods =
class_copyMethodListSpan
(cls);
for
(
auto
& method : methods.
span
())
callback
(method);
}
inline
void
forEachMethodInProtocol
(Protocol *protocol,
BOOL
isRequiredMethod,
BOOL
isInstanceMethod,
void
(^callback)(
SEL
,
const
char
*))
{
auto
methods =
protocol_copyMethodDescriptionListSpan
(protocol, isRequiredMethod, isInstanceMethod);
for
(
auto
& method : methods.
span
())
callback
(method.
name
, method.
types
);
}
inline
void
forEachPropertyInProtocol
(Protocol *protocol,
void
(^callback)(
objc_property_t
))
{
auto
properties =
protocol_copyPropertyListSpan
(protocol);
for
(
auto
& property : properties.
span
())
callback
(property);
}
template<
char
open,
char
close>
void
skipPair
(
const
char
*& position)
{
size_t
count =
1
;
do
{
char
c = *position++;
if
(!c)
@throw
[
NSException
exceptionWithName:
NSInternalInconsistencyException
reason:
@"
Malformed type encoding
"
userInfo:
nil
];
if
(c == open)
++count;
else
if
(c == close)
--count;
}
while
(count);
}
class StringRange {
WTF_MAKE_NONCOPYABLE
(StringRange);
public:
StringRange
(
const
char
* begin,
const
char
* end)
:
m_string
(std::span { begin, end })
{ }
operator
const
char
*()
const
LIFETIME_BOUND
{
return
m_string.
data
(); }
const
char
*
get
()
const
LIFETIME_BOUND
{
return
m_string.
data
(); }
private:
CString m_string;
};
class StructBuffer {
WTF_MAKE_NONCOPYABLE
(StructBuffer);
public:
StructBuffer
(
const
char
* encodedType)
{
NSUInteger
size, alignment;
NSGetSizeAndAlignment
(encodedType, &size, &alignment);
m_buffer =
fastAlignedMalloc
(alignment, size);
}
~
StructBuffer
() {
fastFree
(m_buffer); }
operator
void
*()
const
{
return
m_buffer; }
private:
void
* m_buffer;
};
template<typename DelegateType>
typename DelegateType::ResultType
parseObjCType
(
const
char
*& position)
{
ASSERT
(*position);
switch
(*position++) {
case
'
c
'
:
return
DelegateType::template typeInteger<
char
>();
case
'
i
'
:
return
DelegateType::template typeInteger<
int
>();
case
'
s
'
:
return
DelegateType::template typeInteger<
short
>();
case
'
l
'
:
return
DelegateType::template typeInteger<
long
>();
case
'
q
'
:
return
DelegateType::template typeDouble<
long
long
>();
case
'
C
'
:
return
DelegateType::template typeInteger<
unsigned
char
>();
case
'
I
'
:
return
DelegateType::template typeInteger<
unsigned
>();
case
'
S
'
:
return
DelegateType::template typeInteger<
unsigned
short
>();
case
'
L
'
:
return
DelegateType::template typeInteger<
unsigned
long
>();
case
'
Q
'
:
return
DelegateType::template typeDouble<
unsigned
long
long
>();
case
'
f
'
:
return
DelegateType::template typeDouble<
float
>();
case
'
d
'
:
return
DelegateType::template typeDouble<
double
>();
case
'
B
'
:
return
DelegateType::typeBool
();
case
'
v
'
:
return
DelegateType::typeVoid
();
case
'
@
'
: {
//
An object (whether statically typed or typed id)
if
(position[
0
] ==
'
?
'
&& position[
1
] ==
'
<
'
) {
position +=
2
;
const
char
* begin = position;
skipPair<
'
<
'
,
'
>
'
>(position);
return
DelegateType::typeBlock
(begin, position -
1
);
}
if
(*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
();
}
case
'
{
'
: {
//
{name=type...} A structure
const
char
* begin = position -
1
;
skipPair<
'
{
'
,
'
}
'
>(position);
return
DelegateType::typeStruct
(begin, position);
}
//
NOT supporting C strings, arrays, pointers, unions, bitfields, function pointers.
case
'
*
'
:
//
A character string (char *)
case
'
[
'
:
//
[array type] An array
case
'
(
'
:
//
(name=type...) A union
case
'
b
'
:
//
bnum A bit field of num bits
case
'
^
'
:
//
^type A pointer to type
case
'
?
'
:
//
An unknown type (among other things, this code is used for function pointers)
//
NOT supporting Objective-C Class, SEL
case
'
#
'
:
//
A class object (Class)
case
'
:
'
:
//
A method selector (SEL)
default
:
return
nil
;
}
}
extern
"
C
"
{
//
Forward declare some Objective-C runtime internal methods that are not API.
const
char
*
_protocol_getMethodTypeEncoding
(Protocol *,
SEL
,
BOOL
isRequiredMethod,
BOOL
isInstanceMethod);
bool
_Block_has_signature
(
void
*);
const
char
*
_Block_signature
(
void
*);
}
WTF_ALLOW_UNSAFE_BUFFER_USAGE_END
Back
|
FazBrowse Home
|
New Git URL