rjb 1.4.5 → 1.4.6

Sign up to get free protection for your applications and to get access to all the features.
data/ext/rjb.h CHANGED
@@ -1,164 +1,164 @@
1
- /*
2
- * Rjb - Ruby <-> Java Bridge
3
- * Copyright(c) 2004,2005 arton
4
- *
5
- * This library is free software; you can redistribute it and/or
6
- * modify it under the terms of the GNU Lesser General Public
7
- * License as published by the Free Software Foundation; either
8
- * version 2.1 of the License, or (at your option) any later version.
9
- *
10
- * This library is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
- * Lesser General Public License for more details.
14
- *
15
- * $Id: rjb.h 180 2011-12-05 16:34:29Z arton $
16
- * $Log: rjb.h,v $
17
- * Revision 1.1 2005/01/16 17:36:10 arton
18
- * Initial revision
19
- *
20
- *
21
- */
22
-
23
- #ifndef RJB_H
24
- #define RJB_H
25
-
26
- #if RJB_RUBY_VERSION_CODE < 190
27
- #if !defined(RHASH_TBL)
28
- #define RHASH_TBL(x) RHASH((x))->tbl
29
- #endif
30
- #endif
31
-
32
- #if !defined(RSTRING_LEN)
33
- #define RSTRING_LEN(s) (RSTRING(s)->len)
34
- #endif
35
- #if !defined(RSTRING_PTR)
36
- #define RSTRING_PTR(s) (RSTRING(s)->ptr)
37
- #endif
38
- #if !defined(RARRAY_LEN)
39
- #define RARRAY_LEN(s) (RARRAY(s)->len)
40
- #endif
41
- #if !defined(RARRAY_PTR)
42
- #define RARRAY_PTR(s) (RARRAY(s)->ptr)
43
- #endif
44
-
45
- #if !defined(COUNTOF)
46
- #define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
47
- #endif
48
-
49
- #if !defined(_I64_MIN)
50
- #define _I64_MIN (-9223372036854775807i64 - 1)
51
- #endif
52
- #if !defined(_I64_MAX)
53
- #define _I64_MAX 9223372036854775807i64
54
- #endif
55
-
56
- #if !defined(HAVE_LONG_LONG) && defined(__LP64__)
57
- #define HAVE_LONG_LONG 1
58
- #endif
59
-
60
- /* in load.c */
61
- extern int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs*, char*, VALUE);
62
-
63
- /* in rjb.c */
64
- extern JavaVM* rjb_jvm;
65
- extern jclass rjb_rbridge;
66
- extern jmethodID rjb_register_bridge;
67
- extern VALUE rjb_loaded_classes;
68
- extern jmethodID rjb_class_getName;
69
- extern jclass rjb_j_throwable;
70
- extern jmethodID rjb_throwable_getMessage;
71
- extern JNIEnv* rjb_attach_current_thread(void);
72
- extern jclass rjb_find_class(JNIEnv* jenv, VALUE name);
73
- extern void rjb_release_string(JNIEnv *jenv, jstring str, const char* chrs);
74
- extern VALUE rjb_load_vm_default();
75
- extern void rjb_unload_vm();
76
- extern VALUE rjb_safe_funcall(VALUE args);
77
- extern VALUE jv2rv(JNIEnv* jenv, jvalue val);
78
- extern jobject get_systemloader(JNIEnv* jenv);
79
- extern jclass rjb_find_class_by_name(JNIEnv* jenv, const char* name);
80
-
81
- /* in rjbexception.c */
82
- extern VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str);
83
- extern void rjb_check_exception(JNIEnv* jenv, int t);
84
- extern VALUE rjb_s_throw(int, VALUE*, VALUE);
85
-
86
- /* conversion functions */
87
- typedef void (*R2J)(JNIEnv*, VALUE, jvalue*, const char*, int);
88
- typedef VALUE (*J2R)(JNIEnv*, jvalue);
89
- typedef jarray (*R2JARRAY)(JNIEnv*, VALUE, const char*);
90
- typedef void (JNICALL *RELEASEARRAY)(JNIEnv*, jobject, void*, jint);
91
- typedef jlong (JNICALL *INVOKEAL)(JNIEnv*, jobject, jmethodID, const jvalue*);
92
- typedef jdouble (JNICALL *INVOKEAD)(JNIEnv*, jobject, jmethodID, const jvalue*);
93
- typedef jfloat (JNICALL *INVOKEAF)(JNIEnv*, jobject, jmethodID, const jvalue*);
94
- typedef jboolean (JNICALL *INVOKEAZ)(JNIEnv*, jobject, jmethodID, const jvalue*);
95
- typedef jshort (JNICALL *INVOKEAS)(JNIEnv*, jobject, jmethodID, const jvalue*);
96
- typedef jobject (JNICALL *INVOKEA)(JNIEnv*, jobject, jmethodID, const jvalue*);
97
- typedef VALUE (*CONV)(JNIEnv*, void*);
98
-
99
- /*
100
- * internal method class
101
- */
102
- struct cls_constructor {
103
- jmethodID id;
104
- int arg_count;
105
- R2J* arg_convert;
106
- char* method_signature;
107
- char result_signature;
108
- char result_arraydepth;
109
- };
110
-
111
- struct cls_method {
112
- struct cls_constructor basic;
113
- ID name;
114
- int static_method;
115
- off_t method;
116
- J2R result_convert;
117
- /* overload only */
118
- struct cls_method* next;
119
- };
120
-
121
- /*
122
- * internal field class
123
- */
124
- struct cls_field {
125
- ID name;
126
- jfieldID id;
127
- char* field_signature;
128
- char result_signature;
129
- char result_arraydepth;
130
- R2J arg_convert;
131
- J2R value_convert;
132
- int readonly;
133
- int static_field;
134
- };
135
-
136
- /*
137
- * Object instance
138
- */
139
- struct jvi_data {
140
- jclass klass; /* class */
141
- jobject obj; /* instance */
142
- st_table* methods;
143
- st_table* fields;
144
- };
145
-
146
- /*
147
- * Class instance
148
- */
149
- struct jv_data {
150
- struct jvi_data idata;
151
- st_table* static_methods;
152
- struct cls_constructor** constructors;
153
- };
154
-
155
- /*
156
- * Bridge instance
157
- */
158
- struct rj_bridge {
159
- jobject bridge;
160
- jobject proxy;
161
- VALUE wrapped;
162
- };
163
-
164
- #endif
1
+ /*
2
+ * Rjb - Ruby <-> Java Bridge
3
+ * Copyright(c) 2004,2005 arton
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * $Id: rjb.h 180 2011-12-05 16:34:29Z arton $
16
+ * $Log: rjb.h,v $
17
+ * Revision 1.1 2005/01/16 17:36:10 arton
18
+ * Initial revision
19
+ *
20
+ *
21
+ */
22
+
23
+ #ifndef RJB_H
24
+ #define RJB_H
25
+
26
+ #if RJB_RUBY_VERSION_CODE < 190
27
+ #if !defined(RHASH_TBL)
28
+ #define RHASH_TBL(x) RHASH((x))->tbl
29
+ #endif
30
+ #endif
31
+
32
+ #if !defined(RSTRING_LEN)
33
+ #define RSTRING_LEN(s) (RSTRING(s)->len)
34
+ #endif
35
+ #if !defined(RSTRING_PTR)
36
+ #define RSTRING_PTR(s) (RSTRING(s)->ptr)
37
+ #endif
38
+ #if !defined(RARRAY_LEN)
39
+ #define RARRAY_LEN(s) (RARRAY(s)->len)
40
+ #endif
41
+ #if !defined(RARRAY_PTR)
42
+ #define RARRAY_PTR(s) (RARRAY(s)->ptr)
43
+ #endif
44
+
45
+ #if !defined(COUNTOF)
46
+ #define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
47
+ #endif
48
+
49
+ #if !defined(_I64_MIN)
50
+ #define _I64_MIN (-9223372036854775807i64 - 1)
51
+ #endif
52
+ #if !defined(_I64_MAX)
53
+ #define _I64_MAX 9223372036854775807i64
54
+ #endif
55
+
56
+ #if !defined(HAVE_LONG_LONG) && defined(__LP64__)
57
+ #define HAVE_LONG_LONG 1
58
+ #endif
59
+
60
+ /* in load.c */
61
+ extern int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs*, char*, VALUE);
62
+
63
+ /* in rjb.c */
64
+ extern JavaVM* rjb_jvm;
65
+ extern jclass rjb_rbridge;
66
+ extern jmethodID rjb_register_bridge;
67
+ extern VALUE rjb_loaded_classes;
68
+ extern jmethodID rjb_class_getName;
69
+ extern jclass rjb_j_throwable;
70
+ extern jmethodID rjb_throwable_getMessage;
71
+ extern JNIEnv* rjb_attach_current_thread(void);
72
+ extern jclass rjb_find_class(JNIEnv* jenv, VALUE name);
73
+ extern void rjb_release_string(JNIEnv *jenv, jstring str, const char* chrs);
74
+ extern VALUE rjb_load_vm_default();
75
+ extern void rjb_unload_vm();
76
+ extern VALUE rjb_safe_funcall(VALUE args);
77
+ extern VALUE jv2rv(JNIEnv* jenv, jvalue val);
78
+ extern jobject get_systemloader(JNIEnv* jenv);
79
+ extern jclass rjb_find_class_by_name(JNIEnv* jenv, const char* name);
80
+
81
+ /* in rjbexception.c */
82
+ extern VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str);
83
+ extern void rjb_check_exception(JNIEnv* jenv, int t);
84
+ extern VALUE rjb_s_throw(int, VALUE*, VALUE);
85
+
86
+ /* conversion functions */
87
+ typedef void (*R2J)(JNIEnv*, VALUE, jvalue*, const char*, int);
88
+ typedef VALUE (*J2R)(JNIEnv*, jvalue);
89
+ typedef jarray (*R2JARRAY)(JNIEnv*, VALUE, const char*);
90
+ typedef void (JNICALL *RELEASEARRAY)(JNIEnv*, jobject, void*, jint);
91
+ typedef jlong (JNICALL *INVOKEAL)(JNIEnv*, jobject, jmethodID, const jvalue*);
92
+ typedef jdouble (JNICALL *INVOKEAD)(JNIEnv*, jobject, jmethodID, const jvalue*);
93
+ typedef jfloat (JNICALL *INVOKEAF)(JNIEnv*, jobject, jmethodID, const jvalue*);
94
+ typedef jboolean (JNICALL *INVOKEAZ)(JNIEnv*, jobject, jmethodID, const jvalue*);
95
+ typedef jshort (JNICALL *INVOKEAS)(JNIEnv*, jobject, jmethodID, const jvalue*);
96
+ typedef jobject (JNICALL *INVOKEA)(JNIEnv*, jobject, jmethodID, const jvalue*);
97
+ typedef VALUE (*CONV)(JNIEnv*, void*);
98
+
99
+ /*
100
+ * internal method class
101
+ */
102
+ struct cls_constructor {
103
+ jmethodID id;
104
+ int arg_count;
105
+ R2J* arg_convert;
106
+ char* method_signature;
107
+ char result_signature;
108
+ char result_arraydepth;
109
+ };
110
+
111
+ struct cls_method {
112
+ struct cls_constructor basic;
113
+ ID name;
114
+ int static_method;
115
+ off_t method;
116
+ J2R result_convert;
117
+ /* overload only */
118
+ struct cls_method* next;
119
+ };
120
+
121
+ /*
122
+ * internal field class
123
+ */
124
+ struct cls_field {
125
+ ID name;
126
+ jfieldID id;
127
+ char* field_signature;
128
+ char result_signature;
129
+ char result_arraydepth;
130
+ R2J arg_convert;
131
+ J2R value_convert;
132
+ int readonly;
133
+ int static_field;
134
+ };
135
+
136
+ /*
137
+ * Object instance
138
+ */
139
+ struct jvi_data {
140
+ jclass klass; /* class */
141
+ jobject obj; /* instance */
142
+ st_table* methods;
143
+ st_table* fields;
144
+ };
145
+
146
+ /*
147
+ * Class instance
148
+ */
149
+ struct jv_data {
150
+ struct jvi_data idata;
151
+ st_table* static_methods;
152
+ struct cls_constructor** constructors;
153
+ };
154
+
155
+ /*
156
+ * Bridge instance
157
+ */
158
+ struct rj_bridge {
159
+ jobject bridge;
160
+ jobject proxy;
161
+ VALUE wrapped;
162
+ };
163
+
164
+ #endif
@@ -1,167 +1,167 @@
1
- /*
2
- * Rjb - Ruby <-> Java Bridge
3
- * Copyright(c) 2004,2005,2006,2010 arton
4
- *
5
- * This library is free software; you can redistribute it and/or
6
- * modify it under the terms of the GNU Lesser General Public
7
- * License as published by the Free Software Foundation; either
8
- * version 2.1 of the License, or (at your option) any later version.
9
- *
10
- * This library is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
- * Lesser General Public License for more details.
14
- *
15
- * $Id: rjbexception.c 174 2011-11-09 13:47:43Z arton $
16
- */
17
-
18
- #include "ruby.h"
19
- #include "extconf.h"
20
- #if RJB_RUBY_VERSION_CODE < 190
21
- #include "st.h"
22
- #else
23
- #include "ruby/st.h"
24
- #endif
25
- #include "jniwrap.h"
26
- #include "riconv.h"
27
- #include "rjb.h"
28
-
29
- static VALUE missing_delegate(int argc, VALUE* argv, VALUE self)
30
- {
31
- ID rmid = rb_to_id(argv[0]);
32
- return rb_funcall(rb_ivar_get(self, rb_intern("@cause")), rmid, argc - 1, argv + 1);
33
- }
34
-
35
- static VALUE exception_to_s(VALUE self)
36
- {
37
- return rb_funcall(rb_ivar_get(self, rb_intern("@cause")),
38
- rb_intern("toString"), 0);
39
- }
40
-
41
- /*
42
- * handle Java exception
43
- * At this time, the Java exception is defined without the package name.
44
- * This design may change in future release.
45
- */
46
- VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str)
47
- {
48
- VALUE rexp;
49
- char* pcls;
50
- VALUE cname;
51
- const char* p = (*jenv)->GetStringUTFChars(jenv, str, JNI_FALSE);
52
- char* clsname = ALLOCA_N(char, strlen(p) + 1);
53
- strcpy(clsname, p);
54
- rjb_release_string(jenv, str, p);
55
- pcls = strrchr(clsname, '.');
56
- if (pcls)
57
- {
58
- pcls++;
59
- }
60
- else
61
- {
62
- pcls = clsname;
63
- }
64
- cname = rb_str_new2(pcls);
65
- rexp = rb_hash_aref(rjb_loaded_classes, cname);
66
- if (rexp == Qnil)
67
- {
68
- rexp = rb_define_class(pcls, rb_eStandardError);
69
- rb_define_method(rexp, "method_missing", missing_delegate, -1);
70
- rb_define_method(rexp, "to_str", exception_to_s, 0);
71
- #if defined(HAVE_RB_HASH_ASET) || defined(RUBINIUS)
72
- rb_hash_aset(rjb_loaded_classes, cname, rexp);
73
- #else
74
- #ifdef RHASH_TBL
75
- st_insert(RHASH_TBL(rjb_loaded_classes), cname, rexp);
76
- #else
77
- st_insert(RHASH(rjb_loaded_classes)->tbl, cname, rexp);
78
- #endif
79
- #endif
80
-
81
- }
82
- return rexp;
83
- }
84
-
85
- /*
86
- * throw newly created exception with supplied message.
87
- */
88
- VALUE rjb_s_throw(int argc, VALUE* argv, VALUE self)
89
- {
90
- VALUE klass;
91
- VALUE message;
92
- JNIEnv* jenv = NULL;
93
-
94
- rjb_load_vm_default();
95
-
96
- jenv = rjb_attach_current_thread();
97
- (*jenv)->ExceptionClear(jenv);
98
-
99
- if (rb_scan_args(argc, argv, "11", &klass, &message) == 2)
100
- {
101
- jclass excep = rjb_find_class(jenv, klass);
102
- if (excep == NULL)
103
- {
104
- rb_raise(rb_eRuntimeError, "`%s' not found", StringValueCStr(klass));
105
- }
106
- (*jenv)->ThrowNew(jenv, excep, StringValueCStr(message));
107
- }
108
- else
109
- {
110
- struct jvi_data* ptr;
111
- Data_Get_Struct(klass, struct jvi_data, ptr);
112
- if (!(*jenv)->IsInstanceOf(jenv, ptr->obj, rjb_j_throwable))
113
- {
114
- rb_raise(rb_eRuntimeError, "arg1 must be a throwable");
115
- }
116
- else
117
- {
118
- (*jenv)->Throw(jenv, ptr->obj);
119
- }
120
- }
121
- return Qnil;
122
- }
123
-
124
- void rjb_check_exception(JNIEnv* jenv, int t)
125
- {
126
- jthrowable exp = (*jenv)->ExceptionOccurred(jenv);
127
- if (exp)
128
- {
129
- VALUE rexp = Qnil;
130
- if (RTEST(ruby_verbose))
131
- {
132
- (*jenv)->ExceptionDescribe(jenv);
133
- }
134
- (*jenv)->ExceptionClear(jenv);
135
- if(1)
136
- {
137
- char* msg = "unknown exception";
138
- jclass cls = (*jenv)->GetObjectClass(jenv, exp);
139
- jstring str = (*jenv)->CallObjectMethod(jenv, exp, rjb_throwable_getMessage);
140
- if (str)
141
- {
142
- const char* p = (*jenv)->GetStringUTFChars(jenv, str, JNI_FALSE);
143
- msg = ALLOCA_N(char, strlen(p) + 1);
144
- strcpy(msg, p);
145
- rjb_release_string(jenv, str, p);
146
- }
147
- str = (*jenv)->CallObjectMethod(jenv, cls, rjb_class_getName);
148
- if (str)
149
- {
150
- rexp = rjb_get_exception_class(jenv, str);
151
- }
152
- if (rexp == Qnil)
153
- {
154
- (*jenv)->DeleteLocalRef(jenv, exp);
155
- rb_raise(rb_eRuntimeError, "%s", msg);
156
- }
157
- else
158
- {
159
- VALUE rexpi = rb_funcall(rexp, rb_intern("new"), 1, rb_str_new2(msg));
160
- jvalue val;
161
- val.l = exp;
162
- rb_ivar_set(rexpi, rb_intern("@cause"), jv2rv(jenv, val));
163
- rb_exc_raise(rexpi);
164
- }
165
- }
166
- }
167
- }
1
+ /*
2
+ * Rjb - Ruby <-> Java Bridge
3
+ * Copyright(c) 2004,2005,2006,2010 arton
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * $Id: rjbexception.c 174 2011-11-09 13:47:43Z arton $
16
+ */
17
+
18
+ #include "ruby.h"
19
+ #include "extconf.h"
20
+ #if RJB_RUBY_VERSION_CODE < 190
21
+ #include "st.h"
22
+ #else
23
+ #include "ruby/st.h"
24
+ #endif
25
+ #include "jniwrap.h"
26
+ #include "riconv.h"
27
+ #include "rjb.h"
28
+
29
+ static VALUE missing_delegate(int argc, VALUE* argv, VALUE self)
30
+ {
31
+ ID rmid = rb_to_id(argv[0]);
32
+ return rb_funcall(rb_ivar_get(self, rb_intern("@cause")), rmid, argc - 1, argv + 1);
33
+ }
34
+
35
+ static VALUE exception_to_s(VALUE self)
36
+ {
37
+ return rb_funcall(rb_ivar_get(self, rb_intern("@cause")),
38
+ rb_intern("toString"), 0);
39
+ }
40
+
41
+ /*
42
+ * handle Java exception
43
+ * At this time, the Java exception is defined without the package name.
44
+ * This design may change in future release.
45
+ */
46
+ VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str)
47
+ {
48
+ VALUE rexp;
49
+ char* pcls;
50
+ VALUE cname;
51
+ const char* p = (*jenv)->GetStringUTFChars(jenv, str, JNI_FALSE);
52
+ char* clsname = ALLOCA_N(char, strlen(p) + 1);
53
+ strcpy(clsname, p);
54
+ rjb_release_string(jenv, str, p);
55
+ pcls = strrchr(clsname, '.');
56
+ if (pcls)
57
+ {
58
+ pcls++;
59
+ }
60
+ else
61
+ {
62
+ pcls = clsname;
63
+ }
64
+ cname = rb_str_new2(pcls);
65
+ rexp = rb_hash_aref(rjb_loaded_classes, cname);
66
+ if (rexp == Qnil)
67
+ {
68
+ rexp = rb_define_class(pcls, rb_eStandardError);
69
+ rb_define_method(rexp, "method_missing", missing_delegate, -1);
70
+ rb_define_method(rexp, "to_str", exception_to_s, 0);
71
+ #if defined(HAVE_RB_HASH_ASET) || defined(RUBINIUS)
72
+ rb_hash_aset(rjb_loaded_classes, cname, rexp);
73
+ #else
74
+ #ifdef RHASH_TBL
75
+ st_insert(RHASH_TBL(rjb_loaded_classes), cname, rexp);
76
+ #else
77
+ st_insert(RHASH(rjb_loaded_classes)->tbl, cname, rexp);
78
+ #endif
79
+ #endif
80
+
81
+ }
82
+ return rexp;
83
+ }
84
+
85
+ /*
86
+ * throw newly created exception with supplied message.
87
+ */
88
+ VALUE rjb_s_throw(int argc, VALUE* argv, VALUE self)
89
+ {
90
+ VALUE klass;
91
+ VALUE message;
92
+ JNIEnv* jenv = NULL;
93
+
94
+ rjb_load_vm_default();
95
+
96
+ jenv = rjb_attach_current_thread();
97
+ (*jenv)->ExceptionClear(jenv);
98
+
99
+ if (rb_scan_args(argc, argv, "11", &klass, &message) == 2)
100
+ {
101
+ jclass excep = rjb_find_class(jenv, klass);
102
+ if (excep == NULL)
103
+ {
104
+ rb_raise(rb_eRuntimeError, "`%s' not found", StringValueCStr(klass));
105
+ }
106
+ (*jenv)->ThrowNew(jenv, excep, StringValueCStr(message));
107
+ }
108
+ else
109
+ {
110
+ struct jvi_data* ptr;
111
+ Data_Get_Struct(klass, struct jvi_data, ptr);
112
+ if (!(*jenv)->IsInstanceOf(jenv, ptr->obj, rjb_j_throwable))
113
+ {
114
+ rb_raise(rb_eRuntimeError, "arg1 must be a throwable");
115
+ }
116
+ else
117
+ {
118
+ (*jenv)->Throw(jenv, ptr->obj);
119
+ }
120
+ }
121
+ return Qnil;
122
+ }
123
+
124
+ void rjb_check_exception(JNIEnv* jenv, int t)
125
+ {
126
+ jthrowable exp = (*jenv)->ExceptionOccurred(jenv);
127
+ if (exp)
128
+ {
129
+ VALUE rexp = Qnil;
130
+ if (RTEST(ruby_verbose))
131
+ {
132
+ (*jenv)->ExceptionDescribe(jenv);
133
+ }
134
+ (*jenv)->ExceptionClear(jenv);
135
+ if(1)
136
+ {
137
+ char* msg = "unknown exception";
138
+ jclass cls = (*jenv)->GetObjectClass(jenv, exp);
139
+ jstring str = (*jenv)->CallObjectMethod(jenv, exp, rjb_throwable_getMessage);
140
+ if (str)
141
+ {
142
+ const char* p = (*jenv)->GetStringUTFChars(jenv, str, JNI_FALSE);
143
+ msg = ALLOCA_N(char, strlen(p) + 1);
144
+ strcpy(msg, p);
145
+ rjb_release_string(jenv, str, p);
146
+ }
147
+ str = (*jenv)->CallObjectMethod(jenv, cls, rjb_class_getName);
148
+ if (str)
149
+ {
150
+ rexp = rjb_get_exception_class(jenv, str);
151
+ }
152
+ if (rexp == Qnil)
153
+ {
154
+ (*jenv)->DeleteLocalRef(jenv, exp);
155
+ rb_raise(rb_eRuntimeError, "%s", msg);
156
+ }
157
+ else
158
+ {
159
+ VALUE rexpi = rb_funcall(rexp, rb_intern("new"), 1, rb_str_new2(msg));
160
+ jvalue val;
161
+ val.l = exp;
162
+ rb_ivar_set(rexpi, rb_intern("@cause"), jv2rv(jenv, val));
163
+ rb_exc_raise(rexpi);
164
+ }
165
+ }
166
+ }
167
+ }