Example #1
0
def _analyzeProtocol(machO, d, analyzer, preped, protoListPtrs):
	"""Analyze a prepared ``old_protocol`` struct, and return a tuple of
	:class:`~objc.protocol.Protocol`\\s and an iterable of addresses of
	protocols it has adopted."""

	(namePtr, instMethods, classMethods) = preped
	
	name = d(namePtr)
	proto = Protocol(name)
	
	proto.addClassMethods(map(analyzer, reversed(classMethods)))
	proto.addMethods(map(analyzer, reversed(instMethods)))
	
	protocolRefs = _readProtocolRefListsAt(machO, protoListPtrs)
	
	return (proto, protocolRefs)
Example #2
0
def readProtocol(machO, vmaddr):
	"""Peek a ``protocol_t`` at *offset*. Returns a tuple of
	:class:`~objc.protocol.Protocol` and an iterable of protocol addresses it is
	adopting."""

	#	typedef struct protocol_t {
	#		id isa;
	#		const char *name;
	#		struct protocol_list_t *protocols;
	#		method_list_t *instanceMethods;
	#		method_list_t *classMethods;
	#		method_list_t *optionalInstanceMethods;
	#		method_list_t *optionalClassMethods;
	#		struct objc_property_list *instanceProperties;
	#	} protocol_t;
	
	pos = machO.fromVM(vmaddr) + machO.origin
	(_, namePtr, protocolListPtr, instMethodsPtr, classMethodsPtr, optInstMethodsPtr, optClassMethodsPtr, propsPtr) = peekStruct(machO.file, machO.makeStruct('8^'), position=pos)
	
	name = machO.derefString(namePtr)
	protocolRefs = _readProtocolRefListAt(machO, protocolListPtr)
	
	proto = Protocol(name)
	proto.addClassMethods(readMethodListAt(machO, classMethodsPtr, optional=False))
	proto.addClassMethods(readMethodListAt(machO, optClassMethodsPtr, optional=True))
	proto.addMethods(readMethodListAt(machO, instMethodsPtr, optional=False))
	proto.addMethods(readMethodListAt(machO, optInstMethodsPtr, optional=True))

	proto.addProperties(readPropertyListAt(machO, propsPtr))

	return (proto, protocolRefs)
Example #3
0
def readProtocol(machO, vmaddr):
	"""Peek a ``protocol_t`` at *offset*. Returns a tuple of
	:class:`~objc.protocol.Protocol` and an iterable of protocol addresses it is
	adopting."""

	#	typedef struct protocol_t {
	#		id isa;
	#		const char *name;
	#		struct protocol_list_t *protocols;
	#		method_list_t *instanceMethods;
	#		method_list_t *classMethods;
	#		method_list_t *optionalInstanceMethods;
	#		method_list_t *optionalClassMethods;
	#		struct objc_property_list *instanceProperties;
	#	} protocol_t;
	
	pos = machO.fromVM(vmaddr) + machO.origin
	(_, namePtr, protocolListPtr, instMethodsPtr, classMethodsPtr, optInstMethodsPtr, optClassMethodsPtr, propsPtr) = peekStruct(machO.file, machO.makeStruct('8^'), position=pos)
	
	name = machO.derefString(namePtr)
	protocolRefs = _readProtocolRefListAt(machO, protocolListPtr)
	
	proto = Protocol(name)
	proto.addClassMethods(readMethodListAt(machO, classMethodsPtr, optional=False))
	proto.addClassMethods(readMethodListAt(machO, optClassMethodsPtr, optional=True))
	proto.addMethods(readMethodListAt(machO, instMethodsPtr, optional=False))
	proto.addMethods(readMethodListAt(machO, optInstMethodsPtr, optional=True))

	proto.addProperties(readPropertyListAt(machO, propsPtr))

	return (proto, protocolRefs)