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/COPYING +504 -504
- data/ChangeLog +6 -1
- data/data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class +0 -0
- data/ext/RBridge.java +39 -39
- data/ext/depend +23 -23
- data/ext/extconf.h +1 -0
- data/ext/extconf.rb +77 -77
- data/ext/jp_co_infoseek_hp_arton_rjb_RBridge.h +21 -21
- data/ext/load.c +408 -408
- data/ext/riconv.c +218 -218
- data/ext/riconv.h +24 -24
- data/ext/rjb.c +3317 -3317
- data/ext/rjb.h +164 -164
- data/ext/rjbexception.c +167 -167
- data/lib/rjb.rb +122 -122
- data/readme.txt +35 -35
- data/samples/filechooser.rb +35 -35
- data/samples/unzip.rb +66 -66
- data/test/gctest.rb +24 -24
- data/test/listtest.rb +56 -56
- data/test/osx_jvmcheck.rb +9 -9
- data/test/rjbtest.jar +0 -0
- data/test/test.rb +873 -873
- data/test/test_osxjvm.rb +23 -23
- data/test/test_osxload.rb +64 -64
- data/test/test_unload.rb +0 -0
- metadata +15 -17
- data/lib/rjbcore.so +0 -0
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
|
data/ext/rjbexception.c
CHANGED
@@ -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
|
+
}
|