summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c')
-rwxr-xr-xbundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c753
1 files changed, 0 insertions, 753 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c b/bundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c
deleted file mode 100755
index 25e66053d2..0000000000
--- a/bundles/org.eclipse.swt/Eclipse SWT/common/library/callback.c
+++ /dev/null
@@ -1,753 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-/**
- * Callback implementation.
- */
-#include "callback.h"
-#include <string.h>
-
-/* define this to print out debug statements */
-/* #define DEBUG_CALL_PRINTS */
-
-/* --------------- callback globals ----------------- */
-
-static JavaVM *jvm = NULL;
-static CALLBACK_DATA callbackData[MAX_CALLBACKS];
-static int callbackEnabled = 1;
-static int callbackEntryCount = 0;
-static int initialized = 0;
-static jint JNI_VERSION = 0;
-
-#ifdef DEBUG_CALL_PRINTS
-static int counter = 0;
-#endif
-
-#ifdef ATOMIC
-#include <libkern/OSAtomic.h>
-#define ATOMIC_INC(value) OSAtomicIncrement32(&value);
-#define ATOMIC_DEC(value) OSAtomicDecrement32(&value);
-#else
-#define ATOMIC_INC(value) value++;
-#define ATOMIC_DEC(value) value--;
-#endif
-
-jintLong callback(int index, ...);
-
-#ifdef USE_ASSEMBLER
-
-#if !(defined (_WIN32) || defined (_WIN32_WCE))
-#include <sys/mman.h>
-#endif
-
-static unsigned char *callbackCode = NULL;
-#define CALLBACK_THUNK_SIZE 64
-
-#else
-
-/* --------------- callback functions --------------- */
-
-
-/* Function name from index and number of arguments */
-#define FN(index, args) fn##index##_##args
-
-/**
- * Functions templates
- *
- * NOTE: If the maximum number of arguments changes (MAX_ARGS), the number
- * of function templates has to change accordingly.
- */
-
-/* Function template with no arguments */
-#define FN_0(index) RETURN_TYPE FN(index, 0)() { return RETURN_CAST callback(index); }
-
-/* Function template with 1 argument */
-#define FN_1(index) RETURN_TYPE FN(index, 1)(jintLong p1) { return RETURN_CAST callback(index, p1); }
-
-/* Function template with 2 arguments */
-#define FN_2(index) RETURN_TYPE FN(index, 2)(jintLong p1, jintLong p2) { return RETURN_CAST callback(index, p1, p2); }
-
-/* Function template with 3 arguments */
-#define FN_3(index) RETURN_TYPE FN(index, 3)(jintLong p1, jintLong p2, jintLong p3) { return RETURN_CAST callback(index, p1, p2, p3); }
-
-/* Function template with 4 arguments */
-#define FN_4(index) RETURN_TYPE FN(index, 4)(jintLong p1, jintLong p2, jintLong p3, jintLong p4) { return RETURN_CAST callback(index, p1, p2, p3, p4); }
-
-/* Function template with 5 arguments */
-#define FN_5(index) RETURN_TYPE FN(index, 5)(jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5); }
-
-/* Function template with 6 arguments */
-#define FN_6(index) RETURN_TYPE FN(index, 6)(jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5, jintLong p6) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5, p6); }
-
-/* Function template with 7 arguments */
-#define FN_7(index) RETURN_TYPE FN(index, 7)(jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5, jintLong p6, jintLong p7) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5, p6, p7); }
-
-/* Function template with 8 arguments */
-#define FN_8(index) RETURN_TYPE FN(index, 8)(jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5, jintLong p6, jintLong p7, jintLong p8) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5, p6, p7, p8); }
-
-/* Function template with 9 arguments */
-#define FN_9(index) RETURN_TYPE FN(index, 9)(jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5, jintLong p6, jintLong p7, jintLong p8, jintLong p9) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9); }
-
-/* Function template with 10 arguments */
-#define FN_10(index) RETURN_TYPE FN(index, 10) (jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5, jintLong p6, jintLong p7, jintLong p8, jintLong p9, jintLong p10) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); }
-
-/* Function template with 11 arguments */
-#define FN_11(index) RETURN_TYPE FN(index, 11) (jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5, jintLong p6, jintLong p7, jintLong p8, jintLong p9, jintLong p10, jintLong p11) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); }
-
-/* Function template with 12 arguments */
-#define FN_12(index) RETURN_TYPE FN(index, 12) (jintLong p1, jintLong p2, jintLong p3, jintLong p4, jintLong p5, jintLong p6, jintLong p7, jintLong p8, jintLong p9, jintLong p10, jintLong p11, jintLong p12) { return RETURN_CAST callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); }
-
-/**
- * Define all functions with the specified number of arguments.
- *
- * NOTE: If the maximum number of callbacks changes (MAX_CALLBACKS),
- * this macro has to be updated.
- */
-#if MAX_CALLBACKS == 16
-#define FN_BLOCK(args) \
- FN_##args(0) \
- FN_##args(1) \
- FN_##args(2) \
- FN_##args(3) \
- FN_##args(4) \
- FN_##args(5) \
- FN_##args(6) \
- FN_##args(7) \
- FN_##args(8) \
- FN_##args(9) \
- FN_##args(10) \
- FN_##args(11) \
- FN_##args(12) \
- FN_##args(13) \
- FN_##args(14) \
- FN_##args(15)
-#elif MAX_CALLBACKS == 128
-#define FN_BLOCK(args) \
- FN_##args(0) \
- FN_##args(1) \
- FN_##args(2) \
- FN_##args(3) \
- FN_##args(4) \
- FN_##args(5) \
- FN_##args(6) \
- FN_##args(7) \
- FN_##args(8) \
- FN_##args(9) \
- FN_##args(10) \
- FN_##args(11) \
- FN_##args(12) \
- FN_##args(13) \
- FN_##args(14) \
- FN_##args(15) \
- FN_##args(16) \
- FN_##args(17) \
- FN_##args(18) \
- FN_##args(19) \
- FN_##args(20) \
- FN_##args(21) \
- FN_##args(22) \
- FN_##args(23) \
- FN_##args(24) \
- FN_##args(25) \
- FN_##args(26) \
- FN_##args(27) \
- FN_##args(28) \
- FN_##args(29) \
- FN_##args(30) \
- FN_##args(31) \
- FN_##args(32) \
- FN_##args(33) \
- FN_##args(34) \
- FN_##args(35) \
- FN_##args(36) \
- FN_##args(37) \
- FN_##args(38) \
- FN_##args(39) \
- FN_##args(40) \
- FN_##args(41) \
- FN_##args(42) \
- FN_##args(43) \
- FN_##args(44) \
- FN_##args(45) \
- FN_##args(46) \
- FN_##args(47) \
- FN_##args(48) \
- FN_##args(49) \
- FN_##args(50) \
- FN_##args(51) \
- FN_##args(52) \
- FN_##args(53) \
- FN_##args(54) \
- FN_##args(55) \
- FN_##args(56) \
- FN_##args(57) \
- FN_##args(58) \
- FN_##args(59) \
- FN_##args(60) \
- FN_##args(61) \
- FN_##args(62) \
- FN_##args(63) \
- FN_##args(64) \
- FN_##args(65) \
- FN_##args(66) \
- FN_##args(67) \
- FN_##args(68) \
- FN_##args(69) \
- FN_##args(70) \
- FN_##args(71) \
- FN_##args(72) \
- FN_##args(73) \
- FN_##args(74) \
- FN_##args(75) \
- FN_##args(76) \
- FN_##args(77) \
- FN_##args(78) \
- FN_##args(79) \
- FN_##args(80) \
- FN_##args(81) \
- FN_##args(82) \
- FN_##args(83) \
- FN_##args(84) \
- FN_##args(85) \
- FN_##args(86) \
- FN_##args(87) \
- FN_##args(88) \
- FN_##args(89) \
- FN_##args(90) \
- FN_##args(91) \
- FN_##args(92) \
- FN_##args(93) \
- FN_##args(94) \
- FN_##args(95) \
- FN_##args(96) \
- FN_##args(97) \
- FN_##args(98) \
- FN_##args(99) \
- FN_##args(100) \
- FN_##args(101) \
- FN_##args(102) \
- FN_##args(103) \
- FN_##args(104) \
- FN_##args(105) \
- FN_##args(106) \
- FN_##args(107) \
- FN_##args(108) \
- FN_##args(109) \
- FN_##args(110) \
- FN_##args(111) \
- FN_##args(112) \
- FN_##args(113) \
- FN_##args(114) \
- FN_##args(115) \
- FN_##args(116) \
- FN_##args(117) \
- FN_##args(118) \
- FN_##args(119) \
- FN_##args(120) \
- FN_##args(121) \
- FN_##args(122) \
- FN_##args(123) \
- FN_##args(124) \
- FN_##args(125) \
- FN_##args(126) \
- FN_##args(127)
-#else
-#error Invalid MAX_CALLBACKS
-#endif /* MAX_CALLBACKS == 16 */
-
-/**
- * Define all callback functions.
- *
- * NOTE: If the maximum number of arguments changes (MAX_ARGS), the following
- * has to change accordinglly.
- */
-FN_BLOCK(0)
-FN_BLOCK(1)
-FN_BLOCK(2)
-FN_BLOCK(3)
-FN_BLOCK(4)
-FN_BLOCK(5)
-FN_BLOCK(6)
-FN_BLOCK(7)
-FN_BLOCK(8)
-FN_BLOCK(9)
-FN_BLOCK(10)
-FN_BLOCK(11)
-FN_BLOCK(12)
-
-/**
- * Initialize the function pointers for the callback routines.
- *
- * NOTE: If MAX_ARGS or MAX_CALLBACKS changes, the following has to be updated.
- */
-#if MAX_CALLBACKS == 16
-#define FN_A_BLOCK(args) { \
- (jintLong)FN(0, args), \
- (jintLong)FN(1, args), \
- (jintLong)FN(2, args), \
- (jintLong)FN(3, args), \
- (jintLong)FN(4, args), \
- (jintLong)FN(5, args), \
- (jintLong)FN(6, args), \
- (jintLong)FN(7, args), \
- (jintLong)FN(8, args), \
- (jintLong)FN(9, args), \
- (jintLong)FN(10, args), \
- (jintLong)FN(11, args), \
- (jintLong)FN(12, args), \
- (jintLong)FN(13, args), \
- (jintLong)FN(14, args), \
- (jintLong)FN(15, args), \
-},
-#elif MAX_CALLBACKS == 128
-#define FN_A_BLOCK(args) { \
- (jintLong)FN(0, args), \
- (jintLong)FN(1, args), \
- (jintLong)FN(2, args), \
- (jintLong)FN(3, args), \
- (jintLong)FN(4, args), \
- (jintLong)FN(5, args), \
- (jintLong)FN(6, args), \
- (jintLong)FN(7, args), \
- (jintLong)FN(8, args), \
- (jintLong)FN(9, args), \
- (jintLong)FN(10, args), \
- (jintLong)FN(11, args), \
- (jintLong)FN(12, args), \
- (jintLong)FN(13, args), \
- (jintLong)FN(14, args), \
- (jintLong)FN(15, args), \
- (jintLong)FN(16, args), \
- (jintLong)FN(17, args), \
- (jintLong)FN(18, args), \
- (jintLong)FN(19, args), \
- (jintLong)FN(20, args), \
- (jintLong)FN(21, args), \
- (jintLong)FN(22, args), \
- (jintLong)FN(23, args), \
- (jintLong)FN(24, args), \
- (jintLong)FN(25, args), \
- (jintLong)FN(26, args), \
- (jintLong)FN(27, args), \
- (jintLong)FN(28, args), \
- (jintLong)FN(29, args), \
- (jintLong)FN(30, args), \
- (jintLong)FN(31, args), \
- (jintLong)FN(32, args), \
- (jintLong)FN(33, args), \
- (jintLong)FN(34, args), \
- (jintLong)FN(35, args), \
- (jintLong)FN(36, args), \
- (jintLong)FN(37, args), \
- (jintLong)FN(38, args), \
- (jintLong)FN(39, args), \
- (jintLong)FN(40, args), \
- (jintLong)FN(41, args), \
- (jintLong)FN(42, args), \
- (jintLong)FN(43, args), \
- (jintLong)FN(44, args), \
- (jintLong)FN(45, args), \
- (jintLong)FN(46, args), \
- (jintLong)FN(47, args), \
- (jintLong)FN(48, args), \
- (jintLong)FN(49, args), \
- (jintLong)FN(50, args), \
- (jintLong)FN(51, args), \
- (jintLong)FN(52, args), \
- (jintLong)FN(53, args), \
- (jintLong)FN(54, args), \
- (jintLong)FN(55, args), \
- (jintLong)FN(56, args), \
- (jintLong)FN(57, args), \
- (jintLong)FN(58, args), \
- (jintLong)FN(59, args), \
- (jintLong)FN(60, args), \
- (jintLong)FN(61, args), \
- (jintLong)FN(62, args), \
- (jintLong)FN(63, args), \
- (jintLong)FN(64, args), \
- (jintLong)FN(65, args), \
- (jintLong)FN(66, args), \
- (jintLong)FN(67, args), \
- (jintLong)FN(68, args), \
- (jintLong)FN(69, args), \
- (jintLong)FN(70, args), \
- (jintLong)FN(71, args), \
- (jintLong)FN(72, args), \
- (jintLong)FN(73, args), \
- (jintLong)FN(74, args), \
- (jintLong)FN(75, args), \
- (jintLong)FN(76, args), \
- (jintLong)FN(77, args), \
- (jintLong)FN(78, args), \
- (jintLong)FN(79, args), \
- (jintLong)FN(80, args), \
- (jintLong)FN(81, args), \
- (jintLong)FN(82, args), \
- (jintLong)FN(83, args), \
- (jintLong)FN(84, args), \
- (jintLong)FN(85, args), \
- (jintLong)FN(86, args), \
- (jintLong)FN(87, args), \
- (jintLong)FN(88, args), \
- (jintLong)FN(89, args), \
- (jintLong)FN(90, args), \
- (jintLong)FN(91, args), \
- (jintLong)FN(92, args), \
- (jintLong)FN(93, args), \
- (jintLong)FN(94, args), \
- (jintLong)FN(95, args), \
- (jintLong)FN(96, args), \
- (jintLong)FN(97, args), \
- (jintLong)FN(98, args), \
- (jintLong)FN(99, args), \
- (jintLong)FN(100, args), \
- (jintLong)FN(101, args), \
- (jintLong)FN(102, args), \
- (jintLong)FN(103, args), \
- (jintLong)FN(104, args), \
- (jintLong)FN(105, args), \
- (jintLong)FN(106, args), \
- (jintLong)FN(107, args), \
- (jintLong)FN(108, args), \
- (jintLong)FN(109, args), \
- (jintLong)FN(110, args), \
- (jintLong)FN(111, args), \
- (jintLong)FN(112, args), \
- (jintLong)FN(113, args), \
- (jintLong)FN(114, args), \
- (jintLong)FN(115, args), \
- (jintLong)FN(116, args), \
- (jintLong)FN(117, args), \
- (jintLong)FN(118, args), \
- (jintLong)FN(119, args), \
- (jintLong)FN(120, args), \
- (jintLong)FN(121, args), \
- (jintLong)FN(122, args), \
- (jintLong)FN(123, args), \
- (jintLong)FN(124, args), \
- (jintLong)FN(125, args), \
- (jintLong)FN(126, args), \
- (jintLong)FN(127, args), \
-},
-#else
-#error Invalid MAX_CALLBACKS
-#endif /* MAX_CALLBACKS == 16 */
-
-jintLong fnx_array[MAX_ARGS+1][MAX_CALLBACKS] = {
- FN_A_BLOCK(0)
- FN_A_BLOCK(1)
- FN_A_BLOCK(2)
- FN_A_BLOCK(3)
- FN_A_BLOCK(4)
- FN_A_BLOCK(5)
- FN_A_BLOCK(6)
- FN_A_BLOCK(7)
- FN_A_BLOCK(8)
- FN_A_BLOCK(9)
- FN_A_BLOCK(10)
- FN_A_BLOCK(11)
- FN_A_BLOCK(12)
-};
-
-#endif /* USE_ASSEMBLER */
-
-/* --------------- callback class calls --------------- */
-
-JNIEXPORT jintLong JNICALL 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, jintLong errorResult)
-{
- int i;
- jmethodID mid = NULL;
- jclass javaClass = that;
- const char *methodString = NULL, *sigString = NULL;
- if (jvm == NULL) (*env)->GetJavaVM(env, &jvm);
- if (JNI_VERSION == 0) JNI_VERSION = (*env)->GetVersion(env);
- if (!initialized) {
- memset(&callbackData, 0, sizeof(callbackData));
- initialized = 1;
- }
- if (method) methodString = (const char *) (*env)->GetStringUTFChars(env, method, NULL);
- if (signature) sigString = (const char *) (*env)->GetStringUTFChars(env, signature, NULL);
- if (object && methodString && sigString) {
- if (isStatic) {
- mid = (*env)->GetStaticMethodID(env, object, methodString, sigString);
- } else {
- javaClass = (*env)->GetObjectClass(env, object);
- mid = (*env)->GetMethodID(env, javaClass, methodString, sigString);
- }
- }
- if (method && methodString) (*env)->ReleaseStringUTFChars(env, method, methodString);
- if (signature && sigString) (*env)->ReleaseStringUTFChars(env, signature, sigString);
- if (mid == 0) goto fail;
- for (i=0; i<MAX_CALLBACKS; i++) {
- if (!callbackData[i].callback) {
- if ((callbackData[i].callback = (*env)->NewGlobalRef(env, callbackObject)) == NULL) goto fail;
- if ((callbackData[i].object = (*env)->NewGlobalRef(env, object)) == NULL) goto fail;
- callbackData[i].isStatic = isStatic;
- callbackData[i].isArrayBased = isArrayBased;
- callbackData[i].argCount = argCount;
- callbackData[i].errorResult = errorResult;
- callbackData[i].methodID = mid;
-#ifndef USE_ASSEMBLER
- return (jintLong) fnx_array[argCount][i];
-#else
- {
- int j = 0, k;
- unsigned char* code;
-#ifdef __APPLE__
- int pad = 0;
-#endif
- if (callbackCode == NULL) {
-#if defined (_WIN32) || defined (_WIN32_WCE)
- 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);
- if (callbackCode == MAP_FAILED) return 0;
-#endif
- }
- code = (unsigned char *)(callbackCode + (i * CALLBACK_THUNK_SIZE));
-
- //PUSH EBP - 1 byte
- code[j++] = 0x55;
-
- //MOV EBP,ESP - 2 bytes
- code[j++] = 0x8b;
- code[j++] = 0xec;
-
-#ifdef __APPLE__
- /* darwin calling conventions require that the stack be aligned on a 16-byte boundary. */
- k = (argCount+3)*sizeof(jintLong);
- pad = ((k + 15) & ~15) - k;
- if (pad > 0) {
- //SUB ESP,pad - 3 bytes
- code[j++] = 0x83;
- code[j++] = 0xec;
- code[j++] = pad;
- }
-#endif
-
- // 3*argCount bytes
- for (k=(argCount + 1) * sizeof(jintLong); k >= sizeof(jintLong)*2; k -= sizeof(jintLong)) {
- //PUSH SS:[EBP+k]
- code[j++] = 0xff;
- code[j++] = 0x75;
- code[j++] = k;
- }
-
- if (i > 127) {
- //PUSH i - 5 bytes
- code[j++] = 0x68;
- code[j++] = ((i >> 0) & 0xFF);
- code[j++] = ((i >> 8) & 0xFF);
- code[j++] = ((i >> 16) & 0xFF);
- code[j++] = ((i >> 24) & 0xFF);
- } else {
- //PUSH i - 2 bytes
- code[j++] = 0x6a;
- code[j++] = i;
- }
-
- //MOV EAX callback - 1 + sizeof(jintLong) bytes
- code[j++] = 0xb8;
- ((jintLong *)&code[j])[0] = (jintLong)&callback;
- j += sizeof(jintLong);
-
- //CALL EAX - 2 bytes
- code[j++] = 0xff;
- code[j++] = 0xd0;
-
- //ADD ESP,(argCount + 1) * sizeof(jintLong) - 3 bytes
- code[j++] = 0x83;
- code[j++] = 0xc4;
-#ifdef __APPLE__
- code[j++] = (unsigned char)(pad + ((argCount + 1) * sizeof(jintLong)));
-#else
- code[j++] = (unsigned char)((argCount + 1) * sizeof(jintLong));
-#endif
-
- //POP EBP - 1 byte
- code[j++] = 0x5d;
-
-#if defined (_WIN32) || defined (_WIN32_WCE)
- //RETN argCount * sizeof(jintLong) - 3 bytes
- code[j++] = 0xc2;
- code[j++] = (unsigned char)(argCount * sizeof(jintLong));
- code[j++] = 0x00;
-#else
- //RETN - 1 byte
- code[j++] = 0xc3;
-#endif
-
- if (j > CALLBACK_THUNK_SIZE) {
- jclass errorClass = (*env)->FindClass(env, "java/lang/Error");
- (*env)->ThrowNew(env, errorClass, "Callback thunk overflow");
- }
-
- return (jintLong)code;
- }
-#endif /* USE_ASSEMBLER */
- }
- }
-fail:
- return 0;
-}
-
-JNIEXPORT void JNICALL Java_org_eclipse_swt_internal_Callback_unbind
- (JNIEnv *env, jclass that, jobject callback)
-{
- int i;
- for (i=0; i<MAX_CALLBACKS; i++) {
- if (callbackData[i].callback != NULL && (*env)->IsSameObject(env, callback, callbackData[i].callback)) {
- if (callbackData[i].callback != NULL) (*env)->DeleteGlobalRef(env, callbackData[i].callback);
- if (callbackData[i].object != NULL) (*env)->DeleteGlobalRef(env, callbackData[i].object);
- memset(&callbackData[i], 0, sizeof(CALLBACK_DATA));
- }
- }
-}
-
-JNIEXPORT jboolean JNICALL Java_org_eclipse_swt_internal_Callback_getEnabled
- (JNIEnv *env, jclass that)
-{
- return (jboolean)callbackEnabled;
-}
-
-JNIEXPORT jint JNICALL Java_org_eclipse_swt_internal_Callback_getEntryCount
- (JNIEnv *env, jclass that)
-{
- return (jint)callbackEntryCount;
-}
-
-JNIEXPORT void JNICALL Java_org_eclipse_swt_internal_Callback_setEnabled
- (JNIEnv *env, jclass that, jboolean enable)
-{
- callbackEnabled = enable;
-}
-
-JNIEXPORT void JNICALL Java_org_eclipse_swt_internal_Callback_reset
- (JNIEnv *env, jclass that)
-{
- memset((void *)&callbackData, 0, sizeof(callbackData));
-}
-
-jintLong callback(int index, ...)
-{
- if (!callbackEnabled) return 0;
-
- {
- JNIEnv *env = NULL;
- jmethodID mid = callbackData[index].methodID;
- jobject object = callbackData[index].object;
- jboolean isStatic = callbackData[index].isStatic;
- jboolean isArrayBased = callbackData[index].isArrayBased;
- jint argCount = callbackData[index].argCount;
- jintLong result = callbackData[index].errorResult;
- int detach = 0;
- va_list vl;
-
-#ifdef DEBUG_CALL_PRINTS
- fprintf(stderr, "* callback starting %d\n", counter++);
-#endif
-
-#ifdef JNI_VERSION_1_2
- if (IS_JNI_1_2) {
- (*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2);
- }
-#endif
-
-#ifdef JNI_VERSION_1_4
- if (env == NULL) {
- if (JNI_VERSION == JNI_VERSION_1_4) {
- (*jvm)->AttachCurrentThreadAsDaemon(jvm, (void **)&env, NULL);
- }
- }
-#endif
-
- if (env == NULL) {
- (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
- if (IS_JNI_1_2) detach = 1;
- }
-
- /* If the current thread is not attached to the VM, it is not possible to call into the VM */
- if (env == NULL) {
-#ifdef DEBUG_CALL_PRINTS
- fprintf(stderr, "* could not get env\n");
-#endif
- goto noEnv;
- }
-
- /* If an exception has occurred in previous callbacks do not call into the VM. */
- if ((*env)->ExceptionOccurred(env)) {
- goto done;
- }
-
- /* Call into the VM. */
- ATOMIC_INC(callbackEntryCount);
- va_start(vl, index);
- if (isArrayBased) {
- int i;
- jintLongArray argsArray = (*env)->NewIntLongArray(env, argCount);
- if (argsArray != NULL) {
- jintLong *elements = (*env)->GetIntLongArrayElements(env, argsArray, NULL);
- if (elements != NULL) {
- for (i=0; i<argCount; i++) {
- elements[i] = va_arg(vl, jintLong);
- }
- (*env)->ReleaseIntLongArrayElements(env, argsArray, elements, 0);
- if (isStatic) {
- result = (*env)->CallStaticIntLongMethod(env, object, mid, argsArray);
- } else {
- result = (*env)->CallIntLongMethod(env, object, mid, argsArray);
- }
- }
- /*
- * This function may be called many times before returning to Java,
- * explicitly delete local references to avoid GP's in certain VMs.
- */
- (*env)->DeleteLocalRef(env, argsArray);
- }
- } else {
- if (isStatic) {
- result = (*env)->CallStaticIntLongMethodV(env, object, mid, vl);
- } else {
- result = (*env)->CallIntLongMethodV(env, object, mid, vl);
- }
- }
- va_end(vl);
- ATOMIC_DEC(callbackEntryCount);
-
-done:
- /* If an exception has occurred in Java, return the error result. */
- if ((*env)->ExceptionOccurred(env)) {
-#ifdef DEBUG_CALL_PRINTS
- fprintf(stderr, "* java exception occurred\n");
- (*env)->ExceptionDescribe(env);
-#endif
- result = callbackData[index].errorResult;
- }
-
- if (detach) {
- (*jvm)->DetachCurrentThread(jvm);
- env = NULL;
- }
-
-noEnv:
-
-#ifdef DEBUG_CALL_PRINTS
- fprintf(stderr, "* callback exiting %d\n", --counter);
-#endif
-
- return result;
- }
-}
-
-/* ------------- callback class calls end --------------- */