library.callback.c Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.swt.gtk.linux.ppc64le Show documentation
Show all versions of org.eclipse.swt.gtk.linux.ppc64le Show documentation
Standard Widget Toolkit for GTK on ppc64le
The newest version!
/*******************************************************************************
* Copyright (c) 2000, 2012 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/**
* Callback implementation.
*/
#include "callback.h"
#include
#ifndef CALLBACK_NATIVE
#define CALLBACK_NATIVE(func) Java_org_eclipse_swt_internal_Callback_##func
#endif
/* define this to print out debug statements */
/* #define DEBUG_CALL_PRINTS */
/* --------------- callback globals ----------------- */
static CALLBACK_DATA callbackData[MAX_CALLBACKS];
static int callbackEnabled = 1;
static int callbackEntryCount = 0;
static int initialized = 0;
static jmethodID mid_Throwable_addSuppressed = NULL;
#ifdef DEBUG_CALL_PRINTS
static int counter = 0;
#if defined(COCOA)
#include
#elif defined(GTK)
#include
#include
#endif
#endif
#ifdef ATOMIC
#include
#define ATOMIC_INC(value) OSAtomicIncrement32(&value);
#define ATOMIC_DEC(value) OSAtomicDecrement32(&value);
#else
#define ATOMIC_INC(value) value++;
#define ATOMIC_DEC(value) value--;
#endif
jlong callback(int index, ...);
/* --------------- 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) jlong FN(index, 0)() { return callback(index); }
/* Function template with 1 argument */
#define FN_1(index) jlong FN(index, 1)(jlong p1) { return callback(index, p1); }
/* Function template with 2 arguments */
#define FN_2(index) jlong FN(index, 2)(jlong p1, jlong p2) { return callback(index, p1, p2); }
/* Function template with 3 arguments */
#define FN_3(index) jlong FN(index, 3)(jlong p1, jlong p2, jlong p3) { return callback(index, p1, p2, p3); }
/* Function template with 4 arguments */
#define FN_4(index) jlong FN(index, 4)(jlong p1, jlong p2, jlong p3, jlong p4) { return callback(index, p1, p2, p3, p4); }
/* Function template with 5 arguments */
#define FN_5(index) jlong FN(index, 5)(jlong p1, jlong p2, jlong p3, jlong p4, jlong p5) { return callback(index, p1, p2, p3, p4, p5); }
/* Function template with 6 arguments */
#define FN_6(index) jlong FN(index, 6)(jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6) { return callback(index, p1, p2, p3, p4, p5, p6); }
/* Function template with 7 arguments */
#define FN_7(index) jlong FN(index, 7)(jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6, jlong p7) { return callback(index, p1, p2, p3, p4, p5, p6, p7); }
/* Function template with 8 arguments */
#define FN_8(index) jlong FN(index, 8)(jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6, jlong p7, jlong p8) { return callback(index, p1, p2, p3, p4, p5, p6, p7, p8); }
/* Function template with 9 arguments */
#define FN_9(index) jlong FN(index, 9)(jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6, jlong p7, jlong p8, jlong p9) { return callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9); }
/* Function template with 10 arguments */
#define FN_10(index) jlong FN(index, 10) (jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6, jlong p7, jlong p8, jlong p9, jlong p10) { return callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); }
/* Function template with 11 arguments */
#define FN_11(index) jlong FN(index, 11) (jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6, jlong p7, jlong p8, jlong p9, jlong p10, jlong p11) { return callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); }
/* Function template with 12 arguments */
#define FN_12(index) jlong FN(index, 12) (jlong p1, jlong p2, jlong p3, jlong p4, jlong p5, jlong p6, jlong p7, jlong p8, jlong p9, jlong p10, jlong p11, jlong p12) { return callback(index, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); }
#if defined(GTK)
#define FND(index, args) fnD##index##_##args
#define NUM_DOUBLE_CALLBACKS 2
#define FN_D_4(index) jlong FND(index, 4) (jlong p1, jdouble p2, jdouble p3, jlong p4) { return callback(index, p1, p2, p3, p4); }
#define FN_D_5(index) jlong FND(index, 5) (jlong p1, jint p2, jdouble p3, jdouble p4, jlong p5) { return callback(index, p1, p2, p3, p4, p5); }
#define FN_DOUBLE_BLOCK(args) \
FN_D_##args(0) \
FN_D_##args(1) \
FN_D_##args(2) \
FN_D_##args(3) \
FN_D_##args(4) \
FN_D_##args(5) \
FN_D_##args(6) \
FN_D_##args(7) \
FN_D_##args(8) \
FN_D_##args(9) \
FN_D_##args(10) \
FN_D_##args(11) \
FN_D_##args(12) \
FN_D_##args(13) \
FN_D_##args(14) \
FN_D_##args(15) \
FN_D_##args(16) \
FN_D_##args(17) \
FN_D_##args(18) \
FN_D_##args(19) \
FN_D_##args(20) \
FN_D_##args(21) \
FN_D_##args(22) \
FN_D_##args(23) \
FN_D_##args(24) \
FN_D_##args(25) \
FN_D_##args(26) \
FN_D_##args(27) \
FN_D_##args(28) \
FN_D_##args(29) \
FN_D_##args(30) \
FN_D_##args(31) \
FN_D_##args(32) \
FN_D_##args(33) \
FN_D_##args(34) \
FN_D_##args(35) \
FN_D_##args(36) \
FN_D_##args(37) \
FN_D_##args(38) \
FN_D_##args(39) \
FN_D_##args(40) \
FN_D_##args(41) \
FN_D_##args(42) \
FN_D_##args(43) \
FN_D_##args(44) \
FN_D_##args(45) \
FN_D_##args(46) \
FN_D_##args(47) \
FN_D_##args(48) \
FN_D_##args(49) \
FN_D_##args(50) \
FN_D_##args(51) \
FN_D_##args(52) \
FN_D_##args(53) \
FN_D_##args(54) \
FN_D_##args(55) \
FN_D_##args(56) \
FN_D_##args(57) \
FN_D_##args(58) \
FN_D_##args(59) \
FN_D_##args(60) \
FN_D_##args(61) \
FN_D_##args(62) \
FN_D_##args(63) \
FN_D_##args(64) \
FN_D_##args(65) \
FN_D_##args(66) \
FN_D_##args(67) \
FN_D_##args(68) \
FN_D_##args(69) \
FN_D_##args(70) \
FN_D_##args(71) \
FN_D_##args(72) \
FN_D_##args(73) \
FN_D_##args(74) \
FN_D_##args(75) \
FN_D_##args(76) \
FN_D_##args(77) \
FN_D_##args(78) \
FN_D_##args(79) \
FN_D_##args(80) \
FN_D_##args(81) \
FN_D_##args(82) \
FN_D_##args(83) \
FN_D_##args(84) \
FN_D_##args(85) \
FN_D_##args(86) \
FN_D_##args(87) \
FN_D_##args(88) \
FN_D_##args(89) \
FN_D_##args(90) \
FN_D_##args(91) \
FN_D_##args(92) \
FN_D_##args(93) \
FN_D_##args(94) \
FN_D_##args(95) \
FN_D_##args(96) \
FN_D_##args(97) \
FN_D_##args(98) \
FN_D_##args(99) \
FN_D_##args(100) \
FN_D_##args(101) \
FN_D_##args(102) \
FN_D_##args(103) \
FN_D_##args(104) \
FN_D_##args(105) \
FN_D_##args(106) \
FN_D_##args(107) \
FN_D_##args(108) \
FN_D_##args(109) \
FN_D_##args(110) \
FN_D_##args(111) \
FN_D_##args(112) \
FN_D_##args(113) \
FN_D_##args(114) \
FN_D_##args(115) \
FN_D_##args(116) \
FN_D_##args(117) \
FN_D_##args(118) \
FN_D_##args(119) \
FN_D_##args(120) \
FN_D_##args(121) \
FN_D_##args(122) \
FN_D_##args(123) \
FN_D_##args(124) \
FN_D_##args(125) \
FN_D_##args(126) \
FN_D_##args(127) \
FN_D_##args(128) \
FN_D_##args(129) \
FN_D_##args(130) \
FN_D_##args(131) \
FN_D_##args(132) \
FN_D_##args(133) \
FN_D_##args(134) \
FN_D_##args(135) \
FN_D_##args(136) \
FN_D_##args(137) \
FN_D_##args(138) \
FN_D_##args(139) \
FN_D_##args(140) \
FN_D_##args(141) \
FN_D_##args(142) \
FN_D_##args(143) \
FN_D_##args(144) \
FN_D_##args(145) \
FN_D_##args(146) \
FN_D_##args(147) \
FN_D_##args(148) \
FN_D_##args(149) \
FN_D_##args(150) \
FN_D_##args(151) \
FN_D_##args(152) \
FN_D_##args(153) \
FN_D_##args(154) \
FN_D_##args(155) \
FN_D_##args(156) \
FN_D_##args(157) \
FN_D_##args(158) \
FN_D_##args(159) \
FN_D_##args(160) \
FN_D_##args(161) \
FN_D_##args(162) \
FN_D_##args(163) \
FN_D_##args(164) \
FN_D_##args(165) \
FN_D_##args(166) \
FN_D_##args(167) \
FN_D_##args(168) \
FN_D_##args(169) \
FN_D_##args(170) \
FN_D_##args(171) \
FN_D_##args(172) \
FN_D_##args(173) \
FN_D_##args(174) \
FN_D_##args(175) \
FN_D_##args(176) \
FN_D_##args(177) \
FN_D_##args(178) \
FN_D_##args(179) \
FN_D_##args(180) \
FN_D_##args(181) \
FN_D_##args(182) \
FN_D_##args(183) \
FN_D_##args(184) \
FN_D_##args(185) \
FN_D_##args(186) \
FN_D_##args(187) \
FN_D_##args(188) \
FN_D_##args(189) \
FN_D_##args(190) \
FN_D_##args(191) \
FN_D_##args(192) \
FN_D_##args(193) \
FN_D_##args(194) \
FN_D_##args(195) \
FN_D_##args(196) \
FN_D_##args(197) \
FN_D_##args(198) \
FN_D_##args(199) \
FN_D_##args(200) \
FN_D_##args(201) \
FN_D_##args(202) \
FN_D_##args(203) \
FN_D_##args(204) \
FN_D_##args(205) \
FN_D_##args(206) \
FN_D_##args(207) \
FN_D_##args(208) \
FN_D_##args(209) \
FN_D_##args(210) \
FN_D_##args(211) \
FN_D_##args(212) \
FN_D_##args(213) \
FN_D_##args(214) \
FN_D_##args(215) \
FN_D_##args(216) \
FN_D_##args(217) \
FN_D_##args(218) \
FN_D_##args(219) \
FN_D_##args(220) \
FN_D_##args(221) \
FN_D_##args(222) \
FN_D_##args(223) \
FN_D_##args(224) \
FN_D_##args(225) \
FN_D_##args(226) \
FN_D_##args(227) \
FN_D_##args(228) \
FN_D_##args(229) \
FN_D_##args(230) \
FN_D_##args(231) \
FN_D_##args(232) \
FN_D_##args(233) \
FN_D_##args(234) \
FN_D_##args(235) \
FN_D_##args(236) \
FN_D_##args(237) \
FN_D_##args(238) \
FN_D_##args(239) \
FN_D_##args(240) \
FN_D_##args(241) \
FN_D_##args(242) \
FN_D_##args(243) \
FN_D_##args(244) \
FN_D_##args(245) \
FN_D_##args(246) \
FN_D_##args(247) \
FN_D_##args(248) \
FN_D_##args(249) \
FN_D_##args(250) \
FN_D_##args(251) \
FN_D_##args(252) \
FN_D_##args(253) \
FN_D_##args(254) \
FN_D_##args(255)
#define FN_DOUBLE_A_BLOCK(args) { \
(jlong)FND(0, args), \
(jlong)FND(1, args), \
(jlong)FND(2, args), \
(jlong)FND(3, args), \
(jlong)FND(4, args), \
(jlong)FND(5, args), \
(jlong)FND(6, args), \
(jlong)FND(7, args), \
(jlong)FND(8, args), \
(jlong)FND(9, args), \
(jlong)FND(10, args), \
(jlong)FND(11, args), \
(jlong)FND(12, args), \
(jlong)FND(13, args), \
(jlong)FND(14, args), \
(jlong)FND(15, args), \
(jlong)FND(16, args), \
(jlong)FND(17, args), \
(jlong)FND(18, args), \
(jlong)FND(19, args), \
(jlong)FND(20, args), \
(jlong)FND(21, args), \
(jlong)FND(22, args), \
(jlong)FND(23, args), \
(jlong)FND(24, args), \
(jlong)FND(25, args), \
(jlong)FND(26, args), \
(jlong)FND(27, args), \
(jlong)FND(28, args), \
(jlong)FND(29, args), \
(jlong)FND(30, args), \
(jlong)FND(31, args), \
(jlong)FND(32, args), \
(jlong)FND(33, args), \
(jlong)FND(34, args), \
(jlong)FND(35, args), \
(jlong)FND(36, args), \
(jlong)FND(37, args), \
(jlong)FND(38, args), \
(jlong)FND(39, args), \
(jlong)FND(40, args), \
(jlong)FND(41, args), \
(jlong)FND(42, args), \
(jlong)FND(43, args), \
(jlong)FND(44, args), \
(jlong)FND(45, args), \
(jlong)FND(46, args), \
(jlong)FND(47, args), \
(jlong)FND(48, args), \
(jlong)FND(49, args), \
(jlong)FND(50, args), \
(jlong)FND(51, args), \
(jlong)FND(52, args), \
(jlong)FND(53, args), \
(jlong)FND(54, args), \
(jlong)FND(55, args), \
(jlong)FND(56, args), \
(jlong)FND(57, args), \
(jlong)FND(58, args), \
(jlong)FND(59, args), \
(jlong)FND(60, args), \
(jlong)FND(61, args), \
(jlong)FND(62, args), \
(jlong)FND(63, args), \
(jlong)FND(64, args), \
(jlong)FND(65, args), \
(jlong)FND(66, args), \
(jlong)FND(67, args), \
(jlong)FND(68, args), \
(jlong)FND(69, args), \
(jlong)FND(70, args), \
(jlong)FND(71, args), \
(jlong)FND(72, args), \
(jlong)FND(73, args), \
(jlong)FND(74, args), \
(jlong)FND(75, args), \
(jlong)FND(76, args), \
(jlong)FND(77, args), \
(jlong)FND(78, args), \
(jlong)FND(79, args), \
(jlong)FND(80, args), \
(jlong)FND(81, args), \
(jlong)FND(82, args), \
(jlong)FND(83, args), \
(jlong)FND(84, args), \
(jlong)FND(85, args), \
(jlong)FND(86, args), \
(jlong)FND(87, args), \
(jlong)FND(88, args), \
(jlong)FND(89, args), \
(jlong)FND(90, args), \
(jlong)FND(91, args), \
(jlong)FND(92, args), \
(jlong)FND(93, args), \
(jlong)FND(94, args), \
(jlong)FND(95, args), \
(jlong)FND(96, args), \
(jlong)FND(97, args), \
(jlong)FND(98, args), \
(jlong)FND(99, args), \
(jlong)FND(100, args), \
(jlong)FND(101, args), \
(jlong)FND(102, args), \
(jlong)FND(103, args), \
(jlong)FND(104, args), \
(jlong)FND(105, args), \
(jlong)FND(106, args), \
(jlong)FND(107, args), \
(jlong)FND(108, args), \
(jlong)FND(109, args), \
(jlong)FND(110, args), \
(jlong)FND(111, args), \
(jlong)FND(112, args), \
(jlong)FND(113, args), \
(jlong)FND(114, args), \
(jlong)FND(115, args), \
(jlong)FND(116, args), \
(jlong)FND(117, args), \
(jlong)FND(118, args), \
(jlong)FND(119, args), \
(jlong)FND(120, args), \
(jlong)FND(121, args), \
(jlong)FND(122, args), \
(jlong)FND(123, args), \
(jlong)FND(124, args), \
(jlong)FND(125, args), \
(jlong)FND(126, args), \
(jlong)FND(127, args), \
(jlong)FND(128, args), \
(jlong)FND(129, args), \
(jlong)FND(130, args), \
(jlong)FND(131, args), \
(jlong)FND(132, args), \
(jlong)FND(133, args), \
(jlong)FND(134, args), \
(jlong)FND(135, args), \
(jlong)FND(136, args), \
(jlong)FND(137, args), \
(jlong)FND(138, args), \
(jlong)FND(139, args), \
(jlong)FND(140, args), \
(jlong)FND(141, args), \
(jlong)FND(142, args), \
(jlong)FND(143, args), \
(jlong)FND(144, args), \
(jlong)FND(145, args), \
(jlong)FND(146, args), \
(jlong)FND(147, args), \
(jlong)FND(148, args), \
(jlong)FND(149, args), \
(jlong)FND(150, args), \
(jlong)FND(151, args), \
(jlong)FND(152, args), \
(jlong)FND(153, args), \
(jlong)FND(154, args), \
(jlong)FND(155, args), \
(jlong)FND(156, args), \
(jlong)FND(157, args), \
(jlong)FND(158, args), \
(jlong)FND(159, args), \
(jlong)FND(160, args), \
(jlong)FND(161, args), \
(jlong)FND(162, args), \
(jlong)FND(163, args), \
(jlong)FND(164, args), \
(jlong)FND(165, args), \
(jlong)FND(166, args), \
(jlong)FND(167, args), \
(jlong)FND(168, args), \
(jlong)FND(169, args), \
(jlong)FND(170, args), \
(jlong)FND(171, args), \
(jlong)FND(172, args), \
(jlong)FND(173, args), \
(jlong)FND(174, args), \
(jlong)FND(175, args), \
(jlong)FND(176, args), \
(jlong)FND(177, args), \
(jlong)FND(178, args), \
(jlong)FND(179, args), \
(jlong)FND(180, args), \
(jlong)FND(181, args), \
(jlong)FND(182, args), \
(jlong)FND(183, args), \
(jlong)FND(184, args), \
(jlong)FND(185, args), \
(jlong)FND(186, args), \
(jlong)FND(187, args), \
(jlong)FND(188, args), \
(jlong)FND(189, args), \
(jlong)FND(190, args), \
(jlong)FND(191, args), \
(jlong)FND(192, args), \
(jlong)FND(193, args), \
(jlong)FND(194, args), \
(jlong)FND(195, args), \
(jlong)FND(196, args), \
(jlong)FND(197, args), \
(jlong)FND(198, args), \
(jlong)FND(199, args), \
(jlong)FND(200, args), \
(jlong)FND(201, args), \
(jlong)FND(202, args), \
(jlong)FND(203, args), \
(jlong)FND(204, args), \
(jlong)FND(205, args), \
(jlong)FND(206, args), \
(jlong)FND(207, args), \
(jlong)FND(208, args), \
(jlong)FND(209, args), \
(jlong)FND(210, args), \
(jlong)FND(211, args), \
(jlong)FND(212, args), \
(jlong)FND(213, args), \
(jlong)FND(214, args), \
(jlong)FND(215, args), \
(jlong)FND(216, args), \
(jlong)FND(217, args), \
(jlong)FND(218, args), \
(jlong)FND(219, args), \
(jlong)FND(220, args), \
(jlong)FND(221, args), \
(jlong)FND(222, args), \
(jlong)FND(223, args), \
(jlong)FND(224, args), \
(jlong)FND(225, args), \
(jlong)FND(226, args), \
(jlong)FND(227, args), \
(jlong)FND(228, args), \
(jlong)FND(229, args), \
(jlong)FND(230, args), \
(jlong)FND(231, args), \
(jlong)FND(232, args), \
(jlong)FND(233, args), \
(jlong)FND(234, args), \
(jlong)FND(235, args), \
(jlong)FND(236, args), \
(jlong)FND(237, args), \
(jlong)FND(238, args), \
(jlong)FND(239, args), \
(jlong)FND(240, args), \
(jlong)FND(241, args), \
(jlong)FND(242, args), \
(jlong)FND(243, args), \
(jlong)FND(244, args), \
(jlong)FND(245, args), \
(jlong)FND(246, args), \
(jlong)FND(247, args), \
(jlong)FND(248, args), \
(jlong)FND(249, args), \
(jlong)FND(250, args), \
(jlong)FND(251, args), \
(jlong)FND(252, args), \
(jlong)FND(253, args), \
(jlong)FND(254, args), \
(jlong)FND(255, args), \
},
#else
#define NUM_DOUBLE_CALLBACKS 0
#endif
/**
* 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)
#elif MAX_CALLBACKS == 256
#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) \
FN_##args(128) \
FN_##args(129) \
FN_##args(130) \
FN_##args(131) \
FN_##args(132) \
FN_##args(133) \
FN_##args(134) \
FN_##args(135) \
FN_##args(136) \
FN_##args(137) \
FN_##args(138) \
FN_##args(139) \
FN_##args(140) \
FN_##args(141) \
FN_##args(142) \
FN_##args(143) \
FN_##args(144) \
FN_##args(145) \
FN_##args(146) \
FN_##args(147) \
FN_##args(148) \
FN_##args(149) \
FN_##args(150) \
FN_##args(151) \
FN_##args(152) \
FN_##args(153) \
FN_##args(154) \
FN_##args(155) \
FN_##args(156) \
FN_##args(157) \
FN_##args(158) \
FN_##args(159) \
FN_##args(160) \
FN_##args(161) \
FN_##args(162) \
FN_##args(163) \
FN_##args(164) \
FN_##args(165) \
FN_##args(166) \
FN_##args(167) \
FN_##args(168) \
FN_##args(169) \
FN_##args(170) \
FN_##args(171) \
FN_##args(172) \
FN_##args(173) \
FN_##args(174) \
FN_##args(175) \
FN_##args(176) \
FN_##args(177) \
FN_##args(178) \
FN_##args(179) \
FN_##args(180) \
FN_##args(181) \
FN_##args(182) \
FN_##args(183) \
FN_##args(184) \
FN_##args(185) \
FN_##args(186) \
FN_##args(187) \
FN_##args(188) \
FN_##args(189) \
FN_##args(190) \
FN_##args(191) \
FN_##args(192) \
FN_##args(193) \
FN_##args(194) \
FN_##args(195) \
FN_##args(196) \
FN_##args(197) \
FN_##args(198) \
FN_##args(199) \
FN_##args(200) \
FN_##args(201) \
FN_##args(202) \
FN_##args(203) \
FN_##args(204) \
FN_##args(205) \
FN_##args(206) \
FN_##args(207) \
FN_##args(208) \
FN_##args(209) \
FN_##args(210) \
FN_##args(211) \
FN_##args(212) \
FN_##args(213) \
FN_##args(214) \
FN_##args(215) \
FN_##args(216) \
FN_##args(217) \
FN_##args(218) \
FN_##args(219) \
FN_##args(220) \
FN_##args(221) \
FN_##args(222) \
FN_##args(223) \
FN_##args(224) \
FN_##args(225) \
FN_##args(226) \
FN_##args(227) \
FN_##args(228) \
FN_##args(229) \
FN_##args(230) \
FN_##args(231) \
FN_##args(232) \
FN_##args(233) \
FN_##args(234) \
FN_##args(235) \
FN_##args(236) \
FN_##args(237) \
FN_##args(238) \
FN_##args(239) \
FN_##args(240) \
FN_##args(241) \
FN_##args(242) \
FN_##args(243) \
FN_##args(244) \
FN_##args(245) \
FN_##args(246) \
FN_##args(247) \
FN_##args(248) \
FN_##args(249) \
FN_##args(250) \
FN_##args(251) \
FN_##args(252) \
FN_##args(253) \
FN_##args(254) \
FN_##args(255)
#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)
#if defined(GTK)
FN_DOUBLE_BLOCK(4) /* JDDJ */
FN_DOUBLE_BLOCK(5) /* JJDDJ */
#endif
/**
* 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) { \
(jlong)FN(0, args), \
(jlong)FN(1, args), \
(jlong)FN(2, args), \
(jlong)FN(3, args), \
(jlong)FN(4, args), \
(jlong)FN(5, args), \
(jlong)FN(6, args), \
(jlong)FN(7, args), \
(jlong)FN(8, args), \
(jlong)FN(9, args), \
(jlong)FN(10, args), \
(jlong)FN(11, args), \
(jlong)FN(12, args), \
(jlong)FN(13, args), \
(jlong)FN(14, args), \
(jlong)FN(15, args), \
},
#elif MAX_CALLBACKS == 128
#define FN_A_BLOCK(args) { \
(jlong)FN(0, args), \
(jlong)FN(1, args), \
(jlong)FN(2, args), \
(jlong)FN(3, args), \
(jlong)FN(4, args), \
(jlong)FN(5, args), \
(jlong)FN(6, args), \
(jlong)FN(7, args), \
(jlong)FN(8, args), \
(jlong)FN(9, args), \
(jlong)FN(10, args), \
(jlong)FN(11, args), \
(jlong)FN(12, args), \
(jlong)FN(13, args), \
(jlong)FN(14, args), \
(jlong)FN(15, args), \
(jlong)FN(16, args), \
(jlong)FN(17, args), \
(jlong)FN(18, args), \
(jlong)FN(19, args), \
(jlong)FN(20, args), \
(jlong)FN(21, args), \
(jlong)FN(22, args), \
(jlong)FN(23, args), \
(jlong)FN(24, args), \
(jlong)FN(25, args), \
(jlong)FN(26, args), \
(jlong)FN(27, args), \
(jlong)FN(28, args), \
(jlong)FN(29, args), \
(jlong)FN(30, args), \
(jlong)FN(31, args), \
(jlong)FN(32, args), \
(jlong)FN(33, args), \
(jlong)FN(34, args), \
(jlong)FN(35, args), \
(jlong)FN(36, args), \
(jlong)FN(37, args), \
(jlong)FN(38, args), \
(jlong)FN(39, args), \
(jlong)FN(40, args), \
(jlong)FN(41, args), \
(jlong)FN(42, args), \
(jlong)FN(43, args), \
(jlong)FN(44, args), \
(jlong)FN(45, args), \
(jlong)FN(46, args), \
(jlong)FN(47, args), \
(jlong)FN(48, args), \
(jlong)FN(49, args), \
(jlong)FN(50, args), \
(jlong)FN(51, args), \
(jlong)FN(52, args), \
(jlong)FN(53, args), \
(jlong)FN(54, args), \
(jlong)FN(55, args), \
(jlong)FN(56, args), \
(jlong)FN(57, args), \
(jlong)FN(58, args), \
(jlong)FN(59, args), \
(jlong)FN(60, args), \
(jlong)FN(61, args), \
(jlong)FN(62, args), \
(jlong)FN(63, args), \
(jlong)FN(64, args), \
(jlong)FN(65, args), \
(jlong)FN(66, args), \
(jlong)FN(67, args), \
(jlong)FN(68, args), \
(jlong)FN(69, args), \
(jlong)FN(70, args), \
(jlong)FN(71, args), \
(jlong)FN(72, args), \
(jlong)FN(73, args), \
(jlong)FN(74, args), \
(jlong)FN(75, args), \
(jlong)FN(76, args), \
(jlong)FN(77, args), \
(jlong)FN(78, args), \
(jlong)FN(79, args), \
(jlong)FN(80, args), \
(jlong)FN(81, args), \
(jlong)FN(82, args), \
(jlong)FN(83, args), \
(jlong)FN(84, args), \
(jlong)FN(85, args), \
(jlong)FN(86, args), \
(jlong)FN(87, args), \
(jlong)FN(88, args), \
(jlong)FN(89, args), \
(jlong)FN(90, args), \
(jlong)FN(91, args), \
(jlong)FN(92, args), \
(jlong)FN(93, args), \
(jlong)FN(94, args), \
(jlong)FN(95, args), \
(jlong)FN(96, args), \
(jlong)FN(97, args), \
(jlong)FN(98, args), \
(jlong)FN(99, args), \
(jlong)FN(100, args), \
(jlong)FN(101, args), \
(jlong)FN(102, args), \
(jlong)FN(103, args), \
(jlong)FN(104, args), \
(jlong)FN(105, args), \
(jlong)FN(106, args), \
(jlong)FN(107, args), \
(jlong)FN(108, args), \
(jlong)FN(109, args), \
(jlong)FN(110, args), \
(jlong)FN(111, args), \
(jlong)FN(112, args), \
(jlong)FN(113, args), \
(jlong)FN(114, args), \
(jlong)FN(115, args), \
(jlong)FN(116, args), \
(jlong)FN(117, args), \
(jlong)FN(118, args), \
(jlong)FN(119, args), \
(jlong)FN(120, args), \
(jlong)FN(121, args), \
(jlong)FN(122, args), \
(jlong)FN(123, args), \
(jlong)FN(124, args), \
(jlong)FN(125, args), \
(jlong)FN(126, args), \
(jlong)FN(127, args), \
},
#elif MAX_CALLBACKS == 256
#define FN_A_BLOCK(args) { \
(jlong)FN(0, args), \
(jlong)FN(1, args), \
(jlong)FN(2, args), \
(jlong)FN(3, args), \
(jlong)FN(4, args), \
(jlong)FN(5, args), \
(jlong)FN(6, args), \
(jlong)FN(7, args), \
(jlong)FN(8, args), \
(jlong)FN(9, args), \
(jlong)FN(10, args), \
(jlong)FN(11, args), \
(jlong)FN(12, args), \
(jlong)FN(13, args), \
(jlong)FN(14, args), \
(jlong)FN(15, args), \
(jlong)FN(16, args), \
(jlong)FN(17, args), \
(jlong)FN(18, args), \
(jlong)FN(19, args), \
(jlong)FN(20, args), \
(jlong)FN(21, args), \
(jlong)FN(22, args), \
(jlong)FN(23, args), \
(jlong)FN(24, args), \
(jlong)FN(25, args), \
(jlong)FN(26, args), \
(jlong)FN(27, args), \
(jlong)FN(28, args), \
(jlong)FN(29, args), \
(jlong)FN(30, args), \
(jlong)FN(31, args), \
(jlong)FN(32, args), \
(jlong)FN(33, args), \
(jlong)FN(34, args), \
(jlong)FN(35, args), \
(jlong)FN(36, args), \
(jlong)FN(37, args), \
(jlong)FN(38, args), \
(jlong)FN(39, args), \
(jlong)FN(40, args), \
(jlong)FN(41, args), \
(jlong)FN(42, args), \
(jlong)FN(43, args), \
(jlong)FN(44, args), \
(jlong)FN(45, args), \
(jlong)FN(46, args), \
(jlong)FN(47, args), \
(jlong)FN(48, args), \
(jlong)FN(49, args), \
(jlong)FN(50, args), \
(jlong)FN(51, args), \
(jlong)FN(52, args), \
(jlong)FN(53, args), \
(jlong)FN(54, args), \
(jlong)FN(55, args), \
(jlong)FN(56, args), \
(jlong)FN(57, args), \
(jlong)FN(58, args), \
(jlong)FN(59, args), \
(jlong)FN(60, args), \
(jlong)FN(61, args), \
(jlong)FN(62, args), \
(jlong)FN(63, args), \
(jlong)FN(64, args), \
(jlong)FN(65, args), \
(jlong)FN(66, args), \
(jlong)FN(67, args), \
(jlong)FN(68, args), \
(jlong)FN(69, args), \
(jlong)FN(70, args), \
(jlong)FN(71, args), \
(jlong)FN(72, args), \
(jlong)FN(73, args), \
(jlong)FN(74, args), \
(jlong)FN(75, args), \
(jlong)FN(76, args), \
(jlong)FN(77, args), \
(jlong)FN(78, args), \
(jlong)FN(79, args), \
(jlong)FN(80, args), \
(jlong)FN(81, args), \
(jlong)FN(82, args), \
(jlong)FN(83, args), \
(jlong)FN(84, args), \
(jlong)FN(85, args), \
(jlong)FN(86, args), \
(jlong)FN(87, args), \
(jlong)FN(88, args), \
(jlong)FN(89, args), \
(jlong)FN(90, args), \
(jlong)FN(91, args), \
(jlong)FN(92, args), \
(jlong)FN(93, args), \
(jlong)FN(94, args), \
(jlong)FN(95, args), \
(jlong)FN(96, args), \
(jlong)FN(97, args), \
(jlong)FN(98, args), \
(jlong)FN(99, args), \
(jlong)FN(100, args), \
(jlong)FN(101, args), \
(jlong)FN(102, args), \
(jlong)FN(103, args), \
(jlong)FN(104, args), \
(jlong)FN(105, args), \
(jlong)FN(106, args), \
(jlong)FN(107, args), \
(jlong)FN(108, args), \
(jlong)FN(109, args), \
(jlong)FN(110, args), \
(jlong)FN(111, args), \
(jlong)FN(112, args), \
(jlong)FN(113, args), \
(jlong)FN(114, args), \
(jlong)FN(115, args), \
(jlong)FN(116, args), \
(jlong)FN(117, args), \
(jlong)FN(118, args), \
(jlong)FN(119, args), \
(jlong)FN(120, args), \
(jlong)FN(121, args), \
(jlong)FN(122, args), \
(jlong)FN(123, args), \
(jlong)FN(124, args), \
(jlong)FN(125, args), \
(jlong)FN(126, args), \
(jlong)FN(127, args), \
(jlong)FN(128, args), \
(jlong)FN(129, args), \
(jlong)FN(130, args), \
(jlong)FN(131, args), \
(jlong)FN(132, args), \
(jlong)FN(133, args), \
(jlong)FN(134, args), \
(jlong)FN(135, args), \
(jlong)FN(136, args), \
(jlong)FN(137, args), \
(jlong)FN(138, args), \
(jlong)FN(139, args), \
(jlong)FN(140, args), \
(jlong)FN(141, args), \
(jlong)FN(142, args), \
(jlong)FN(143, args), \
(jlong)FN(144, args), \
(jlong)FN(145, args), \
(jlong)FN(146, args), \
(jlong)FN(147, args), \
(jlong)FN(148, args), \
(jlong)FN(149, args), \
(jlong)FN(150, args), \
(jlong)FN(151, args), \
(jlong)FN(152, args), \
(jlong)FN(153, args), \
(jlong)FN(154, args), \
(jlong)FN(155, args), \
(jlong)FN(156, args), \
(jlong)FN(157, args), \
(jlong)FN(158, args), \
(jlong)FN(159, args), \
(jlong)FN(160, args), \
(jlong)FN(161, args), \
(jlong)FN(162, args), \
(jlong)FN(163, args), \
(jlong)FN(164, args), \
(jlong)FN(165, args), \
(jlong)FN(166, args), \
(jlong)FN(167, args), \
(jlong)FN(168, args), \
(jlong)FN(169, args), \
(jlong)FN(170, args), \
(jlong)FN(171, args), \
(jlong)FN(172, args), \
(jlong)FN(173, args), \
(jlong)FN(174, args), \
(jlong)FN(175, args), \
(jlong)FN(176, args), \
(jlong)FN(177, args), \
(jlong)FN(178, args), \
(jlong)FN(179, args), \
(jlong)FN(180, args), \
(jlong)FN(181, args), \
(jlong)FN(182, args), \
(jlong)FN(183, args), \
(jlong)FN(184, args), \
(jlong)FN(185, args), \
(jlong)FN(186, args), \
(jlong)FN(187, args), \
(jlong)FN(188, args), \
(jlong)FN(189, args), \
(jlong)FN(190, args), \
(jlong)FN(191, args), \
(jlong)FN(192, args), \
(jlong)FN(193, args), \
(jlong)FN(194, args), \
(jlong)FN(195, args), \
(jlong)FN(196, args), \
(jlong)FN(197, args), \
(jlong)FN(198, args), \
(jlong)FN(199, args), \
(jlong)FN(200, args), \
(jlong)FN(201, args), \
(jlong)FN(202, args), \
(jlong)FN(203, args), \
(jlong)FN(204, args), \
(jlong)FN(205, args), \
(jlong)FN(206, args), \
(jlong)FN(207, args), \
(jlong)FN(208, args), \
(jlong)FN(209, args), \
(jlong)FN(210, args), \
(jlong)FN(211, args), \
(jlong)FN(212, args), \
(jlong)FN(213, args), \
(jlong)FN(214, args), \
(jlong)FN(215, args), \
(jlong)FN(216, args), \
(jlong)FN(217, args), \
(jlong)FN(218, args), \
(jlong)FN(219, args), \
(jlong)FN(220, args), \
(jlong)FN(221, args), \
(jlong)FN(222, args), \
(jlong)FN(223, args), \
(jlong)FN(224, args), \
(jlong)FN(225, args), \
(jlong)FN(226, args), \
(jlong)FN(227, args), \
(jlong)FN(228, args), \
(jlong)FN(229, args), \
(jlong)FN(230, args), \
(jlong)FN(231, args), \
(jlong)FN(232, args), \
(jlong)FN(233, args), \
(jlong)FN(234, args), \
(jlong)FN(235, args), \
(jlong)FN(236, args), \
(jlong)FN(237, args), \
(jlong)FN(238, args), \
(jlong)FN(239, args), \
(jlong)FN(240, args), \
(jlong)FN(241, args), \
(jlong)FN(242, args), \
(jlong)FN(243, args), \
(jlong)FN(244, args), \
(jlong)FN(245, args), \
(jlong)FN(246, args), \
(jlong)FN(247, args), \
(jlong)FN(248, args), \
(jlong)FN(249, args), \
(jlong)FN(250, args), \
(jlong)FN(251, args), \
(jlong)FN(252, args), \
(jlong)FN(253, args), \
(jlong)FN(254, args), \
(jlong)FN(255, args), \
},
#else
#error Invalid MAX_CALLBACKS
#endif /* MAX_CALLBACKS == 16 */
jlong fnx_array[MAX_ARGS+1+NUM_DOUBLE_CALLBACKS][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)
#if defined(GTK)
FN_DOUBLE_A_BLOCK(4)
FN_DOUBLE_A_BLOCK(5)
#endif
};
void initialize_mid_Throwable_addSuppressed(JNIEnv* env)
{
jclass classThrowable = NULL;
classThrowable = (*env)->FindClass(env, "java/lang/Throwable");
if (!classThrowable || (*env)->ExceptionCheck(env)) {
/* Shall never happen, but let's still try to handle it */
fprintf(stderr, "SWT-JNI: ERROR(%d): Failed to resolve 'java/lang/Throwable'\n", __LINE__);
fflush(stderr);
(*env)->ExceptionClear(env);
return;
}
mid_Throwable_addSuppressed = (*env)->GetMethodID(env, classThrowable, "addSuppressed", "(Ljava/lang/Throwable;)V");
if (!mid_Throwable_addSuppressed || (*env)->ExceptionCheck(env))
{
/* Shall never happen, but let's still try to handle it */
fprintf(stderr, "SWT-JNI: ERROR(%d): Failed to resolve 'addSuppressed' in 'java/lang/Throwable'\n", __LINE__);
fflush(stderr);
(*env)->ExceptionClear(env);
return;
}
}
void initialize(JNIEnv* env)
{
if (initialized) return;
memset(&callbackData, 0, sizeof(callbackData));
initialize_mid_Throwable_addSuppressed(env);
initialized = 1;
}
/* --------------- callback class calls --------------- */
JNIEXPORT jlong JNICALL CALLBACK_NATIVE(bind)
(JNIEnv *env, jclass that, jobject callbackObject, jobject object, jstring method, jstring signature, jint argCount, jboolean isStatic, jboolean isArrayBased, jlong errorResult)
{
int i;
jmethodID mid = NULL;
jclass javaClass = that;
const char *methodString = NULL, *sigString = NULL;
jlong result = 0;
initialize(env);
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 (mid == 0) goto fail;
for (i=0; iNewGlobalRef(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;
#ifdef DEBUG_CALL_PRINTS
#if defined(COCOA)
callbackData[i].arg_Selector = -1;
if (!strcmp(methodString, "applicationProc") ||
!strcmp(methodString, "dragSourceProc") ||
!strcmp(methodString, "windowProc") ||
!strcmp(methodString, "dialogProc"))
{
callbackData[i].arg_Selector = 1;
}
#elif defined(GTK)
callbackData[i].arg_GObject = -1;
callbackData[i].arg_GdkEvent = -1;
callbackData[i].arg_SwtSignalID = -1;
if (!strcmp(methodString, "windowProc")) {
callbackData[i].arg_GObject = 0;
callbackData[i].arg_SwtSignalID = argCount - 1;
}
if (!strcmp(methodString, "eventProc")) {
callbackData[i].arg_GdkEvent = 0;
}
#endif
fprintf(stderr, "SWT-JNI: Registered callback[%02d] = %s%s\n", i, methodString, sigString);
fflush(stderr);
#endif
#if defined(GTK)
if (strcmp(strtok((char *)sigString, ")"), "(JDDJ") == 0) {
result = (jlong) fnx_array[MAX_ARGS + 1][i];
} else if (strcmp(strtok((char *)sigString, ")"), "(JIDDJ") == 0) {
result = (jlong) fnx_array[MAX_ARGS + 2][i];
} else {
result = (jlong) fnx_array[argCount][i];
}
#else
result = (jlong) fnx_array[argCount][i];
#endif
break;
}
}
fail:
if (method && methodString) (*env)->ReleaseStringUTFChars(env, method, methodString);
if (signature && sigString) (*env)->ReleaseStringUTFChars(env, signature, sigString);
return result;
}
JNIEXPORT void JNICALL CALLBACK_NATIVE(unbind)
(JNIEnv *env, jclass that, jobject callback)
{
/* Suppress warning about unreferenced parameter */
(void)that;
int i;
for (i=0; iIsSameObject(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 CALLBACK_NATIVE(getEnabled)
(JNIEnv *env, jclass that)
{
/* Suppress warnings about unreferenced parameters */
(void)env;
(void)that;
return (jboolean)callbackEnabled;
}
JNIEXPORT jint JNICALL CALLBACK_NATIVE(getEntryCount)
(JNIEnv *env, jclass that)
{
/* Suppress warnings about unreferenced parameters */
(void)env;
(void)that;
return (jint)callbackEntryCount;
}
JNIEXPORT void JNICALL CALLBACK_NATIVE(setEnabled)
(JNIEnv *env, jclass that, jboolean enable)
{
/* Suppress warnings about unreferenced parameters */
(void)env;
(void)that;
callbackEnabled = enable;
}
JNIEXPORT void JNICALL CALLBACK_NATIVE(reset)
(JNIEnv *env, jclass that)
{
/* Suppress warnings about unreferenced parameters */
(void)env;
(void)that;
memset((void *)&callbackData, 0, sizeof(callbackData));
}
#if (defined(DEBUG_CALL_PRINTS) && defined(GTK))
const char* glibTypeNameFromInstance(void* object) {
static int isInitialized = 0;
static const char* (*g_type_name_from_instance)(void*) = 0;
if (!isInitialized) {
/* Do not dlclose(gobjectHandle); we're going to continue using the library */
void* gobjectHandle = dlopen("libgobject-2.0.so.0", RTLD_LAZY);
if (gobjectHandle)
g_type_name_from_instance = dlsym(gobjectHandle, "g_type_name_from_instance");
isInitialized = 1;
}
if (!g_type_name_from_instance)
return "";
return g_type_name_from_instance(object);
}
const char* swtSignalNameFromId(int id) {
/* Adapted from constants in org.eclipse.swt.widgets.Widget */
switch (id) {
case 1: return "ACTIVATE";
case 2: return "BUTTON_PRESS_EVENT";
case 3: return "BUTTON_PRESS_EVENT_INVERSE";
case 4: return "BUTTON_RELEASE_EVENT";
case 5: return "BUTTON_RELEASE_EVENT_INVERSE";
case 6: return "CHANGED";
case 7: return "CHANGE_VALUE";
case 8: return "CLICKED";
case 9: return "COMMIT";
case 10: return "CONFIGURE_EVENT";
case 11: return "DELETE_EVENT";
case 12: return "DELETE_RANGE";
case 13: return "DELETE_TEXT";
case 14: return "ENTER_NOTIFY_EVENT";
case 15: return "EVENT";
case 16: return "EVENT_AFTER";
case 17: return "EXPAND_COLLAPSE_CURSOR_ROW";
case 18: return "EXPOSE_EVENT";
case 19: return "EXPOSE_EVENT_INVERSE";
case 20: return "FOCUS";
case 21: return "FOCUS_IN_EVENT";
case 22: return "FOCUS_OUT_EVENT";
case 23: return "GRAB_FOCUS";
case 24: return "HIDE";
case 25: return "INPUT";
case 26: return "INSERT_TEXT";
case 27: return "KEY_PRESS_EVENT";
case 28: return "KEY_RELEASE_EVENT";
case 29: return "LEAVE_NOTIFY_EVENT";
case 30: return "MAP";
case 31: return "MAP_EVENT";
case 32: return "MNEMONIC_ACTIVATE";
case 33: return "MOTION_NOTIFY_EVENT";
case 34: return "MOTION_NOTIFY_EVENT_INVERSE";
case 35: return "MOVE_FOCUS";
case 36: return "OUTPUT";
case 37: return "POPULATE_POPUP";
case 38: return "POPUP_MENU";
case 39: return "PREEDIT_CHANGED";
case 40: return "REALIZE";
case 41: return "ROW_ACTIVATED";
case 42: return "SCROLL_CHILD";
case 43: return "SCROLL_EVENT";
case 44: return "SELECT";
case 45: return "SHOW";
case 46: return "SHOW_HELP";
case 47: return "SIZE_ALLOCATE";
case 48: return "STYLE_UPDATED";
case 49: return "SWITCH_PAGE";
case 50: return "TEST_COLLAPSE_ROW";
case 51: return "TEST_EXPAND_ROW";
case 52: return "TEXT_BUFFER_INSERT_TEXT";
case 53: return "TOGGLED";
case 54: return "UNMAP";
case 55: return "UNMAP_EVENT";
case 56: return "UNREALIZE";
case 57: return "VALUE_CHANGED";
case 59: return "WINDOW_STATE_EVENT";
case 60: return "ACTIVATE_INVERSE";
case 61: return "DAY_SELECTED";
case 62: return "MONTH_CHANGED";
case 63: return "STATUS_ICON_POPUP_MENU";
case 64: return "ROW_INSERTED";
case 65: return "ROW_DELETED";
case 66: return "DAY_SELECTED_DOUBLE_CLICK";
case 67: return "ICON_RELEASE";
case 68: return "SELECTION_DONE";
case 69: return "START_INTERACTIVE_SEARCH";
case 70: return "BACKSPACE";
case 71: return "BACKSPACE_INVERSE";
case 72: return "COPY_CLIPBOARD";
case 73: return "COPY_CLIPBOARD_INVERSE";
case 74: return "CUT_CLIPBOARD";
case 75: return "CUT_CLIPBOARD_INVERSE";
case 76: return "PASTE_CLIPBOARD";
case 77: return "PASTE_CLIPBOARD_INVERSE";
case 78: return "DELETE_FROM_CURSOR";
case 79: return "DELETE_FROM_CURSOR_INVERSE";
case 80: return "MOVE_CURSOR";
case 81: return "MOVE_CURSOR_INVERSE";
case 82: return "DIRECTION_CHANGED";
case 83: return "CREATE_MENU_PROXY";
case 84: return "ROW_HAS_CHILD_TOGGLED";
case 85: return "POPPED_UP";
case 86: return "FOCUS_IN";
case 87: return "FOCUS_OUT";
case 88: return "IM_UPDATE";
case 89: return "KEY_PRESSED";
case 90: return "KEY_RELEASED";
case 91: return "DECELERATE";
case 92: return "SCROLL";
case 93: return "SCROLL_BEGIN";
case 94: return "SCROLL_END";
case 95: return "ENTER";
case 96: return "LEAVE";
case 97: return "MOTION";
case 98: return "MOTION_INVERSE";
case 99: return "CLOSE_REQUEST";
case 100: return "GESTURE_PRESSED";
case 101: return "GESTURE_RELEASED";
case 102: return "NOTIFY_STATE";
case 103: return "SIZE_ALLOCATE_GTK4";
case 104: return "DPI_CHANGED";
}
return 0;
}
#endif
jlong 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;
jlong result = callbackData[index].errorResult;
jthrowable oldException = NULL;
jthrowable curException = NULL;
int detach = 0;
va_list vl;
va_start(vl, index);
#ifdef DEBUG_CALL_PRINTS
{
int i;
va_list vaCopy;
va_copy(vaCopy, vl);
counter++;
fprintf(stderr, "SWT-JNI:%*scallback[%d](", counter, "", index);
for (i=0; itype,
event->window,
glibTypeNameFromInstance(event->window)
);
isPrinted = 1;
}
if (!isPrinted && (i == callbackData[index].arg_SwtSignalID)) {
int signalID = (int)(long long)arg;
const char* signalName = swtSignalNameFromId(signalID);
if (signalName)
fprintf(stderr, "%s ", signalName);
else
fprintf(stderr, "%d ", signalID);
isPrinted = 1;
}
#endif
if (!isPrinted)
fprintf(stderr, "%p ", arg);
}
fprintf(stderr, ") {\n");
fflush(stderr);
va_end(vaCopy);
}
#endif
(*JVM)->GetEnv(JVM, (void **)&env, JNI_VERSION_10);
if (env == NULL) {
(*JVM)->AttachCurrentThreadAsDaemon(JVM, (void **)&env, NULL);
#ifdef DEBUG_CALL_PRINTS
fprintf(stderr, "SWT-JNI: AttachCurrentThreadAsDaemon\n");
#endif
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, "SWT-JNI:%*s ERROR(%d): (env == NULL)\n", counter, "", __LINE__);
fflush(stderr);
#endif
goto noEnv;
}
/*
* Bug 562408: Sometimes a single native API can call multiple callbacks.
* Java side of the callback might throw an exception for one of such
* callbacks. The exception will stay until it can be delivered, that is,
* until execution returns from native API back to Java. This leaves us
* with the following options for concurrent callbacks:
* 1) Do nothing
* Since the exception is still pending on JVM's thread, attempts to
* call another Java callback will just immediately terminate on the
* same exception. Hence the callback will not be executed. But caller's
* contract does not always allow callback to be silently skipped. This
* sometimes causes caller to crash JVM and/or do something weird.
* 2) Early-return from this function
* This is basically the same as (1).
* 3) Temporarily put the exception aside
* This allows the new callback to execute independently. Note that it
* can throw as well.
* Here, option (3) is implemented.
*/
oldException = (*env)->ExceptionOccurred(env);
if (oldException) {
#ifdef DEBUG_CALL_PRINTS
fprintf(stderr, "SWT-JNI:%*s ERROR(%d): (*env)->ExceptionOccurred()\n", counter, "", __LINE__);
fflush(stderr);
#endif
(*env)->ExceptionClear(env);
}
/* Call into the VM. */
ATOMIC_INC(callbackEntryCount);
if (isArrayBased) {
int i;
jlongArray argsArray = (*env)->NewLongArray(env, argCount);
if (argsArray != NULL) {
jlong *elements = (*env)->GetLongArrayElements(env, argsArray, NULL);
if (elements != NULL) {
for (i=0; iReleaseLongArrayElements(env, argsArray, elements, 0);
if (isStatic) {
result = (*env)->CallStaticLongMethod(env, object, mid, argsArray);
} else {
result = (*env)->CallLongMethod(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)->CallStaticLongMethodV(env, object, mid, vl);
} else {
result = (*env)->CallLongMethodV(env, object, mid, vl);
}
}
ATOMIC_DEC(callbackEntryCount);
va_end(vl);
/* Handle exceptions in Java side of the callback */
curException = (*env)->ExceptionOccurred(env);
if (curException) {
if (oldException && mid_Throwable_addSuppressed) {
/*
* Current exception needs to be cleared to be able to use
* CallVoidMethod() below. That's fine because old exception will
* be re-thrown soon and the current one is no longer needed.
*/
(*env)->ExceptionClear(env);
/*
* If there's an old exception already, attach the new exception as
* 'Throwable.addSuppressed()' in old exception. Java has suppressed
* exceptions exactly for such cases where additional exceptions
* occur while delivering the first one.
*/
(*env)->CallVoidMethod(env, oldException, mid_Throwable_addSuppressed, curException);
}
/* See comment for DeleteLocalRef() below */
(*env)->DeleteLocalRef(env, curException);
#ifdef DEBUG_CALL_PRINTS
fprintf(stderr, "SWT-JNI:%*s ERROR(%d): (*env)->ExceptionOccurred()\n", counter, "", __LINE__);
fflush(stderr);
/*
* WARNING: ExceptionDescribe() also clears exception as if it never happened.
* Don't do this because it changes the behavior of debugged program significantly.
(*env)->ExceptionDescribe(env);
*/
#endif
/*
* We don't have a return value because Java side terminated with an
* exception. Use a predetermined per-callback value and hope that
* caller won't die on it.
*/
result = callbackData[index].errorResult;
}
/* Rethrow the old exception, if any */
if (oldException) {
(*env)->Throw(env, oldException);
/*
* Every ExceptionOccurred() creates a new local reference, and JVM asks to
* avoid having many of these at once. If there's a bunch of callbacks called
* by a single native API and one of them throws exception, then every
* subsequent callback will add another reference. The problem can be seen
* with '-Xcheck:jni', for example with snippet for 'SWT.Arm' from Bug 562408.
* The solution is to properly clean up these references.
*/
(*env)->DeleteLocalRef(env, oldException);
}
if (detach) {
(*JVM)->DetachCurrentThread(JVM);
#ifdef DEBUG_CALL_PRINTS
fprintf(stderr, "SWT-JNI: DetachCurrentThread\n");
#endif
env = NULL;
}
noEnv:
#ifdef DEBUG_CALL_PRINTS
fprintf(stderr, "SWT-JNI:%*s} ret=%p\n", counter, "", (void*)result);
fflush(stderr);
counter--;
#endif
return result;
}
/* ------------- callback class calls end --------------- */
© 2015 - 2025 Weber Informatics LLC | Privacy Policy