view dstep/objc/runtime.d @ 23:420969b22201

Removed an import to a private library. Added support for building as a dynamic library and framework
author Jacob Carlborg <doob@me.com>
date Wed, 10 Feb 2010 17:29:12 +0100
parents 19885b43130e
children ab33fc0c3fc1
line wrap: on
line source

/**
 * Copyright: Copyright (c) 2009 Jacob Carlborg.
 * Authors: Jacob Carlborg
 * Version: Initial created: Feb 1, 2009
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
 */
module dstep.objc.runtime;

import dstep.internal.String;
import dstep.internal.Types;
import dstep.internal.Version;
import bindings = dstep.objc.bindings;
import dstep.objc.message;
import dstep.objc.objc;

struct objc_property;

alias objc_method* Method;
alias objc_ivar* Ivar;
alias objc_category* Category;
alias objc_property* objc_property_t;
alias objc_object Protocol;
alias objc_symtab* Symtab;
alias objc_cache* Cache;

const char _C_ID = '@';
const char _C_CLASS = '#';
const char _C_SEL = ':';
const char _C_CHR = 'c';
const char _C_UCHR = 'C';
const char _C_SHT = 's';
const char _C_USHT = 'S';
const char _C_INT = 'i';
const char _C_UINT = 'I';
const char _C_LNG = 'l';
const char _C_ULNG = 'L';
const char _C_LNG_LNG = 'q';
const char _C_ULNG_LNG = 'Q';
const char _C_FLT = 'f';
const char _C_DBL = 'd';
const char _C_BFLD = 'b';
const char _C_BOOL = 'B';
const char _C_VOID = 'v';
const char _C_UNDEF = '?';
const char _C_PTR = '^';
const char _C_CHARPTR = '*';
const char _C_ATOM = '%';
const char _C_ARY_B = '[';
const char _C_ARY_E = ']';
const char _C_UNION_B = '(';
const char _C_UNION_E = ')';
const char _C_STRUCT_B = '{';
const char _C_STRUCT_E = '}';
const char _C_VECTOR = '!';
const char _C_CONST = 'r';

struct objc_class
{
    Class isa;
    Class super_class;
    /*const*/ char* name;
    c_long version_;
    c_long info;
    c_long instance_size;
    objc_ivar_list* ivars;
    objc_method_list** methodLists;
    objc_cache* cache;
    objc_protocol_list* protocols;
    
    
    
    // D Extensions:
    
	void setFutureClass (string name) ()
	{
		bindings.objc_setFutureClass(this, name.ptr);
	}
	
	string getName ()
	{
		return fromStringz(bindings.class_getName(this));
	}
	
	Ivar getInstanceVariable (string name) ()
	{
		return bindings.class_getInstanceVariable(this, name.ptr);
	}

	Ivar getClassVariable (string name) ()
	{
		return bindings.class_getClassVariable(this, name.ptr);
	}
	
	Ivar[] copyIvarList ()
	{
		uint outCount;
		
		Ivar* list = bindings.class_copyIvarList(this, &outCount);
		
		if (list)
			return list[0 .. outCount];
		
		return null;
	}
	
	Method[] copyMethodList ()
	{
		uint outCount;
		
		Method* list = bindings.class_copyMethodList(this, &outCount);
		
		if (list)
			return list[0 .. outCount];
		
		return null;
	}
	
	Protocol*[] copyProtocolList ()
	{
		uint outCount;
		
		Protocol** list = bindings.class_copyProtocolList(this, &outCount);
		
		if (list)
			return list[0 .. outCount];
		
		return null;
	}
	
	string getIvarLayout ()
	{
		return fromStringz(bindings.class_getIvarLayout(this));
	}
	
	string getWeakIvarLayout ()
	{
		return fromStringz(bindings.class_getWeakIvarLayout(this));
	}
	
	Class duplicateClass (string name) (size_t extraBytes)
	{
		return bindings.objc_duplicateClass(this, name.ptr, extraBytes);
	}
	
	bool addMethod (string types) (SEL name, IMP imp)
	{
		return bindings.class_addMethod(this, name, imp, types.ptr);
	}
	
	IMP replaceMethod (string types) (SEL name, IMP imp)
	{
		return bindings.class_replaceMethod(this, name, imp, types.ptr);
	}
	
	bool addIvar (string name, string types) (size_t size, ubyte alignment)
	{
		return bindings.class_addIvar(this, name.ptr, size, alignment, types.ptr);
	}
	
	void setIvarLayout (string layout) ()
	{
		bindings.class_setIvarLayout(this, layout.ptr);
	}
	
	void setWeakIvarLayout (string layout) ()
	{
		bindings.class_setWeakIvarLayout(this, layout.ptr);
	}

	objc_property_t* getProperty (string name) ()
	{
		return bindings.class_getProperty(this, name.ptr);
	}
	
	string getImageName ()
	{
		return fromStringz(bindings.class_getImageName(this));
	}
	
	bool isMetaClass ()
	{
		return bindings.class_isMetaClass(this);
	}
	
	Class getSuperclass ()
	{
		return bindings.class_getSuperclass(this);
	}
	
	Class setSuperClass (Class newSuper)
	{
		return bindings.class_setSuperclass(this, newSuper);
	}
	
	int getVersion ()
	{
		return bindings.class_getVersion(this);
	}
	
	void serVersion (int version_)
	{
		return bindings.class_setVersion(this, version_);
	}
	
	size_t getInstanceSize ()
	{
		return bindings.class_getInstanceSize(this);
	}
	
	Method getInstanceMethod (SEL name)
	{
		return bindings.class_getInstanceMethod(this, name);
	}
	
	Method getClassMethod (SEL name)
	{
		return bindings.class_getClassMethod(this, name);
	}
	
	IMP getMethodImplementation (SEL name)
	{
		return bindings.class_getMethodImplementation(this, name);
	}
	
	IMP getMethodImplementation_stret (SEL name)
	{
		return bindings.class_getMethodImplementation_stret(this, name);
	}
	
	bool respondsToSelector (SEL sel)
	{
		return bindings.class_respondsToSelector(this, sel);
	}
	
	bool conformsToProtocol (Protocol* protocol)
	{
		return bindings.class_conformsToProtocol(this, protocol);
	}
	
	void addProtocol (Protocol* protocol)
	{
		return bindings.class_addProtocol(this, protocol);
	}
	
	id createInstanceFromZone (size_t idxIvars, void* z)
	{
		return bindings.class_createInstanceFromZone(this, idxIvars, z);
	}
	
	void addMethods (objc_method_list* methodList)
	{
		return.class_addMethods(this, methodList);
	}
	
	void removeMethods (objc_method_list* methodList)
	{
		return bindings.class_removeMethods(this, methodList);
	}
	
	Class poseAs (Class original)
	{
		return bindings.class_poseAs(this, original);
	}
	
	bool respondsToMethod (SEL sel)
	{
		return bindings.class_respondsToMethod(this, sel);
	}
	
	objc_method_list* class_nextMethodList (void* arg)
	{
		return bindings.class_nextMethodList(this, arg);
	}
}

struct objc_method_description
{
	SEL name;
	char* types;
}

struct objc_method_description_list
{
	int count;
	objc_method_description[1] list;
}

struct objc_protocol_list
{
	objc_protocol_list* next;
	c_long count;
	Protocol*[1] list;
}

struct objc_category
{
	char* category_name;
	char* class_name;
	objc_method_list* instance_methods;
	objc_method_list* class_methods;
	objc_protocol_list* protocols;
}

struct objc_ivar
{
    char* ivar_name;
    char* ivar_type;
    int ivar_offset;
    
    static if (D_LP64)
    	int space;
    
    
    
    // D Extensions:
    
	string getName ()
	{
		return fromStringz(bindings.ivar_getName(this));
	}

	string getTypeEncoding ()
	{
		return fromStringz(bindings.ivar_getTypeEncoding(this));
	}
	
	ptrdiff_t getOffset ()
	{
		return bindings.ivar_getOffset(this);
	}
}

struct objc_ivar_list
{
    int ivar_count;
    
    static if (D_LP64)
    	int space;
    
    /* variable length structure */
    objc_ivar[1] ivar_list;
}

struct objc_method
{
    SEL method_name;
    char* method_types;
    IMP method_imp;
    
    
    
    // D Extensions:
    
	/*uint getArgumentInfo (string[] type) (int arg, int* offset)
	{
		char*[] arr;
		arr.length = type.length;
		
		foreach (i, str ; type)
			arr[i] = str.ptr;
		
		return bindings.method_getArgumentInfo(this, arg, arr.ptr, offset);
	}*/
	
	string getTypeEncoding ()
	{
		return fromStringz(bindings.method_getTypeEncoding(this));
	}
	
	string copyReturnType ()
	{
		return fromStringz(bindings.method_copyReturnType(this));
	}

	string copyArgumentType (uint index)
	{
		return fromStringz(bindings.method_copyArgumentType(this, index));
	}

	void getReturnType (string dst, size_t dst_len)
	{
		bindings.method_getReturnType(this, dst.toStringz(), dst_len);
	}

	void getArgumentType (uint index, string dst, size_t dst_len)
	{
		bindings.method_getArgumentType(this, index, dst.toStringz(), dst_len);
	}
	
	SEL getName ()
	{
		return bindings.method_getName(this);
	}
	
	IMP getImplementation ()
	{
		return bindings.method_getImplementation(this);
	}
	
	uint getNumberOfArguments ()
	{
		return bindings.method_getNumberOfArguments(this);
	}
	
	objc_method_description* getDescription ()
	{
		return bindings.method_getDescription(this);
	}
	
	IMP setImplementation (IMP imp)
	{
		return bindings.method_setImplementation(this, imp);
	}
	
	void exchangeImplementations (Method m2)
	{
		bindings.method_exchangeImplementations(this, m2);
	}
	
	uint getSizeOfArguments ()
	{
		return bindings.method_getSizeOfArguments(this);
	}
}

struct objc_method_list
{
    objc_method_list* obsolete;
    
    int method_count;
    
    static if (D_LP64)
    	int space;
    
    /* variable length structure */
    objc_method method_list[1];
}

struct objc_symtab
{
	c_ulong sel_ref_cnt;
	SEL* refs;
	ushort cls_def_cnt;
	ushort cat_def_cnt;
	void*[1] defs;
}

struct objc_cache
{
    uint mask /* total = mask + 1 */;
    uint occupied;
    Method[1] buckets;
}

struct objc_module
{
	c_ulong version_;
	c_ulong size;
	char* name;
	Symtab symtab;
}

string object_getClassName (id obj)
{
	return fromStringz(bindings.object_getClassName(obj));
}

Ivar object_setInstanceVariable (T) (id obj, string name, T value)
{
	return bindings.object_setInstanceVariable(obj, name.toStringz(), value);
}

Ivar object_getInstanceVariable (T) (id obj, string name, out T outValue)
{
	return bindings.object_getInstanceVariable(obj, name.toStringz(), &outValue);
}

id objc_getClass (string name)
{
	return bindings.objc_getClass(name.toStringz());
}

id objc_getMetaClass (string name)
{
	return bindings.objc_getMetaClass(name.toStringz());
}

id objc_lookUpClass (string name)
{
	return bindings.objc_lookUpClass(name.toStringz());
}

id objc_getRequiredClass (string name)
{
	return bindings.objc_getRequiredClass(name.toStringz());
}

Class objc_getFutureClass (string name)
{
	return bindings.objc_getFutureClass(name.toStringz());
}

void objc_setFutureClass (Class cls, string name)
{
	bindings.objc_setFutureClass(cls, name.toStringz());
}

id objc_getProtocol (string name)
{
	return bindings.objc_getProtocol(name.toStringz());
}

Protocol** objc_copyProtocolList (out uint outCount)
{
	return bindings.objc_copyProtocolList(&outCount);
}

string class_getName (Class cls)
{
	return fromStringz(bindings.class_getName(cls));
}

Ivar class_getInstanceVariable (Class cls, string name)
{
	return bindings.class_getInstanceVariable(cls, name.toStringz());
}

Ivar class_getClassVariable (Class cls, string name)
{
	return bindings.class_getClassVariable(cls, name.toStringz());
}

Ivar* class_copyIvarList (Class cls, out uint outCount)
{
	return bindings.class_copyIvarList(cls, &outCount);
}

Method* class_copyMethodList (Class cls, out uint outCount)
{
	return bindings.class_copyMethodList(cls, &outCount);
}

Protocol** class_copyProtocolList (Class cls, out uint outCount)
{
	return bindings.class_copyProtocolList(cls, &outCount);
}

objc_property_t* class_getProperty (Class cls, string name)
{
	return bindings.class_getProperty(cls, name.toStringz());
}

objc_property_t* class_copyPropertyList (Class cls, out uint outCount)
{
	return bindings.class_copyPropertyList(cls, &outCount);
}

string class_getIvarLayout (Class cls)
{
	return fromStringz(bindings.class_getIvarLayout(cls));
}

string class_getWeakIvarLayout (Class cls)
{
	return fromStringz(bindings.class_getWeakIvarLayout(cls));
}

Class objc_allocateClassPair (Class superclass, string name, size_t extraBytes)
{
	return bindings.objc_allocateClassPair(superclass, name.toStringz(), extraBytes);
}

Class objc_duplicateClass (Class original, string name, size_t extraBytes)
{
	return bindings.objc_duplicateClass(original, name.toStringz(), extraBytes);
}

bool class_addMethod (Class cls, SEL name, IMP imp, string types)
{
	return bindings.class_addMethod(cls, name, imp, types.toStringz());
}

IMP class_replaceMethod (Class cls, SEL name, IMP imp, string types)
{
	return bindings.class_replaceMethod(cls, name, imp, types.toStringz());
}

bool class_addIvar (Class cls, string name, size_t size, ubyte alignment, string types)
{
	return bindings.class_addIvar(cls, name.toStringz(), size, alignment, types.toStringz());
}

void class_setIvarLayout (Class cls, string layout)
{
	bindings.class_setIvarLayout(cls, layout.toStringz());
}

void class_setWeakIvarLayout (Class cls, string layout)
{
	bindings.class_setWeakIvarLayout(cls, layout.toStringz());
}

string method_getTypeEncoding (Method m)
{
	return fromStringz(bindings.method_getTypeEncoding(m));
}

string method_copyReturnType (Method m)
{
	return fromStringz(bindings.method_copyReturnType(m));
}

string method_copyArgumentType (Method m, uint index)
{
	return fromStringz(bindings.method_copyArgumentType(m, index));
}

void method_getReturnType (Method m, string dst, size_t dst_len)
{
	bindings.method_getReturnType(m, dst.toStringz(), dst_len);
}

void method_getArgumentType (Method m, uint index, string dst, size_t dst_len)
{
	bindings.method_getArgumentType(m, index, dst.toStringz(), dst_len);
}

string ivar_getName (Ivar v)
{
	return fromStringz(bindings.ivar_getName(v));
}

string ivar_getTypeEncoding (Ivar v)
{
	return fromStringz(bindings.ivar_getTypeEncoding(v));
}

string property_getName (objc_property_t* property)
{
	return fromStringz(bindings.property_getName(property));
}

string property_getAttributes (objc_property_t* property)
{
	return fromStringz(bindings.property_getAttributes(property));
}

string protocol_getName (id p)
{
	return fromStringz(bindings.protocol_getName(p));
}

objc_method_description* protocol_copyMethodDescriptionList(id p, bool isRequiredMethod, bool isInstanceMethod, out uint outCount)
{
	return bindings.protocol_copyMethodDescriptionList(p, isRequiredMethod, isInstanceMethod, &outCount);
}

objc_property_t* protocol_getProperty (id proto, string name, bool isRequiredProperty, bool isInstanceProperty)
{
	return bindings.protocol_getProperty(proto, name.toStringz(), isRequiredProperty, isInstanceProperty);
}

objc_property_t* protocol_copyPropertyList (id proto, out uint outCount)
{
	return bindings.protocol_copyPropertyList(proto, &outCount);
}

Protocol** protocol_copyProtocolList (id proto, out uint outCount)
{
	return bindings.protocol_copyProtocolList(proto, &outCount);
}

static string[] objc_copyImageNames (out uint outCount)
{
	string[] ret;
	
	char** result = bindings.objc_copyImageNames(&outCount);
	ret.length = outCount;
	
	for (size_t i = 0; i < outCount; i++)
		ret[i] = fromStringz(result[i]);
	
	return ret;
}

string class_getImageName (Class cls)
{
	return fromStringz(bindings.class_getImageName(cls));
}

string[] objc_copyClassNamesForImage (string image, out uint outCount)
{
	string[] ret;
	
	char** result = bindings.objc_copyClassNamesForImage(image.toStringz(), &outCount);
	ret.length = outCount;
	
	for (size_t i = 0; i < outCount; i++)
		ret[i] = fromStringz(result[i]);
	
	return ret;
}

string sel_getName (SEL sel)
{
	return fromStringz(bindings.sel_getName(sel));
}

SEL sel_getUid (string str)
{
	return bindings.sel_getUid(str.toStringz());
}

SEL sel_registerName (string str)
{
	return bindings.sel_registerName(str.toStringz());
}

uint method_getArgumentInfo (objc_method* m, int arg, string[] type, int* offset)
{
	char*[] arr;
	arr.length = type.length;
	
	foreach (i, str ; type)
		arr[i] = str.toStringz();
	
	return bindings.method_getArgumentInfo(m, arg, arr.ptr, offset);
}

Class objc_getOrigClass (string name)
{
	return bindings.objc_getOrigClass(name.toStringz());
}

alias bindings.object_copy object_copy;
alias bindings.object_dispose object_dispose;
alias bindings.object_getClass object_getClass;
alias bindings.object_setClass object_setClass;
alias bindings.object_getIndexedIvars object_getIndexedIvars;
alias bindings.object_getIvar object_getIvar;
alias bindings.object_setIvar object_setIvar;
alias bindings.objc_getClassList objc_getClassList;
alias bindings.class_isMetaClass class_isMetaClass;
alias bindings.class_getSuperclass class_getSuperclass;
alias bindings.class_setSuperclass class_setSuperclass;
alias bindings.class_getVersion class_getVersion;
alias bindings.class_setVersion class_setVersion;
alias bindings.class_getInstanceSize class_getInstanceSize;
alias bindings.class_getInstanceMethod class_getInstanceMethod;
alias bindings.class_getClassMethod class_getClassMethod;
alias bindings.class_getMethodImplementation class_getMethodImplementation;
alias bindings.class_getMethodImplementation_stret class_getMethodImplementation_stret;
alias bindings.class_respondsToSelector class_respondsToSelector;
alias bindings.class_conformsToProtocol class_conformsToProtocol;
alias bindings.class_createInstance class_createInstance;
alias bindings.objc_registerClassPair objc_registerClassPair;
alias bindings.objc_disposeClassPair objc_disposeClassPair;
alias bindings.class_addProtocol class_addProtocol;
alias bindings.method_getName method_getName;
alias bindings.method_getImplementation method_getImplementation;
alias bindings.method_getNumberOfArguments method_getNumberOfArguments;
alias bindings.method_getDescription method_getDescription;
alias bindings.method_setImplementation method_setImplementation;
alias bindings.method_exchangeImplementations method_exchangeImplementations;
alias bindings.ivar_getOffset ivar_getOffset;
alias bindings.protocol_conformsToProtocol protocol_conformsToProtocol;
alias bindings.protocol_isEqual protocol_isEqual;
alias bindings.protocol_getMethodDescription protocol_getMethodDescription;
alias bindings.sel_isEqual sel_isEqual;
alias bindings.objc_enumerationMutation objc_enumerationMutation;
alias bindings.objc_setForwardHandler objc_setForwardHandler;
alias bindings.sel_isMapped sel_isMapped;
alias bindings.object_copyFromZone object_copyFromZone;
alias bindings.object_realloc object_realloc;
alias bindings.object_reallocFromZone object_reallocFromZone;
alias bindings.objc_getClasses objc_getClasses;
alias bindings.objc_addClass objc_addClass;
alias bindings.objc_setMultithreaded objc_setMultithreaded;
alias bindings.class_createInstanceFromZone class_createInstanceFromZone;
alias bindings.class_addMethods class_addMethods;
alias bindings.class_removeMethods class_removeMethods;
alias bindings.class_poseAs class_poseAs;
alias bindings.method_getSizeOfArguments method_getSizeOfArguments;
alias bindings.class_respondsToMethod class_respondsToMethod;
alias bindings.class_lookupMethod class_lookupMethod;
alias bindings.class_nextMethodList class_nextMethodList;