Mercurial > projects > dwt-mac
diff dwt/internal/c/callback.d @ 1:8b48be5454ce
The internal cocoa classes compile now
author | Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com> |
---|---|
date | Tue, 19 Aug 2008 17:35:17 +0200 |
parents | 380af2bdd8e5 |
children | e831403a80a9 a329f9c3d66d |
line wrap: on
line diff
--- a/dwt/internal/c/callback.d Sat Aug 09 17:00:02 2008 +0200 +++ b/dwt/internal/c/callback.d Tue Aug 19 17:35:17 2008 +0200 @@ -13,8 +13,31 @@ *******************************************************************************/ module dwt.internal.c.callback; +/** + * Callback implementation. + */ +import dwt.dwthelper.utils; import dwt.internal.Callback; +/* Header */ + +version (Win32) +{ + import tango.sys.win32.UserGdi; + import tango.sys.win32.Types; +} + +else version (Win32_WCE) +{ + import tango.sys.win32.UserGdi; + import tango.sys.win32.Types; +} + +else + alias RETURN_TYPE SWT_PTR; + +/* Implementation */ + alias size_t SWT_PTR; struct CALLBACK_DATA @@ -41,7 +64,6 @@ int initialized = 0; } - SWT_PTR callback(int index, ...); static if (USE_ASSEMBLER) @@ -55,10 +77,7 @@ int CALLBACK_THUNK_SIZE = 64; } -SWT_PTR Java_org_eclipse_swt_internal_Callback_bind (JNIEnv* env, jclass that, - jobject callbackObject, jobject object, jstring method, - jstring signature, jint argCount, jboolean isStatic, - jboolean isArrayBased, SWT_PTR errorResult) +SWT_PTR bind (Callback callbackObject, Object object, String method, String signature, int argCount, boolean isStatic, boolean isArrayBased, SWT_PTR errorResult) { int i; jmethodID mid = null; @@ -71,17 +90,15 @@ if (!initialized) { - memset(&callbackData, 0, sizeof(callbackData)); + memset(&callbackData, 0, callbackData.sizeof); initialized = 1; } if (method) - methodString = cast(/*const*/char*) (*env).GetStringUTFChars(env, - method, null); + methodString = cast(/*const*/char*) (*env).GetStringUTFChars(env, method, null); if (signature) - sigString = cast(/*const*/char*) (*env).GetStringUTFChars(env, - signature, null); + sigString = cast(/*const*/char*) (*env).GetStringUTFChars(env, signature, null); if (object && methodString && sigString) { @@ -109,8 +126,7 @@ { if (!callbackData[i].callback) { - if ((callbackData[i].callback = (*env).NewGlobalRef(env, - callbackObject)) == null) + if ((callbackData[i].callback = (*env).NewGlobalRef(env, callbackObject)) == null) goto fail; if ((callbackData[i].object = (*env).NewGlobalRef(env, object)) == null) @@ -133,28 +149,21 @@ { version (Win32) { - callbackCode = VirtualAlloc(null, - CALLBACK_THUNK_SIZE * MAX_CALLBACKS, - MEM_COMMIT, PAGE_EXECUTE_READWRITE); + callbackCode = VirtualAlloc(null, CALLBACK_THUNK_SIZE * MAX_CALLBACKS, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (callbackCode == null) return 0; } else version (Win32_WCE) { - callbackCode = VirtualAlloc(null, - CALLBACK_THUNK_SIZE * MAX_CALLBACKS, - MEM_COMMIT, PAGE_EXECUTE_READWRITE); + callbackCode = VirtualAlloc(null, CALLBACK_THUNK_SIZE * MAX_CALLBACKS, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (callbackCode == null) return 0; } else { - callbackCode = mmap(null, - CALLBACK_THUNK_SIZE * MAX_CALLBACKS, - PROT_EXEC | PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -1, 0); + callbackCode = mmap(null, CALLBACK_THUNK_SIZE * MAX_CALLBACKS, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if (callbackCode == MAP_FAILED) return 0; } @@ -171,7 +180,7 @@ version (darwin) { /* darwin calling conventions require that the stack be aligned on a 16-byte boundary. */ - k = (argCount + 3) * sizeof(SWT_PTR); + k = (argCount + 3) * SWT_PTR.sizeof; pad = ((k + 15) & ~15) - k; if (pad > 0) { @@ -183,8 +192,7 @@ } // 3*argCount bytes - for (k = (argCount + 1) * sizeof(SWT_PTR); k >= sizeof(SWT_PTR) * 2; k -= sizeof( - SWT_PTR)) + for (k = (argCount + 1) * SWT_PTR.sizeof; k >= SWT_PTR.sizeof * 2; k -= SWT_PTR.sizeof) { //PUSH SS:[EBP+k] code[j++] = 0xff; @@ -208,41 +216,40 @@ code[j++] = i; } - //MOV EAX callback - 1 + sizeof(SWT_PTR) bytes + //MOV EAX callback - 1 + SWT_PTR.sizeof bytes code[j++] = 0xb8; (cast(SWT_PTR*) &code[j])[0] = cast(SWT_PTR) &callback; - j += sizeof(SWT_PTR); + j += SWT_PTR.sizeof; //CALL EAX - 2 bytes code[j++] = 0xff; code[j++] = 0xd0; - //ADD ESP,(argCount + 1) * sizeof(SWT_PTR) - 3 bytes + //ADD ESP,(argCount + 1) * SWT_PTR.sizeof - 3 bytes code[j++] = 0x83; code[j++] = 0xc4; version (darwin) - code[j++] = cast(ubyte) (pad + ((argCount + 1) * sizeof( - SWT_PTR))); + code[j++] = cast(ubyte) (pad + ((argCount + 1) * SWT_PTR.sizeof)); else - code[j++] = cast(ubyte) ((argCount + 1) * sizeof(SWT_PTR)); + code[j++] = cast(ubyte) ((argCount + 1) * SWT_PTR.sizeof); //POP EBP - 1 byte code[j++] = 0x5d; version (Win32) { - // RETN argCount * sizeof(SWT_PTR) - 3 bytes + // RETN argCount * SWT_PTR.sizeof - 3 bytes code[j++] = 0xc2; - code[j++] = cast(ubyte) (argCount * sizeof(SWT_PTR)); + code[j++] = cast(ubyte) (argCount * SWT_PTR.sizeof); code[j++] = 0x00; } else version (Win32_WCE) { - // RETN argCount * sizeof(SWT_PTR) - 3 bytes + // RETN argCount * SWT_PTR.sizeof - 3 bytes code[j++] = 0xc2; - code[j++] = cast(ubyte) (argCount * sizeof(SWT_PTR)); + code[j++] = cast(ubyte) (argCount * SWT_PTR.sizeof); code[j++] = 0x00; } @@ -254,9 +261,7 @@ if (j > CALLBACK_THUNK_SIZE) { - jclass - errorClass = (*env).FindClass(env, - "java/lang/Error"); + jclass errorClass = (*env).FindClass(env, "java/lang/Error"); (*env).ThrowNew(env, errorClass, "Callback thunk overflow"); } @@ -266,5 +271,5 @@ } fail: - return 0; + return 0; }