Changeset 221723 in webkit for trunk/Source/JavaScriptCore/API/ObjcRuntimeExtras.h
- Timestamp:
- Sep 7, 2017, 1:14:30 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/API/ObjcRuntimeExtras.h
r218316 r221723 24 24 */ 25 25 26 #import <memory> 26 27 #import <objc/Protocol.h> 27 28 #import <objc/runtime.h> 28 29 #import <wtf/HashSet.h> 30 #import <wtf/SystemFree.h> 29 31 #import <wtf/Vector.h> 32 #import <wtf/text/CString.h> 33 34 template<typename T, typename U> 35 inline std::unique_ptr<T, WTF::SystemFree<T>> adoptSystem(U value) 36 { 37 return std::unique_ptr<T, WTF::SystemFree<T>>(value); 38 } 30 39 31 40 inline bool protocolImplementsProtocol(Protocol *candidate, Protocol *target) 32 41 { 33 42 unsigned protocolProtocolsCount; 34 Protocol ** protocolProtocols = protocol_copyProtocolList(candidate, &protocolProtocolsCount);43 auto protocolProtocols = adoptSystem<Protocol*[]>(protocol_copyProtocolList(candidate, &protocolProtocolsCount)); 35 44 for (unsigned i = 0; i < protocolProtocolsCount; ++i) { 36 if (protocol_isEqual(protocolProtocols[i], target)) { 37 free(protocolProtocols); 45 if (protocol_isEqual(protocolProtocols[i], target)) 38 46 return true; 39 } 40 } 41 free(protocolProtocols); 47 } 42 48 return false; 43 49 } … … 48 54 ASSERT(target); 49 55 50 Vector<Protocol 56 Vector<Protocol*> worklist; 51 57 HashSet<void*> visited; 52 58 53 59 // Initially fill the worklist with the Class's protocols. 54 unsigned protocolsCount; 55 Protocol ** protocols = class_copyProtocolList(cls, &protocolsCount); 56 worklist.append(protocols, protocolsCount); 57 free(protocols); 60 { 61 unsigned protocolsCount; 62 auto protocols = adoptSystem<Protocol*[]>(class_copyProtocolList(cls, &protocolsCount)); 63 worklist.append(protocols.get(), protocolsCount); 64 } 58 65 59 66 bool stop = false; … … 74 81 75 82 // Add incorporated protocols to the worklist. 76 protocols = protocol_copyProtocolList(protocol, &protocolsCount); 77 worklist.append(protocols, protocolsCount); 78 free(protocols); 83 { 84 unsigned protocolsCount; 85 auto protocols = adoptSystem<Protocol*[]>(protocol_copyProtocolList(protocol, &protocolsCount)); 86 worklist.append(protocols.get(), protocolsCount); 87 } 79 88 } 80 89 } … … 83 92 { 84 93 unsigned count; 85 Method* methods = class_copyMethodList(cls, &count);94 auto methods = adoptSystem<Method[]>(class_copyMethodList(cls, &count)); 86 95 for (unsigned i = 0; i < count; ++i) 87 96 callback(methods[i]); 88 free(methods);89 97 } 90 98 … … 92 100 { 93 101 unsigned count; 94 struct objc_method_description* methods = protocol_copyMethodDescriptionList(protocol, isRequiredMethod, isInstanceMethod, &count);102 auto methods = adoptSystem<objc_method_description[]>(protocol_copyMethodDescriptionList(protocol, isRequiredMethod, isInstanceMethod, &count)); 95 103 for (unsigned i = 0; i < count; ++i) 96 104 callback(methods[i].name, methods[i].types); 97 free(methods);98 105 } 99 106 … … 101 108 { 102 109 unsigned count; 103 objc_property_t* properties = protocol_copyPropertyList(protocol, &count);110 auto properties = adoptSystem<objc_property_t[]>(protocol_copyPropertyList(protocol, &count)); 104 111 for (unsigned i = 0; i < count; ++i) 105 112 callback(properties[i]); 106 free(properties);107 113 } 108 114 … … 125 131 WTF_MAKE_NONCOPYABLE(StringRange); 126 132 public: 127 StringRange(const char* begin, const char* end) : m_ptr(strndup(begin, end - begin)) { } 128 ~StringRange() { free(m_ptr); } 129 operator const char*() const { return m_ptr; } 130 const char* get() const { return m_ptr; } 133 StringRange(const char* begin, const char* end) 134 : m_string(begin, end - begin) 135 { } 136 operator const char*() const { return m_string.data(); } 137 const char* get() const { return m_string.data(); } 131 138 132 139 private: 133 char* m_ptr;140 CString m_string; 134 141 }; 135 142 … … 141 148 NSUInteger size, alignment; 142 149 NSGetSizeAndAlignment(encodedType, &size, &alignment); 143 --alignment; 144 m_allocation = static_cast<char*>(malloc(size + alignment)); 145 m_buffer = reinterpret_cast<char*>((reinterpret_cast<intptr_t>(m_allocation) + alignment) & ~alignment); 146 } 147 148 ~StructBuffer() { free(m_allocation); } 150 m_buffer = fastAlignedMalloc(alignment, size); 151 } 152 153 ~StructBuffer() { fastAlignedFree(m_buffer); } 149 154 operator void*() const { return m_buffer; } 150 155 151 156 private: 152 void* m_allocation;153 157 void* m_buffer; 154 158 };
Note:
See TracChangeset
for help on using the changeset viewer.