rjb 1.5.7 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +39 -0
- data/ext/{depend → depend.erb} +1 -1
- data/ext/extconf.h +1 -1
- data/ext/extconf.rb +10 -0
- data/ext/load.c +38 -14
- data/ext/riconv.c +142 -11
- data/ext/rjb.c +74 -74
- data/ext/rjbexception.c +30 -2
- data/lib/rjb.rb +21 -2
- data/test/test.rb +51 -9
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb67ad89857525ce2a6443cb151d5f48dc05a5338ad09e28714b1706cecaa5d6
|
4
|
+
data.tar.gz: 42ab7af0fab4e999d025bc4c7957771a9372699dcd0e15664a741eb0b008aea5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce14080ae984eaa12dafd0433fd5a902fa9dcb5d731f34e674a78d20ae9e04634512c7f40086283fcad7db1064f3a750c1b8c35802c8f1fd75add365cbcf3c0a
|
7
|
+
data.tar.gz: ea0a88e9752dfd8407bd9130b1548589b0fdca90d7a962bef175e504183775817e2818abcb833bae7ab65cfb88e4dcda04c666388b3f2c40235f4b93db396a56
|
data/ChangeLog
CHANGED
@@ -1,3 +1,42 @@
|
|
1
|
+
Sat Aug 1 2020 arton
|
2
|
+
* ext/rjb.c
|
3
|
+
RJB_VERSION -> 1.6.2
|
4
|
+
* ext/load.c
|
5
|
+
support OpenJDK directory structure (without jre)
|
6
|
+
* lib/rjb.rb
|
7
|
+
change copyright notice
|
8
|
+
Wed Jul 17 2019 arton
|
9
|
+
* ext/rjb.c
|
10
|
+
RJB_VERSION -> 1.6.1
|
11
|
+
* lib/rjb.rb
|
12
|
+
java_methods and methods return symbol
|
13
|
+
implements respond_to? for Java methods
|
14
|
+
* ext/rbjexception.c
|
15
|
+
delegate to JavaProxy for respond_to? (except for to_str and exception)
|
16
|
+
* test/test.rb
|
17
|
+
change java_methods test to adjust above change
|
18
|
+
add respond_to? test
|
19
|
+
Thu Jul 11 2019 arton
|
20
|
+
* ext/rjb.c
|
21
|
+
RJB_VERSION -> 1.6.0
|
22
|
+
* ext/riconv.c
|
23
|
+
encode/decode between utf-8 and cesu-8 if char was greater than \uffff
|
24
|
+
Sun Feb 17 2019 lamby / arton
|
25
|
+
* ext/rjb.c
|
26
|
+
RJB_VERSION -> 1.5.9
|
27
|
+
* ext/depend.erb
|
28
|
+
it set javah line by ERB
|
29
|
+
* ext/extconf.rb
|
30
|
+
change javah to javac -h if it does not exist
|
31
|
+
* ext/depend
|
32
|
+
replaced by depend.erb
|
33
|
+
Thu Jan 17 2019 arton
|
34
|
+
* ext/rjbexception.c
|
35
|
+
restore method_missing for the exception class
|
36
|
+
* ext/rjb.c
|
37
|
+
RJB_VERSION -> 1.5.8
|
38
|
+
* test/test.rb
|
39
|
+
add #60 test
|
1
40
|
Fri Dec 28 2018 arton
|
2
41
|
* ext/rjbexception.c
|
3
42
|
fix #60; stable java derived exception class for raise
|
data/ext/{depend → depend.erb}
RENAMED
@@ -3,7 +3,7 @@ rjb.o : rjb.c jp_co_infoseek_hp_arton_rjb_RBridge.h riconv.h rjb.h
|
|
3
3
|
rjbexception.o : rjbexception.c jp_co_infoseek_hp_arton_rjb_RBridge.h riconv.h rjb.h
|
4
4
|
load.o : load.c jp_co_infoseek_hp_arton_rjb_RBridge.h
|
5
5
|
jp_co_infoseek_hp_arton_rjb_RBridge.h : jniwrap.h ../data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class
|
6
|
-
javah
|
6
|
+
<%= javah %>
|
7
7
|
../data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class : RBridge.java
|
8
8
|
mkdir -p ../data/rjb/jp/co/infoseek/hp/arton/rjb
|
9
9
|
javac -d ../data/rjb RBridge.java
|
data/ext/extconf.h
CHANGED
data/ext/extconf.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
# $Date: $
|
5
5
|
#----------------------------------
|
6
6
|
require 'mkmf'
|
7
|
+
require 'erb'
|
7
8
|
|
8
9
|
class Path
|
9
10
|
|
@@ -74,4 +75,13 @@ when /mswin32/
|
|
74
75
|
when /cygwin/, /mingw/
|
75
76
|
$defs << '-DNONAMELESSUNION'
|
76
77
|
end
|
78
|
+
|
79
|
+
if find_executable('javah')
|
80
|
+
javah = 'javah -classpath ../data/rjb jp.co.infoseek.hp.arton.rjb.RBridge'
|
81
|
+
else
|
82
|
+
javah = 'javac -h . -classpath ../data/rjb RBridge.java'
|
83
|
+
end
|
84
|
+
File.open('depend', 'w') do |fout|
|
85
|
+
fout.write ERB.new(IO::read('depend.erb')).result
|
86
|
+
end
|
77
87
|
create_rjb_makefile
|
data/ext/load.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Rjb - Ruby <-> Java Bridge
|
3
|
-
* Copyright(c) 2004,2005,2006,2009,2010,2011 arton
|
3
|
+
* Copyright(c) 2004,2005,2006,2009,2010,2011,2020 arton
|
4
4
|
*
|
5
5
|
* This library is free software; you can redistribute it and/or
|
6
6
|
* modify it under the terms of the GNU Lesser General Public
|
@@ -38,9 +38,11 @@
|
|
38
38
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
39
39
|
#if defined(__CYGWIN__)
|
40
40
|
#define JVMDLL "%s/jre/bin/%s/jvm.dll"
|
41
|
+
#define OPENJDK_JVMDLL "%s/bin/%s/jvm.dll"
|
41
42
|
#define DIRSEPARATOR '/'
|
42
43
|
#else
|
43
44
|
#define JVMDLL "%s\\jre\\bin\\%s\\jvm.dll"
|
45
|
+
#define OPENJDK_JVMDLL "%s\\bin\\%s\\jvm.dll"
|
44
46
|
#define DIRSEPARATOR '\\'
|
45
47
|
#if defined(_WIN64)
|
46
48
|
#undef JVM_TYPE
|
@@ -61,6 +63,7 @@
|
|
61
63
|
#define JVM_TYPE "j9vm"
|
62
64
|
#elif defined(__hpux)
|
63
65
|
#define JVMDLL "%s/jre/lib/%s/%s/libjvm.sl"
|
66
|
+
#define OPENJDK_JVMDLL "%s/lib/%s/libjvm.sl"
|
64
67
|
#define ARCH "PA_RISC"
|
65
68
|
#undef JVM_TYPE
|
66
69
|
#define JVM_TYPE "server"
|
@@ -88,6 +91,7 @@
|
|
88
91
|
#include <sys/systeminfo.h>
|
89
92
|
#endif
|
90
93
|
#define JVMDLL "%s/jre/lib/%s/%s/libjvm.so"
|
94
|
+
#define OPENJDK_JVMDLL "%s/lib/%s/libjvm.so"
|
91
95
|
#define DIRSEPARATOR '/'
|
92
96
|
#define CLASSPATH_SEP ':'
|
93
97
|
#endif
|
@@ -123,12 +127,20 @@ static int open_jvm(char* libpath)
|
|
123
127
|
size_t i;
|
124
128
|
int state;
|
125
129
|
|
130
|
+
if (rb_funcall(rb_cFile, rb_intern("exist?"), 1, rb_str_new2(libpath)) == RUBY_Qfalse)
|
131
|
+
{
|
132
|
+
if (RTEST(ruby_verbose))
|
133
|
+
{
|
134
|
+
fprintf(stderr, "Rjb::load try to find but not exist %s\n", libpath);
|
135
|
+
}
|
136
|
+
return 0;
|
137
|
+
}
|
126
138
|
#if defined(RUBINIUS)
|
127
139
|
i = 1;
|
128
140
|
#else
|
129
141
|
i = 0;
|
130
142
|
#endif
|
131
|
-
for (; i < COUNTOF(DLLibs); i++)
|
143
|
+
for (; i < COUNTOF(DLLibs); i++)
|
132
144
|
{
|
133
145
|
state = 0;
|
134
146
|
rb_protect(safe_require, rb_str_new2(DLLibs[i]), &state);
|
@@ -137,7 +149,7 @@ static int open_jvm(char* libpath)
|
|
137
149
|
{
|
138
150
|
if (i > 0)
|
139
151
|
{
|
140
|
-
rb_raise(rb_eRuntimeError, "Constants DL
|
152
|
+
rb_raise(rb_eRuntimeError, "Constants DL or Fiddle is not defined.");
|
141
153
|
return 0;
|
142
154
|
}
|
143
155
|
}
|
@@ -163,8 +175,8 @@ static int open_jvm(char* libpath)
|
|
163
175
|
}
|
164
176
|
/* get function pointers of JNI */
|
165
177
|
#if RJB_RUBY_VERSION_CODE < 190
|
166
|
-
getdefaultjavavminitargsfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2(GETDEFAULTJVMINITARGS), rb_str_new2("IP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
|
167
|
-
createjavavmfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2(CREATEJVM), rb_str_new2("IPPP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
|
178
|
+
getdefaultjavavminitargsfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2(GETDEFAULTJVMINITARGS), rb_str_new2("IP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
|
179
|
+
createjavavmfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2(CREATEJVM), rb_str_new2("IPPP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
|
168
180
|
#else
|
169
181
|
getdefaultjavavminitargsfunc = rb_funcall(jvmdll, rb_intern("[]"), 1, rb_str_new2(GETDEFAULTJVMINITARGS));
|
170
182
|
createjavavmfunc = rb_funcall(jvmdll, rb_intern("[]"), 1, rb_str_new2(CREATEJVM));
|
@@ -184,6 +196,7 @@ static int file_exist(const char* dir, const char* file)
|
|
184
196
|
|
185
197
|
/*
|
186
198
|
* not completed, only valid under some circumstances.
|
199
|
+
* load priority: OpenJDK -> SunJDK
|
187
200
|
*/
|
188
201
|
static int load_jvm(const char* jvmtype)
|
189
202
|
{
|
@@ -236,26 +249,37 @@ static int load_jvm(const char* jvmtype)
|
|
236
249
|
*(p + strlen(p) - 1) = '\0';
|
237
250
|
jh = p;
|
238
251
|
}
|
239
|
-
#endif
|
252
|
+
#endif
|
240
253
|
java_home = ALLOCA_N(char, strlen(jh) + 1);
|
241
254
|
strcpy(java_home, jh);
|
242
255
|
if (*(java_home + strlen(jh) - 1) == DIRSEPARATOR)
|
243
256
|
{
|
244
257
|
*(java_home + strlen(jh) - 1) = '\0';
|
245
258
|
}
|
259
|
+
#if defined(__APPLE__) && defined(__MACH__)
|
260
|
+
libpath = ALLOCA_N(char, sizeof(JVMDLL) + strlen(java_home) + 1);
|
261
|
+
sprintf(libpath, JVMDLL, java_home);
|
262
|
+
return open_jvm(libpath);
|
263
|
+
#else
|
246
264
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
247
265
|
libpath = ALLOCA_N(char, sizeof(JVMDLL) + strlen(java_home)
|
248
266
|
+ strlen(jvmtype) + 1);
|
249
|
-
sprintf(libpath, JVMDLL, java_home, jvmtype);
|
250
|
-
#elif defined(__APPLE__) && defined(__MACH__)
|
251
|
-
libpath = ALLOCA_N(char, sizeof(JVMDLL) + strlen(java_home) + 1);
|
252
|
-
sprintf(libpath, JVMDLL, java_home);
|
253
267
|
#else /* not Windows / MAC OS-X */
|
254
268
|
libpath = ALLOCA_N(char, sizeof(JVMDLL) + strlen(java_home)
|
255
|
-
|
269
|
+
+ strlen(ARCH) + strlen(jvmtype) + 1);
|
270
|
+
#endif
|
271
|
+
sprintf(libpath, OPENJDK_JVMDLL, java_home, jvmtype);
|
272
|
+
if (open_jvm(libpath))
|
273
|
+
{
|
274
|
+
return 1;
|
275
|
+
}
|
276
|
+
#if defined(_WIN32) || defined(__CYGWIN__)
|
277
|
+
return 0;
|
278
|
+
#else /* not Windows / MAC OS-X */
|
256
279
|
sprintf(libpath, JVMDLL, java_home, ARCH, jvmtype);
|
257
280
|
#endif
|
258
281
|
return open_jvm(libpath);
|
282
|
+
#endif /* __APPLE__ and __MACH */
|
259
283
|
}
|
260
284
|
|
261
285
|
static int load_bridge(JNIEnv* jenv)
|
@@ -269,7 +293,7 @@ static int load_bridge(JNIEnv* jenv)
|
|
269
293
|
VALUE v = rb_const_get(rb_cObject, rb_intern("RjbConf"));
|
270
294
|
v = rb_const_get(v, rb_intern("BRIDGE_FILE"));
|
271
295
|
#else
|
272
|
-
VALUE v = rb_const_get_at(rb_const_get(rb_cObject, rb_intern("RjbConf")),
|
296
|
+
VALUE v = rb_const_get_at(rb_const_get(rb_cObject, rb_intern("RjbConf")),
|
273
297
|
rb_intern("BRIDGE_FILE"));
|
274
298
|
#endif
|
275
299
|
bridge = StringValuePtr(v);
|
@@ -352,7 +376,7 @@ int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs* vm_args, char* userpath, VALU
|
|
352
376
|
*(p + strlen(p) - 1) = '\0';
|
353
377
|
libjvm = p;
|
354
378
|
}
|
355
|
-
#endif
|
379
|
+
#endif
|
356
380
|
if (libjvm == NULL || !open_jvm(libjvm))
|
357
381
|
{
|
358
382
|
#if defined(__APPLE__) && defined(__MACH__)
|
@@ -370,7 +394,7 @@ int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs* vm_args, char* userpath, VALU
|
|
370
394
|
}
|
371
395
|
#endif
|
372
396
|
}
|
373
|
-
|
397
|
+
|
374
398
|
#if RJB_RUBY_VERSION_CODE < 190 && !defined(RUBINIUS)
|
375
399
|
ruby_errinfo = Qnil;
|
376
400
|
#else
|
data/ext/riconv.c
CHANGED
@@ -167,6 +167,126 @@ static void check_kcode()
|
|
167
167
|
objIconvR2J = objIconvJ2R = Qnil;
|
168
168
|
}
|
169
169
|
}
|
170
|
+
#else
|
171
|
+
VALUE cEncoding = Qnil;
|
172
|
+
VALUE encoding_utf8 = Qnil;
|
173
|
+
static void init_encoding_vars()
|
174
|
+
{
|
175
|
+
cEncoding = rb_const_get(rb_cObject, rb_intern("Encoding"));
|
176
|
+
encoding_utf8 = rb_const_get(cEncoding, rb_intern("UTF_8"));
|
177
|
+
}
|
178
|
+
static int contains_surrogate_pair(const unsigned char* p)
|
179
|
+
{
|
180
|
+
while (*p)
|
181
|
+
{
|
182
|
+
switch (*p & 0xf0)
|
183
|
+
{
|
184
|
+
case 0xf0:
|
185
|
+
return 1;
|
186
|
+
case 0xe0:
|
187
|
+
p += 3;
|
188
|
+
break;
|
189
|
+
default:
|
190
|
+
p += (*p & 0x80) ? 2 : 1;
|
191
|
+
}
|
192
|
+
}
|
193
|
+
return 0;
|
194
|
+
}
|
195
|
+
static int contains_auxchar(const unsigned char* p)
|
196
|
+
{
|
197
|
+
while (*p)
|
198
|
+
{
|
199
|
+
if (*p == 0xed)
|
200
|
+
{
|
201
|
+
#if defined(DEBUG)
|
202
|
+
printf("find %02x %02x %02x %02x %02x %02x\n", *p, *(p + 1), *(p + 2), *(p + 3), *(p + 4), *(p + 5));
|
203
|
+
#endif
|
204
|
+
return 1;
|
205
|
+
}
|
206
|
+
switch (*p & 0xe0)
|
207
|
+
{
|
208
|
+
case 0xe0:
|
209
|
+
p++;
|
210
|
+
case 0xc0:
|
211
|
+
p++;
|
212
|
+
default:
|
213
|
+
p++;
|
214
|
+
}
|
215
|
+
}
|
216
|
+
return 0;
|
217
|
+
}
|
218
|
+
|
219
|
+
static VALUE encode_to_cesu8(const unsigned char* p)
|
220
|
+
{
|
221
|
+
size_t len = strlen(p);
|
222
|
+
char* newstr = ALLOCA_N(char, len + (len + 1) / 2);
|
223
|
+
char* dest = newstr;
|
224
|
+
int sval, i;
|
225
|
+
while (*p)
|
226
|
+
{
|
227
|
+
switch (*p & 0xf0)
|
228
|
+
{
|
229
|
+
case 0xf0:
|
230
|
+
sval = *p++ & 7;
|
231
|
+
for (i = 0; i < 3; i++)
|
232
|
+
{
|
233
|
+
sval <<= 6;
|
234
|
+
sval |= (*p++ & 0x3f);
|
235
|
+
}
|
236
|
+
*dest++ = '\xed';
|
237
|
+
*dest++ = 0xa0 | (((sval >> 16) - 1) & 0x0f);
|
238
|
+
*dest++ = 0x80 | ((sval >> 10) & 0x3f);
|
239
|
+
*dest++ = '\xed';
|
240
|
+
*dest++ = 0xb0 | ((sval >> 6) & 0x0f);
|
241
|
+
*dest++ = 0x80 | (sval & 0x3f);
|
242
|
+
break;
|
243
|
+
case 0xe0:
|
244
|
+
*dest++ = *p++;
|
245
|
+
case 0xc0:
|
246
|
+
case 0xc1:
|
247
|
+
*dest++ = *p++;
|
248
|
+
default:
|
249
|
+
*dest++ = *p++;
|
250
|
+
}
|
251
|
+
}
|
252
|
+
return rb_str_new(newstr, dest - newstr);
|
253
|
+
}
|
254
|
+
static VALUE encode_to_utf8(const unsigned char* p)
|
255
|
+
{
|
256
|
+
size_t len = strlen(p);
|
257
|
+
char* newstr = ALLOCA_N(char, len);
|
258
|
+
char* dest = newstr;
|
259
|
+
int sval, i;
|
260
|
+
while (*p)
|
261
|
+
{
|
262
|
+
if (*p == 0xed)
|
263
|
+
{
|
264
|
+
char v = *(p + 1);
|
265
|
+
char w = *(p + 2);
|
266
|
+
char y = *(p + 4);
|
267
|
+
char z = *(p + 5);
|
268
|
+
p += 6;
|
269
|
+
sval = 0x10000 + ((v & 0x0f) << 16) + ((w & 0x3f) << 10) + ((y & 0x0f) << 6) + (z & 0x3f);
|
270
|
+
sval = (((v + 1) & 0x0f) << 16) + ((w & 0x3f) << 10) + ((y & 0x0f) << 6) + (z & 0x3f);
|
271
|
+
*dest++ = 0xf0 | ((sval >> 18));
|
272
|
+
*dest++ = 0x80 | ((sval >> 12) & 0x3f);
|
273
|
+
*dest++ = 0x80 | ((sval >> 6) & 0x3f);
|
274
|
+
*dest++ = 0x80 | (sval & 0x3f);
|
275
|
+
continue;
|
276
|
+
}
|
277
|
+
switch (*p & 0xe0)
|
278
|
+
{
|
279
|
+
case 0xe0:
|
280
|
+
*dest++ = *p++;
|
281
|
+
case 0xc0:
|
282
|
+
case 0xc1:
|
283
|
+
*dest++ = *p++;
|
284
|
+
default:
|
285
|
+
*dest++ = *p++;
|
286
|
+
}
|
287
|
+
}
|
288
|
+
return rb_str_new(newstr, dest - newstr);
|
289
|
+
}
|
170
290
|
#endif
|
171
291
|
|
172
292
|
#if defined(DEBUG)
|
@@ -177,6 +297,8 @@ static void debug_out(VALUE v)
|
|
177
297
|
strlen(p), p);
|
178
298
|
fflush(stdout);
|
179
299
|
}
|
300
|
+
#else
|
301
|
+
#define debug_out(n)
|
180
302
|
#endif
|
181
303
|
|
182
304
|
VALUE exticonv_local_to_utf8(VALUE local_string)
|
@@ -192,23 +314,24 @@ VALUE exticonv_local_to_utf8(VALUE local_string)
|
|
192
314
|
return local_string;
|
193
315
|
}
|
194
316
|
#else
|
195
|
-
VALUE
|
196
|
-
|
317
|
+
VALUE encoding;
|
318
|
+
if (NIL_P(cEncoding))
|
319
|
+
{
|
320
|
+
init_encoding_vars();
|
321
|
+
}
|
197
322
|
encoding = rb_funcall(local_string, rb_intern("encoding"), 0);
|
198
|
-
|
199
|
-
if (encoding != utf8)
|
323
|
+
if (encoding != encoding_utf8)
|
200
324
|
{
|
201
|
-
VALUE ret = rb_funcall(local_string, rb_intern("encode"), 2,
|
202
|
-
#if defined(DEBUG)
|
325
|
+
VALUE ret = rb_funcall(local_string, rb_intern("encode"), 2, encoding_utf8, encoding);
|
203
326
|
debug_out(local_string);
|
204
327
|
debug_out(ret);
|
205
|
-
|
206
|
-
return ret;
|
328
|
+
local_string = ret;
|
207
329
|
}
|
208
|
-
|
330
|
+
if (contains_surrogate_pair(StringValuePtr(local_string)))
|
209
331
|
{
|
210
|
-
|
332
|
+
local_string = encode_to_cesu8(StringValuePtr(local_string));
|
211
333
|
}
|
334
|
+
return local_string;
|
212
335
|
#endif
|
213
336
|
}
|
214
337
|
|
@@ -225,6 +348,14 @@ VALUE exticonv_utf8_to_local(VALUE utf8_string)
|
|
225
348
|
return utf8_string;
|
226
349
|
}
|
227
350
|
#else
|
228
|
-
|
351
|
+
if (NIL_P(cEncoding))
|
352
|
+
{
|
353
|
+
init_encoding_vars();
|
354
|
+
}
|
355
|
+
if (contains_auxchar(StringValuePtr(utf8_string)))
|
356
|
+
{
|
357
|
+
utf8_string = encode_to_utf8(StringValuePtr(utf8_string));
|
358
|
+
}
|
359
|
+
return rb_funcall(utf8_string, rb_intern("force_encoding"), 1, encoding_utf8);
|
229
360
|
#endif
|
230
361
|
}
|
data/ext/rjb.c
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
*
|
15
15
|
*/
|
16
16
|
|
17
|
-
#define RJB_VERSION "1.
|
17
|
+
#define RJB_VERSION "1.6.2"
|
18
18
|
|
19
19
|
#include "ruby.h"
|
20
20
|
#include "extconf.h"
|
@@ -102,7 +102,7 @@ static VALUE primitive_conversion = Qfalse;
|
|
102
102
|
/*
|
103
103
|
* Object cache, never destroyed
|
104
104
|
*/
|
105
|
-
/* method */
|
105
|
+
/* method */
|
106
106
|
static jmethodID method_getModifiers;
|
107
107
|
static jmethodID method_getName;
|
108
108
|
static jmethodID getParameterTypes;
|
@@ -229,7 +229,7 @@ static VALUE jstring2val(JNIEnv* jenv, jstring s)
|
|
229
229
|
const char* p;
|
230
230
|
VALUE v;
|
231
231
|
|
232
|
-
if (s == NULL)
|
232
|
+
if (s == NULL)
|
233
233
|
{
|
234
234
|
return Qnil;
|
235
235
|
}
|
@@ -317,7 +317,7 @@ static VALUE jv2rv_r(JNIEnv* jenv, jvalue val)
|
|
317
317
|
Data_Get_Struct(v, struct jv_data, ptr);
|
318
318
|
v = register_instance(jenv, v, (struct jv_data*)ptr, val.l);
|
319
319
|
(*jenv)->DeleteLocalRef(jenv, klass);
|
320
|
-
(*jenv)->DeleteLocalRef(jenv, val.l);
|
320
|
+
(*jenv)->DeleteLocalRef(jenv, val.l);
|
321
321
|
return v;
|
322
322
|
}
|
323
323
|
|
@@ -357,7 +357,7 @@ static VALUE jfloat2rv(JNIEnv* jenv, jvalue val)
|
|
357
357
|
|
358
358
|
static VALUE jint2rv(JNIEnv* jenv, jvalue val)
|
359
359
|
{
|
360
|
-
return INT2NUM(val.i);
|
360
|
+
return INT2NUM(val.i);
|
361
361
|
}
|
362
362
|
|
363
363
|
static VALUE jlong2rv(JNIEnv* jenv, jvalue val)
|
@@ -393,13 +393,13 @@ static VALUE ja2r(J2R conv, JNIEnv* jenv, jvalue val, int depth)
|
|
393
393
|
VALUE v;
|
394
394
|
int i;
|
395
395
|
if (!val.l) return Qnil;
|
396
|
-
if (depth == 1)
|
396
|
+
if (depth == 1)
|
397
397
|
{
|
398
398
|
return conv(jenv, val);
|
399
399
|
}
|
400
400
|
len = (*jenv)->GetArrayLength(jenv, val.l);
|
401
401
|
v = rb_ary_new2(len);
|
402
|
-
for (i = 0; i < len; i++)
|
402
|
+
for (i = 0; i < len; i++)
|
403
403
|
{
|
404
404
|
jvalue wrap;
|
405
405
|
wrap.l = (*jenv)->GetObjectArrayElement(jenv, val.l, i);
|
@@ -454,7 +454,7 @@ static VALUE la2rv(JNIEnv* jenv, void* p)
|
|
454
454
|
return LL2NUM(*(jlong*)p);
|
455
455
|
#else
|
456
456
|
return LONG2NUM(*(jlong*)p);
|
457
|
-
#endif
|
457
|
+
#endif
|
458
458
|
}
|
459
459
|
|
460
460
|
static VALUE sa2rv(JNIEnv* jenv, void* p)
|
@@ -498,7 +498,7 @@ static VALUE jbytearray2rv(JNIEnv* jenv, jvalue val)
|
|
498
498
|
static VALUE jchararray2rv(JNIEnv* jenv, jvalue val)
|
499
499
|
{
|
500
500
|
jchar* p = (*jenv)->GetCharArrayElements(jenv, val.l, NULL);
|
501
|
-
return call_conv(jenv, val, sizeof(jchar), p, ca2rv,
|
501
|
+
return call_conv(jenv, val, sizeof(jchar), p, ca2rv,
|
502
502
|
offsetof(struct JNINativeInterface_, ReleaseCharArrayElements));
|
503
503
|
}
|
504
504
|
static VALUE jdoublearray2rv(JNIEnv* jenv, jvalue val)
|
@@ -557,14 +557,14 @@ static VALUE jbooleanarray2rv(JNIEnv* jenv, jvalue val)
|
|
557
557
|
*/
|
558
558
|
static jprimitive_table jpcvt[] = {
|
559
559
|
{ "java/lang/Integer", "intValue", "()I", "(I)V", NULL, 0, 0, jint2rv, },
|
560
|
-
{ "java/lang/Long", "longValue", "()J", "(J)V", NULL, 0, 0, jlong2rv, },
|
560
|
+
{ "java/lang/Long", "longValue", "()J", "(J)V", NULL, 0, 0, jlong2rv, },
|
561
561
|
{ "java/lang/Double", "doubleValue", "()D", "(D)V", NULL, 0, 0, jdouble2rv, },
|
562
562
|
{ "java/lang/Boolean", "booleanValue", "()Z", "(Z)Ljava/lang/Boolean;",
|
563
563
|
NULL, 0, 0, jboolean2rv, },
|
564
564
|
{ "java/lang/Character", "charValue", "()C", NULL, NULL, 0, 0, jchar2rv, },
|
565
565
|
{ "java/lang/Short", "intValue", "()I", NULL, NULL, 0, 0, jint2rv, },
|
566
566
|
{ "java/lang/Byte", "intValue", "()I", NULL, NULL, 0, 0, jint2rv, },
|
567
|
-
{ "java/lang/Float", "doubleValue", "()D", NULL, NULL, 0, 0, jdouble2rv, },
|
567
|
+
{ "java/lang/Float", "doubleValue", "()D", NULL, NULL, 0, 0, jdouble2rv, },
|
568
568
|
};
|
569
569
|
|
570
570
|
/*
|
@@ -669,7 +669,7 @@ static void rv2jfloat(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, int
|
|
669
669
|
static void rv2jint(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, int release)
|
670
670
|
{
|
671
671
|
if (!release)
|
672
|
-
jv->i = NUM2INT(val);
|
672
|
+
jv->i = NUM2INT(val);
|
673
673
|
}
|
674
674
|
static void rv2jlong(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, int release)
|
675
675
|
{
|
@@ -693,7 +693,7 @@ static void rv2jshort(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, int
|
|
693
693
|
if (release) return;
|
694
694
|
if (TYPE(val) == T_FIXNUM)
|
695
695
|
{
|
696
|
-
int n = FIX2INT(val);
|
696
|
+
int n = FIX2INT(val);
|
697
697
|
if (abs(n) < 0x7fff)
|
698
698
|
{
|
699
699
|
jv->s = (short)n;
|
@@ -814,7 +814,7 @@ static void rv2jobject(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
|
|
814
814
|
Data_Get_Struct(val, struct rj_bridge, ptr);
|
815
815
|
jv->l = ptr->proxy;
|
816
816
|
}
|
817
|
-
else if (CLASS_INHERITED(rjbc, rb_obj_class(val)))
|
817
|
+
else if (CLASS_INHERITED(rjbc, rb_obj_class(val)))
|
818
818
|
{
|
819
819
|
struct jv_data* ptr;
|
820
820
|
Data_Get_Struct(val, struct jv_data, ptr);
|
@@ -836,13 +836,13 @@ static void rv2jobject(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
|
|
836
836
|
case T_ARRAY:
|
837
837
|
jv->l = r2objarray(jenv, val, "Ljava/lang/Object;");
|
838
838
|
break;
|
839
|
-
#if HAVE_LONG_LONG
|
839
|
+
#if HAVE_LONG_LONG
|
840
840
|
case T_BIGNUM:
|
841
841
|
arg.j = rb_big2ll(val);
|
842
842
|
jv->l = (*jenv)->NewObject(jenv, jpcvt[PRM_LONG].klass,
|
843
843
|
jpcvt[PRM_LONG].ctr_id, arg);
|
844
844
|
break;
|
845
|
-
#endif
|
845
|
+
#endif
|
846
846
|
case T_OBJECT:
|
847
847
|
default:
|
848
848
|
#if defined(DEBUG)
|
@@ -860,7 +860,7 @@ static void rv2jobject(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
|
|
860
860
|
}
|
861
861
|
else
|
862
862
|
{
|
863
|
-
switch (TYPE(val))
|
863
|
+
switch (TYPE(val))
|
864
864
|
{
|
865
865
|
case T_STRING:
|
866
866
|
case T_FLOAT:
|
@@ -1287,7 +1287,7 @@ static J2R get_j2r(JNIEnv* jenv, jobject cls, char* psig, char* pdepth, char* pp
|
|
1287
1287
|
const char* cname;
|
1288
1288
|
const char* jname = NULL;
|
1289
1289
|
jstring nm = (*jenv)->CallObjectMethod(jenv, cls, rjb_class_getName);
|
1290
|
-
rjb_check_exception(jenv, 0);
|
1290
|
+
rjb_check_exception(jenv, 0);
|
1291
1291
|
cname = (*jenv)->GetStringUTFChars(jenv, nm, NULL);
|
1292
1292
|
|
1293
1293
|
if (*cname == '[')
|
@@ -1391,7 +1391,7 @@ static void setup_methodbase(JNIEnv* jenv, struct cls_constructor* pm,
|
|
1391
1391
|
static void register_methodinfo(struct cls_method* newpm, st_table* tbl)
|
1392
1392
|
{
|
1393
1393
|
struct cls_method* pm;
|
1394
|
-
|
1394
|
+
|
1395
1395
|
if (st_lookup(tbl, newpm->name, (st_data_t*)&pm))
|
1396
1396
|
{
|
1397
1397
|
newpm->next = pm->next;
|
@@ -1434,7 +1434,7 @@ static int make_alias(const char* jname, char* rname)
|
|
1434
1434
|
static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static_method)
|
1435
1435
|
{
|
1436
1436
|
struct cls_method* result;
|
1437
|
-
struct cls_method* pm;
|
1437
|
+
struct cls_method* pm;
|
1438
1438
|
const char* jname;
|
1439
1439
|
int alias;
|
1440
1440
|
jstring nm;
|
@@ -1450,12 +1450,12 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
|
|
1450
1450
|
rjb_check_exception(jenv, 0);
|
1451
1451
|
setup_methodbase(jenv, &result->basic, parama, param_count);
|
1452
1452
|
nm = (*jenv)->CallObjectMethod(jenv, m, method_getName);
|
1453
|
-
rjb_check_exception(jenv, 0);
|
1453
|
+
rjb_check_exception(jenv, 0);
|
1454
1454
|
jname = (*jenv)->GetStringUTFChars(jenv, nm, NULL);
|
1455
1455
|
rname = ALLOCA_N(char, strlen(jname) * 2 + 8);
|
1456
1456
|
alias = make_alias(jname, rname);
|
1457
1457
|
result->name = rb_intern(jname);
|
1458
|
-
rjb_release_string(jenv, nm, jname);
|
1458
|
+
rjb_release_string(jenv, nm, jname);
|
1459
1459
|
result->basic.id = (*jenv)->FromReflectedMethod(jenv, m);
|
1460
1460
|
rjb_check_exception(jenv, 0);
|
1461
1461
|
cls = (*jenv)->CallObjectMethod(jenv, m, getReturnType);
|
@@ -1470,7 +1470,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
|
|
1470
1470
|
&& (*rname == 'g' || *rname == 's') && *(rname + 1) == 'e' && *(rname + 2) == 't')
|
1471
1471
|
{
|
1472
1472
|
pm = clone_methodinfo(result);
|
1473
|
-
if (*rname == 's')
|
1473
|
+
if (*rname == 's')
|
1474
1474
|
{
|
1475
1475
|
if (result->basic.arg_count == 1)
|
1476
1476
|
{
|
@@ -1515,7 +1515,7 @@ static void create_fieldinfo(JNIEnv* jenv, st_table* tbl, jobject f, int readonl
|
|
1515
1515
|
result = ALLOC(struct cls_field);
|
1516
1516
|
memset(result, 0, sizeof(struct cls_field));
|
1517
1517
|
nm = (*jenv)->CallObjectMethod(jenv, f, field_getName);
|
1518
|
-
rjb_check_exception(jenv, 0);
|
1518
|
+
rjb_check_exception(jenv, 0);
|
1519
1519
|
jname = (*jenv)->GetStringUTFChars(jenv, nm, NULL);
|
1520
1520
|
result->name = rb_intern(jname);
|
1521
1521
|
rjb_release_string(jenv, nm, jname);
|
@@ -1537,7 +1537,7 @@ static void create_fieldinfo(JNIEnv* jenv, st_table* tbl, jobject f, int readonl
|
|
1537
1537
|
static void setup_constructors(JNIEnv* jenv, struct cls_constructor*** pptr, jobjectArray methods)
|
1538
1538
|
{
|
1539
1539
|
int i;
|
1540
|
-
struct cls_constructor* pc;
|
1540
|
+
struct cls_constructor* pc;
|
1541
1541
|
jsize mcount = (*jenv)->GetArrayLength(jenv, methods);
|
1542
1542
|
struct cls_constructor** tbl = ALLOC_N(struct cls_constructor*, mcount + 1);
|
1543
1543
|
*pptr = tbl;
|
@@ -1557,21 +1557,21 @@ static void setup_constructors(JNIEnv* jenv, struct cls_constructor*** pptr, job
|
|
1557
1557
|
pc->id = (*jenv)->FromReflectedMethod(jenv, c);
|
1558
1558
|
(*jenv)->DeleteLocalRef(jenv, c);
|
1559
1559
|
}
|
1560
|
-
tbl[mcount] = NULL;
|
1560
|
+
tbl[mcount] = NULL;
|
1561
1561
|
}
|
1562
|
-
|
1562
|
+
|
1563
1563
|
static void setup_methods(JNIEnv* jenv, st_table** tbl, st_table** static_tbl,
|
1564
1564
|
jobjectArray methods)
|
1565
1565
|
{
|
1566
1566
|
int i;
|
1567
|
-
jint modifier;
|
1567
|
+
jint modifier;
|
1568
1568
|
jsize mcount = (*jenv)->GetArrayLength(jenv, methods);
|
1569
1569
|
*tbl = st_init_numtable_with_size(mcount);
|
1570
1570
|
*static_tbl = st_init_numtable();
|
1571
1571
|
for (i = 0; i < mcount; i++)
|
1572
1572
|
{
|
1573
1573
|
jobject m = (*jenv)->GetObjectArrayElement(jenv, methods, i);
|
1574
|
-
rjb_check_exception(jenv, 0);
|
1574
|
+
rjb_check_exception(jenv, 0);
|
1575
1575
|
modifier = (*jenv)->CallIntMethod(jenv, m, method_getModifiers);
|
1576
1576
|
if (!(modifier & ACC_STATIC))
|
1577
1577
|
{
|
@@ -1588,13 +1588,13 @@ static void setup_methods(JNIEnv* jenv, st_table** tbl, st_table** static_tbl,
|
|
1588
1588
|
static void setup_fields(JNIEnv* jenv, st_table** tbl, jobjectArray flds)
|
1589
1589
|
{
|
1590
1590
|
int i;
|
1591
|
-
jint modifier;
|
1591
|
+
jint modifier;
|
1592
1592
|
jsize fcount = (*jenv)->GetArrayLength(jenv, flds);
|
1593
1593
|
*tbl = st_init_numtable_with_size(fcount);
|
1594
1594
|
for (i = 0; i < fcount; i++)
|
1595
1595
|
{
|
1596
1596
|
jobject f = (*jenv)->GetObjectArrayElement(jenv, flds, i);
|
1597
|
-
rjb_check_exception(jenv, 0);
|
1597
|
+
rjb_check_exception(jenv, 0);
|
1598
1598
|
modifier = (*jenv)->CallIntMethod(jenv, f, field_getModifiers);
|
1599
1599
|
create_fieldinfo(jenv, *tbl, f, modifier & ACC_FINAL, modifier & ACC_STATIC);
|
1600
1600
|
(*jenv)->DeleteLocalRef(jenv, f);
|
@@ -1640,7 +1640,7 @@ static void load_constants(JNIEnv* jenv, jclass klass, VALUE self, jobjectArray
|
|
1640
1640
|
rjb_check_exception(jenv, 0);
|
1641
1641
|
jfid = (*jenv)->GetStaticFieldID(jenv, klass, cname, sigs);
|
1642
1642
|
rjb_check_exception(jenv, 0);
|
1643
|
-
switch (sig)
|
1643
|
+
switch (sig)
|
1644
1644
|
{
|
1645
1645
|
case 'D':
|
1646
1646
|
jv.d = (*jenv)->GetStaticDoubleField(jenv, klass, jfid);
|
@@ -1670,14 +1670,14 @@ static void load_constants(JNIEnv* jenv, jclass klass, VALUE self, jobjectArray
|
|
1670
1670
|
jv.l = (*jenv)->GetStaticObjectField(jenv, klass, jfid);
|
1671
1671
|
break;
|
1672
1672
|
}
|
1673
|
-
pname = (char*)cname;
|
1673
|
+
pname = (char*)cname;
|
1674
1674
|
if (!isupper(*cname))
|
1675
1675
|
{
|
1676
1676
|
pname = ALLOCA_N(char, strlen(cname) + 1);
|
1677
1677
|
strcpy(pname, cname);
|
1678
1678
|
*pname = toupper(*pname);
|
1679
|
-
if (!isupper(*pname)
|
1680
|
-
|| rb_const_defined(rb_obj_class(self), rb_intern(pname)))
|
1679
|
+
if (!isupper(*pname)
|
1680
|
+
|| rb_const_defined(rb_obj_class(self), rb_intern(pname)))
|
1681
1681
|
{
|
1682
1682
|
pname = NULL;
|
1683
1683
|
}
|
@@ -1697,7 +1697,7 @@ static void setup_metadata(JNIEnv* jenv, VALUE self, struct jv_data* ptr, VALUE
|
|
1697
1697
|
jmethodID mid;
|
1698
1698
|
jobjectArray methods;
|
1699
1699
|
jobjectArray flds;
|
1700
|
-
|
1700
|
+
|
1701
1701
|
jclass klass = (*jenv)->GetObjectClass(jenv, ptr->idata.obj);
|
1702
1702
|
ptr->idata.klass = (*jenv)->NewGlobalRef(jenv, klass);
|
1703
1703
|
rjb_check_exception(jenv, 0);
|
@@ -1726,7 +1726,7 @@ static void setup_metadata(JNIEnv* jenv, VALUE self, struct jv_data* ptr, VALUE
|
|
1726
1726
|
* def load(class_path = '', vmargs = [])
|
1727
1727
|
* class_path: passes for the class dir and jar name
|
1728
1728
|
* vmargs: strng array of vmarg (such as -Xrs)
|
1729
|
-
*
|
1729
|
+
*
|
1730
1730
|
* change in rjb 0.1.7, omit first argument for JNI version.
|
1731
1731
|
* because I misunderstood the number means (JVM but JNI).
|
1732
1732
|
*/
|
@@ -1769,7 +1769,7 @@ static VALUE rjb_s_load(int argc, VALUE* argv, VALUE self)
|
|
1769
1769
|
rb_funcall(user_path, stradd, 1, rb_ary_entry(classpath, 0));
|
1770
1770
|
}
|
1771
1771
|
userpath = StringValueCStr(user_path);
|
1772
|
-
|
1772
|
+
|
1773
1773
|
if (!NIL_P(vm_argv))
|
1774
1774
|
{
|
1775
1775
|
Check_Type(vm_argv, T_ARRAY);
|
@@ -1792,31 +1792,31 @@ static VALUE rjb_s_load(int argc, VALUE* argv, VALUE self)
|
|
1792
1792
|
RJB_LOAD_METHOD(getParameterTypes, jmethod, "getParameterTypes", "()[Ljava/lang/Class;");
|
1793
1793
|
RJB_LOAD_METHOD(getReturnType, jmethod, "getReturnType", "()Ljava/lang/Class;");
|
1794
1794
|
rjb_check_exception(jenv, 1);
|
1795
|
-
|
1795
|
+
|
1796
1796
|
RJB_FIND_CLASS(jfield, "java/lang/reflect/Field");
|
1797
1797
|
RJB_LOAD_METHOD(field_getModifiers, jfield, "getModifiers", "()I");
|
1798
1798
|
RJB_LOAD_METHOD(field_getName, jfield, "getName", "()Ljava/lang/String;");
|
1799
1799
|
RJB_LOAD_METHOD(field_getType, jfield, "getType", "()Ljava/lang/Class;");
|
1800
1800
|
rjb_check_exception(jenv, 1);
|
1801
|
-
|
1801
|
+
|
1802
1802
|
RJB_HOLD_CLASS(j_class, "java/lang/Class");
|
1803
1803
|
RJB_LOAD_METHOD(rjb_class_getName, j_class, "getName", "()Ljava/lang/String;");
|
1804
1804
|
rjb_check_exception(jenv, 1);
|
1805
|
-
|
1805
|
+
|
1806
1806
|
RJB_HOLD_CLASS(rjb_j_throwable, "java/lang/Throwable");
|
1807
1807
|
RJB_LOAD_METHOD(rjb_throwable_getMessage, rjb_j_throwable, "getMessage", "()Ljava/lang/String;");
|
1808
|
-
rjb_check_exception(jenv, 1);
|
1808
|
+
rjb_check_exception(jenv, 1);
|
1809
1809
|
|
1810
1810
|
RJB_HOLD_CLASS(j_string, "java/lang/String");
|
1811
1811
|
RJB_LOAD_METHOD(str_tostring, j_string, "toString", "()Ljava/lang/String;");
|
1812
|
-
rjb_check_exception(jenv, 1);
|
1812
|
+
rjb_check_exception(jenv, 1);
|
1813
1813
|
|
1814
1814
|
RJB_HOLD_CLASS(j_object, "java/lang/Object");
|
1815
|
-
rjb_check_exception(jenv, 1);
|
1815
|
+
rjb_check_exception(jenv, 1);
|
1816
1816
|
|
1817
1817
|
RJB_HOLD_CLASS(j_url, "java/net/URL");
|
1818
1818
|
RJB_LOAD_METHOD(url_new, j_url, "<init>", "(Ljava/lang/String;)V");
|
1819
|
-
rjb_check_exception(jenv, 1);
|
1819
|
+
rjb_check_exception(jenv, 1);
|
1820
1820
|
|
1821
1821
|
for (i = PRM_INT; i < PRM_LAST; i++)
|
1822
1822
|
{
|
@@ -1840,7 +1840,7 @@ static VALUE rjb_s_load(int argc, VALUE* argv, VALUE self)
|
|
1840
1840
|
rb_define_method(rb_singleton_class(jklass), "forName", rjb_class_forname, -1);
|
1841
1841
|
rb_define_alias(rb_singleton_class(jklass), "for_name", "forName");
|
1842
1842
|
rb_gc_register_address(&jklass);
|
1843
|
-
|
1843
|
+
|
1844
1844
|
return Qnil;
|
1845
1845
|
}
|
1846
1846
|
|
@@ -1874,7 +1874,7 @@ jobject get_systemloader(JNIEnv* jenv)
|
|
1874
1874
|
RJB_HOLD_CLASS(j_classloader, "java/lang/ClassLoader");
|
1875
1875
|
RJB_LOAD_STATIC_METHOD(get_system_classloader, j_classloader,
|
1876
1876
|
"getSystemClassLoader", "()Ljava/lang/ClassLoader;");
|
1877
|
-
rjb_check_exception(jenv, 1);
|
1877
|
+
rjb_check_exception(jenv, 1);
|
1878
1878
|
}
|
1879
1879
|
return (*jenv)->CallStaticObjectMethod(jenv, j_classloader, get_system_classloader);
|
1880
1880
|
}
|
@@ -1908,7 +1908,7 @@ static VALUE rjb_s_unload(int argc, VALUE* argv, VALUE self)
|
|
1908
1908
|
st_foreach(RHASH(rjb_loaded_classes)->tbl, clear_classes, 0);
|
1909
1909
|
#endif
|
1910
1910
|
#endif
|
1911
|
-
|
1911
|
+
|
1912
1912
|
if (rjb_jvm)
|
1913
1913
|
{
|
1914
1914
|
JNIEnv* jenv = rjb_attach_current_thread();
|
@@ -1990,10 +1990,10 @@ static VALUE rjb_delete_ref(struct jvi_data* ptr)
|
|
1990
1990
|
*/
|
1991
1991
|
static VALUE rj_bridge_free(struct rj_bridge* ptr)
|
1992
1992
|
{
|
1993
|
-
JNIEnv* jenv = rjb_attach_current_thread();
|
1993
|
+
JNIEnv* jenv = rjb_attach_current_thread();
|
1994
1994
|
if (jenv)
|
1995
1995
|
{
|
1996
|
-
(*jenv)->DeleteLocalRef(jenv, ptr->proxy);
|
1996
|
+
(*jenv)->DeleteLocalRef(jenv, ptr->proxy);
|
1997
1997
|
(*jenv)->DeleteLocalRef(jenv, ptr->bridge);
|
1998
1998
|
}
|
1999
1999
|
return Qnil;
|
@@ -2015,7 +2015,7 @@ static VALUE rjb_s_free(struct jv_data* ptr)
|
|
2015
2015
|
/* class never delete
|
2016
2016
|
JNIEnv* jenv = rjb_attach_current_thread();
|
2017
2017
|
struct cls_constructor** c;
|
2018
|
-
|
2018
|
+
|
2019
2019
|
rjb_delete_ref(&ptr->idata);
|
2020
2020
|
if (ptr->constructors)
|
2021
2021
|
{
|
@@ -2030,7 +2030,7 @@ static VALUE rjb_s_free(struct jv_data* ptr)
|
|
2030
2030
|
st_foreach(ptr->idata.methods, (int(*)())free_method_item, 0);
|
2031
2031
|
st_free_table(ptr->idata.methods);
|
2032
2032
|
}
|
2033
|
-
(*jenv)->DeleteGlobalRef(jenv, ptr->idata.klass);
|
2033
|
+
(*jenv)->DeleteGlobalRef(jenv, ptr->idata.klass);
|
2034
2034
|
st_delete(RHASH(rjb_loaded_classes)->tbl, clsname, NULL);
|
2035
2035
|
*/
|
2036
2036
|
return Qnil;
|
@@ -2049,7 +2049,7 @@ static VALUE createinstance(JNIEnv* jenv, int argc, VALUE* argv,
|
|
2049
2049
|
struct jv_data* jklass;
|
2050
2050
|
struct jvi_data* org;
|
2051
2051
|
jvalue* args = (argc) ? ALLOCA_N(jvalue, argc) : NULL;
|
2052
|
-
|
2052
|
+
|
2053
2053
|
Data_Get_Struct(self, struct jv_data, jklass);
|
2054
2054
|
org = &jklass->idata;
|
2055
2055
|
|
@@ -2087,7 +2087,7 @@ static VALUE import_class(JNIEnv* jenv, jclass jcls, VALUE clsname)
|
|
2087
2087
|
char* nm = ALLOCA_N(char, strlen(pclsname) + 1);
|
2088
2088
|
strcpy(nm, pclsname);
|
2089
2089
|
*nm = toupper(*nm);
|
2090
|
-
for (pclsname = nm; *pclsname; pclsname++)
|
2090
|
+
for (pclsname = nm; *pclsname; pclsname++)
|
2091
2091
|
{
|
2092
2092
|
if (*pclsname == '.')
|
2093
2093
|
{
|
@@ -2116,7 +2116,7 @@ static VALUE rjb_a_missing(int argc, VALUE* argv, VALUE self)
|
|
2116
2116
|
|
2117
2117
|
static VALUE rjb_i_prepare_proxy(VALUE self)
|
2118
2118
|
{
|
2119
|
-
return rb_funcall(self, rb_intern("instance_eval"), 1,
|
2119
|
+
return rb_funcall(self, rb_intern("instance_eval"), 1,
|
2120
2120
|
rb_str_new2("instance_eval(&" USER_INITIALIZE ")"));
|
2121
2121
|
}
|
2122
2122
|
|
@@ -2175,7 +2175,7 @@ static int check_rtype(JNIEnv* jenv, VALUE* pv, char* p)
|
|
2175
2175
|
if (strchr("IJ", *p)) return SOSO;
|
2176
2176
|
return strchr("BCDFS", *p) != NULL;
|
2177
2177
|
case T_BIGNUM:
|
2178
|
-
return strchr("BCDFIJS", *p) != NULL;
|
2178
|
+
return strchr("BCDFIJS", *p) != NULL;
|
2179
2179
|
case T_FLOAT:
|
2180
2180
|
if (*p == 'D') return SOSO;
|
2181
2181
|
if (*p == 'F') return SATISFIED;
|
@@ -2298,7 +2298,7 @@ static VALUE rjb_newinstance(int argc, VALUE* argv, VALUE self)
|
|
2298
2298
|
int weight = 0;
|
2299
2299
|
int cweight;
|
2300
2300
|
JNIEnv* jenv = rjb_prelude();
|
2301
|
-
|
2301
|
+
|
2302
2302
|
Data_Get_Struct(self, struct jv_data, ptr);
|
2303
2303
|
|
2304
2304
|
if (ptr->constructors)
|
@@ -2378,7 +2378,7 @@ jclass rjb_find_class(JNIEnv* jenv, VALUE name)
|
|
2378
2378
|
{
|
2379
2379
|
char* cname;
|
2380
2380
|
char* jnicls;
|
2381
|
-
|
2381
|
+
|
2382
2382
|
Check_Type(name, T_STRING);
|
2383
2383
|
cname = StringValueCStr(name);
|
2384
2384
|
jnicls = ALLOCA_N(char, strlen(cname) + 1);
|
@@ -2455,8 +2455,8 @@ static VALUE rjb_s_bind(VALUE self, VALUE rbobj, VALUE itfname)
|
|
2455
2455
|
VALUE result = Qnil;
|
2456
2456
|
jclass itf;
|
2457
2457
|
JNIEnv* jenv = rjb_prelude();
|
2458
|
-
|
2459
|
-
itf = rjb_find_class(jenv, itfname);
|
2458
|
+
|
2459
|
+
itf = rjb_find_class(jenv, itfname);
|
2460
2460
|
rjb_check_exception(jenv, 1);
|
2461
2461
|
if (itf)
|
2462
2462
|
{
|
@@ -2582,7 +2582,7 @@ static jobject conv_jarname_to_url(JNIEnv* jenv, VALUE jarname)
|
|
2582
2582
|
#if defined(DOSISH)
|
2583
2583
|
if (strlen(jarp) > 1 && jarp[1] == ':')
|
2584
2584
|
{
|
2585
|
-
sprintf(urlp, "file:///%s", jarp);
|
2585
|
+
sprintf(urlp, "file:///%s", jarp);
|
2586
2586
|
}
|
2587
2587
|
else
|
2588
2588
|
#endif
|
@@ -2604,7 +2604,7 @@ static jobject conv_jarname_to_url(JNIEnv* jenv, VALUE jarname)
|
|
2604
2604
|
}
|
2605
2605
|
#endif
|
2606
2606
|
arg.l = (*jenv)->NewStringUTF(jenv, urlp);
|
2607
|
-
rjb_check_exception(jenv, 0);
|
2607
|
+
rjb_check_exception(jenv, 0);
|
2608
2608
|
url = (*jenv)->NewObject(jenv, j_url, url_new, arg);
|
2609
2609
|
rjb_check_exception(jenv, 0);
|
2610
2610
|
return url;
|
@@ -2657,7 +2657,7 @@ static VALUE rjb_s_add_jar(VALUE self, VALUE jarname)
|
|
2657
2657
|
if (!url_loader)
|
2658
2658
|
{
|
2659
2659
|
args[0].l = (*jenv)->NewObjectArray(jenv, (jsize)((count == 0) ? 1 : count), j_url, NULL);
|
2660
|
-
rjb_check_exception(jenv, 0);
|
2660
|
+
rjb_check_exception(jenv, 0);
|
2661
2661
|
if (!count)
|
2662
2662
|
{
|
2663
2663
|
(*jenv)->SetObjectArrayElement(jenv, args[0].l, 0,
|
@@ -2732,7 +2732,7 @@ static VALUE rjb_i_class(VALUE self)
|
|
2732
2732
|
static VALUE getter(JNIEnv* jenv, struct cls_field* pf, struct jvi_data* ptr)
|
2733
2733
|
{
|
2734
2734
|
jvalue jv;
|
2735
|
-
switch (pf->result_signature)
|
2735
|
+
switch (pf->result_signature)
|
2736
2736
|
{
|
2737
2737
|
case 'D':
|
2738
2738
|
if (pf->static_field)
|
@@ -2839,7 +2839,7 @@ static void setter(JNIEnv* jenv, struct cls_field* pf, struct jvi_data* ptr, VA
|
|
2839
2839
|
{
|
2840
2840
|
jvalue jv;
|
2841
2841
|
pf->arg_convert(jenv, val, &jv, pf->field_signature, 0);
|
2842
|
-
switch (*pf->field_signature)
|
2842
|
+
switch (*pf->field_signature)
|
2843
2843
|
{
|
2844
2844
|
case 'D':
|
2845
2845
|
if (pf->static_field)
|
@@ -2960,7 +2960,7 @@ static VALUE invoke(JNIEnv* jenv, struct cls_method* pm, struct jvi_data* ptr,
|
|
2960
2960
|
found = 0;
|
2961
2961
|
if (argc == pm->basic.arg_count)
|
2962
2962
|
{
|
2963
|
-
if (sig && pm->basic.method_signature)
|
2963
|
+
if (sig && pm->basic.method_signature)
|
2964
2964
|
{
|
2965
2965
|
if (!strcmp(sig, pm->basic.method_signature))
|
2966
2966
|
{
|
@@ -2999,7 +2999,7 @@ static VALUE invoke(JNIEnv* jenv, struct cls_method* pm, struct jvi_data* ptr,
|
|
2999
2999
|
if (!prefer_pm)
|
3000
3000
|
{
|
3001
3001
|
const char* tname = rb_id2name(orgpm->name);
|
3002
|
-
if (sig)
|
3002
|
+
if (sig)
|
3003
3003
|
{
|
3004
3004
|
rb_raise(rb_eRuntimeError, "Fail: unknown method name `%s(\'%s\')'", tname, sig);
|
3005
3005
|
}
|
@@ -3092,7 +3092,7 @@ static VALUE invoke_by_instance(ID rmid, int argc, VALUE* argv,
|
|
3092
3092
|
{
|
3093
3093
|
ret = getter(jenv, pf, ptr);
|
3094
3094
|
}
|
3095
|
-
else
|
3095
|
+
else
|
3096
3096
|
{
|
3097
3097
|
if (argc == 1 && *(tname + strlen(tname) - 1) == '=')
|
3098
3098
|
{
|
@@ -3154,7 +3154,7 @@ static VALUE rjb_i_missing(int argc, VALUE* argv, VALUE self)
|
|
3154
3154
|
ID rmid = rb_to_id(argv[0]);
|
3155
3155
|
|
3156
3156
|
Data_Get_Struct(self, struct jvi_data, ptr);
|
3157
|
-
|
3157
|
+
|
3158
3158
|
return invoke_by_instance(rmid, argc -1, argv + 1, ptr, NULL);
|
3159
3159
|
}
|
3160
3160
|
|
@@ -3217,7 +3217,7 @@ static VALUE invoke_by_class(ID rmid, int argc, VALUE* argv,
|
|
3217
3217
|
rb_raise(rb_eRuntimeError, "Fail: unknown method name `%s'", tname);
|
3218
3218
|
}
|
3219
3219
|
}
|
3220
|
-
|
3220
|
+
|
3221
3221
|
return ret;
|
3222
3222
|
}
|
3223
3223
|
|
@@ -3259,7 +3259,7 @@ static VALUE rjb_missing(int argc, VALUE* argv, VALUE self)
|
|
3259
3259
|
return r;
|
3260
3260
|
}
|
3261
3261
|
}
|
3262
|
-
|
3262
|
+
|
3263
3263
|
Data_Get_Struct(self, struct jv_data, ptr);
|
3264
3264
|
return invoke_by_class(rmid, argc - 1, argv + 1, ptr, NULL);
|
3265
3265
|
}
|
@@ -3293,7 +3293,7 @@ void Init_rjbcore()
|
|
3293
3293
|
#else
|
3294
3294
|
rb_protect((VALUE(*)(VALUE))rb_require, (VALUE)"iconv", NULL);
|
3295
3295
|
#endif
|
3296
|
-
#endif
|
3296
|
+
#endif
|
3297
3297
|
rjb_loaded_classes = rb_hash_new();
|
3298
3298
|
#ifndef RUBINIUS
|
3299
3299
|
OBJ_FREEZE(rjb_loaded_classes);
|
@@ -3323,7 +3323,7 @@ void Init_rjbcore()
|
|
3323
3323
|
rb_define_class_variable(rjb, "@@classpath", rb_ary_new());
|
3324
3324
|
cvar_classpath = rb_intern("@@classpath");
|
3325
3325
|
|
3326
|
-
/* Java class object */
|
3326
|
+
/* Java class object */
|
3327
3327
|
rjbc = CLASS_NEW(rb_cObject, "Rjb_JavaClass");
|
3328
3328
|
rb_gc_register_address(&rjbc);
|
3329
3329
|
rb_define_method(rjbc, "method_missing", rjb_missing, -1);
|
@@ -3334,7 +3334,7 @@ void Init_rjbcore()
|
|
3334
3334
|
/* Java instance object */
|
3335
3335
|
rjbi = CLASS_NEW(rb_cObject, "Rjb_JavaProxy");
|
3336
3336
|
rb_gc_register_address(&rjbi);
|
3337
|
-
rb_define_method(rjbi, "method_missing", rjb_i_missing, -1);
|
3337
|
+
rb_define_method(rjbi, "method_missing", rjb_i_missing, -1);
|
3338
3338
|
rb_define_method(rjbi, "_invoke", rjb_i_invoke, -1);
|
3339
3339
|
rb_define_method(rjbi, "_classname", rjb_i_class, 0);
|
3340
3340
|
rb_define_method(rjbi, "_prepare_proxy", rjb_i_prepare_proxy, 0);
|
data/ext/rjbexception.c
CHANGED
@@ -26,11 +26,37 @@
|
|
26
26
|
#include "riconv.h"
|
27
27
|
#include "rjb.h"
|
28
28
|
|
29
|
+
static VALUE missing_delegate(int argc, VALUE* argv, VALUE self)
|
30
|
+
{
|
31
|
+
ID rmid = rb_to_id(argv[0]);
|
32
|
+
return rb_funcallv(rb_ivar_get(self, rb_intern("@cause")), rmid, argc - 1, argv + 1);
|
33
|
+
}
|
34
|
+
|
29
35
|
static VALUE get_cause(VALUE self)
|
30
36
|
{
|
31
37
|
return rb_funcall(rb_ivar_get(self, rb_intern("@cause")), rb_intern("cause"), 0);
|
32
38
|
}
|
33
39
|
|
40
|
+
static VALUE ex_respond_to(int argc, VALUE* argv, VALUE self)
|
41
|
+
{
|
42
|
+
if (argc < 1 || argc > 2)
|
43
|
+
{
|
44
|
+
rb_raise(rb_eArgError, "respond_to? require 1 or 2 arguments");
|
45
|
+
}
|
46
|
+
if (rb_to_id(argv[0]) == rb_intern("to_str"))
|
47
|
+
{
|
48
|
+
return Qfalse;
|
49
|
+
}
|
50
|
+
else if (rb_to_id(argv[0]) == rb_intern("exception"))
|
51
|
+
{
|
52
|
+
return Qtrue;
|
53
|
+
}
|
54
|
+
else
|
55
|
+
{
|
56
|
+
return rb_funcallv(rb_ivar_get(self, rb_intern("@cause")), rb_intern("respond_to?"), argc, argv);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
34
60
|
/*
|
35
61
|
* handle Java exception
|
36
62
|
* At this time, the Java exception is defined without the package name.
|
@@ -60,6 +86,8 @@ VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str)
|
|
60
86
|
{
|
61
87
|
rexp = rb_define_class(pcls, rb_eStandardError);
|
62
88
|
rb_define_method(rexp, "cause", get_cause, 0);
|
89
|
+
rb_define_method(rexp, "method_missing", missing_delegate, -1);
|
90
|
+
rb_define_method(rexp, "respond_to?", ex_respond_to, -1);
|
63
91
|
#if defined(HAVE_RB_HASH_ASET) || defined(RUBINIUS)
|
64
92
|
rb_hash_aset(rjb_loaded_classes, cname, rexp);
|
65
93
|
#else
|
@@ -69,7 +97,7 @@ VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str)
|
|
69
97
|
st_insert(RHASH(rjb_loaded_classes)->tbl, cname, rexp);
|
70
98
|
#endif
|
71
99
|
#endif
|
72
|
-
|
100
|
+
|
73
101
|
}
|
74
102
|
return rexp;
|
75
103
|
}
|
@@ -81,7 +109,7 @@ VALUE rjb_s_throw(int argc, VALUE* argv, VALUE self)
|
|
81
109
|
{
|
82
110
|
VALUE klass;
|
83
111
|
VALUE message;
|
84
|
-
JNIEnv* jenv = NULL;
|
112
|
+
JNIEnv* jenv = NULL;
|
85
113
|
|
86
114
|
rjb_load_vm_default();
|
87
115
|
|
data/lib/rjb.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright(c) 2006-2010,2012 arton
|
2
|
+
Copyright(c) 2006-2010,2012,2020 arton
|
3
3
|
=end
|
4
4
|
|
5
5
|
require 'rbconfig'
|
@@ -86,7 +86,7 @@ module Rjb
|
|
86
86
|
(org + klass.getMethods.select do |m|
|
87
87
|
blk.call(m)
|
88
88
|
end.map do |m|
|
89
|
-
m.name
|
89
|
+
m.name.to_sym
|
90
90
|
end).uniq
|
91
91
|
end
|
92
92
|
def format_sigs(s)
|
@@ -98,6 +98,19 @@ module Rjb
|
|
98
98
|
"[#{s.map{|m|m.nil? ? 'void' : m}.join(', ')}]"
|
99
99
|
end
|
100
100
|
end
|
101
|
+
def make_snake(nm)
|
102
|
+
nm.gsub(/(.)([A-Z])/) { "#{$1}_#{$2.downcase}" }
|
103
|
+
end
|
104
|
+
alias :rjb_org_respond_to? :respond_to?
|
105
|
+
def rjb_respond_to?(sym, klass, priv)
|
106
|
+
return true if (klass ? self : getClass).getMethods.select do |m|
|
107
|
+
(klass && !instance_method?(m) && (priv || public_method?(m))) ||
|
108
|
+
(!klass && instance_method?(m) && (priv || public_method?(m)))
|
109
|
+
end.map do |m|
|
110
|
+
[m.name.to_sym, make_snake(m.name).to_sym]
|
111
|
+
end.flatten.include?(sym.to_sym)
|
112
|
+
rjb_org_respond_to?(sym, priv)
|
113
|
+
end
|
101
114
|
end
|
102
115
|
|
103
116
|
class Rjb_JavaClass
|
@@ -119,6 +132,9 @@ module Rjb
|
|
119
132
|
"#{m}(#{format_sigs(self.static_sigs(m))})"
|
120
133
|
end
|
121
134
|
end
|
135
|
+
def respond_to?(sym, priv = false)
|
136
|
+
rjb_respond_to?(sym, true, priv)
|
137
|
+
end
|
122
138
|
end
|
123
139
|
class Rjb_JavaProxy
|
124
140
|
include JMethod
|
@@ -141,6 +157,9 @@ module Rjb
|
|
141
157
|
"#{m}(#{format_sigs(getClass.sigs(m))})"
|
142
158
|
end
|
143
159
|
end
|
160
|
+
def respond_to?(sym, priv = false)
|
161
|
+
rjb_respond_to?(sym, false, priv)
|
162
|
+
end
|
144
163
|
end
|
145
164
|
class Rjb_JavaBridge
|
146
165
|
def method_missing(name, *args)
|
data/test/test.rb
CHANGED
@@ -216,17 +216,28 @@ class TestRjb < Test::Unit::TestCase
|
|
216
216
|
end
|
217
217
|
|
218
218
|
def test_combination_charcters
|
219
|
-
teststr = "\xc7\x96\xc3\xbc\xcc\x84\x75\xcc\x88\xcc\x84
|
219
|
+
teststr = "\xc7\x96\xc3\xbc\xcc\x84\x75\xcc\x88\xcc\x84𪚲\xe3\x81\x8b\xe3\x82\x9a"
|
220
220
|
test = import('jp.co.infoseek.hp.arton.rjb.Test').new
|
221
221
|
s = test.getUmlaut()
|
222
222
|
if Object::const_defined?(:Encoding) #>=1.9
|
223
|
-
|
224
|
-
|
223
|
+
=begin
|
224
|
+
n = [teststr.bytes.length, s.bytes.length].max
|
225
|
+
puts "org:#{teststr.bytes.length}, ret:#{s.bytes.length}"
|
226
|
+
0.upto(n - 1) do |i|
|
227
|
+
b0 = teststr.getbyte(i)
|
228
|
+
b0 = 0 unless b0
|
229
|
+
b1 = s.getbyte(i)
|
230
|
+
b1 = 0 unless b1
|
231
|
+
puts sprintf("%02X - %02X\n", b0, b1)
|
232
|
+
end
|
233
|
+
=end
|
234
|
+
assert_equal(teststr.bytes.length, s.bytes.length)
|
235
|
+
assert_equal(teststr, s)
|
225
236
|
else
|
226
237
|
default_kcode = $KCODE
|
227
238
|
begin
|
228
239
|
$KCODE = "utf8"
|
229
|
-
assert_equal(
|
240
|
+
assert_equal(teststr, s)
|
230
241
|
ensure
|
231
242
|
$KCODE = default_kcode
|
232
243
|
end
|
@@ -715,19 +726,19 @@ class TestRjb < Test::Unit::TestCase
|
|
715
726
|
end
|
716
727
|
def test_methods_extension
|
717
728
|
m = @jString.new('').methods
|
718
|
-
assert m.include?(
|
729
|
+
assert m.include?(:indexOf)
|
719
730
|
end
|
720
731
|
def test_class_methods_extension
|
721
732
|
m = @jString.methods
|
722
|
-
assert m.include?(
|
733
|
+
assert m.include?(:format)
|
723
734
|
end
|
724
735
|
def test_pmethods_extension
|
725
736
|
m = @jString.new('').public_methods
|
726
|
-
assert m.include?(
|
737
|
+
assert m.include?(:indexOf)
|
727
738
|
end
|
728
739
|
def test_class_pmethods_extension
|
729
740
|
m = @jString.public_methods
|
730
|
-
assert m.include?(
|
741
|
+
assert m.include?(:format)
|
731
742
|
end
|
732
743
|
def test_java_methods
|
733
744
|
indexof = @jString.new('').java_methods.find do |m|
|
@@ -933,5 +944,36 @@ class TestRjb < Test::Unit::TestCase
|
|
933
944
|
assert_equal org.size, len
|
934
945
|
assert_equal org, buffer[0...len]
|
935
946
|
end
|
936
|
-
end
|
937
947
|
|
948
|
+
def test_re_raise
|
949
|
+
begin
|
950
|
+
@jInteger.parseInt('blabla')
|
951
|
+
flunk('no exception')
|
952
|
+
rescue NumberFormatException => e
|
953
|
+
begin
|
954
|
+
raise
|
955
|
+
rescue => e
|
956
|
+
assert_equal(NumberFormatException, e.class)
|
957
|
+
# OK
|
958
|
+
end
|
959
|
+
end
|
960
|
+
end
|
961
|
+
|
962
|
+
def test_java_utf8
|
963
|
+
y = @jString.new('𠮷野家')
|
964
|
+
assert_equal '𠮷野家', y.toString
|
965
|
+
end
|
966
|
+
|
967
|
+
def test_respond_to
|
968
|
+
str = @jString.new('blabla')
|
969
|
+
assert str.respond_to? :substring
|
970
|
+
assert_false str.respond_to? :unknown_method
|
971
|
+
begin
|
972
|
+
@jInteger.parseInt('blabla')
|
973
|
+
rescue => e
|
974
|
+
assert e.respond_to? :print_stack_trace
|
975
|
+
assert e.respond_to? :printStackTrace
|
976
|
+
assert_false e.respond_to? :unknown_method
|
977
|
+
end
|
978
|
+
end
|
979
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rjb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- arton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'RJB is a bridge program that connect between Ruby and Java with Java
|
14
14
|
Native Interface.
|
@@ -24,7 +24,7 @@ files:
|
|
24
24
|
- ChangeLog
|
25
25
|
- data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class
|
26
26
|
- ext/RBridge.java
|
27
|
-
- ext/depend
|
27
|
+
- ext/depend.erb
|
28
28
|
- ext/extconf.h
|
29
29
|
- ext/extconf.rb
|
30
30
|
- ext/jniwrap.h
|
@@ -74,7 +74,7 @@ files:
|
|
74
74
|
- test/x.rb
|
75
75
|
homepage: https://www.artonx.org/collabo/backyard/?RubyJavaBridge
|
76
76
|
licenses:
|
77
|
-
- LGPL
|
77
|
+
- LGPL-2.1-or-later
|
78
78
|
metadata: {}
|
79
79
|
post_install_message:
|
80
80
|
rdoc_options: []
|
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
94
94
|
- none
|
95
95
|
- JDK 5.0
|
96
|
-
rubygems_version: 3.
|
96
|
+
rubygems_version: 3.1.2
|
97
97
|
signing_key:
|
98
98
|
specification_version: 4
|
99
99
|
summary: Ruby Java bridge
|