rjb 1.5.9 → 1.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b8eddc0f7bf9505a5f48e1098dd18f0133253986978599c40e5c39ce6cc48b90
4
- data.tar.gz: 880d819371d1cb1c738c2db0c0395873d86391ecef8b056c7597aacf930598ce
3
+ metadata.gz: 05a38f07091a13ff2a32e770eb3a0ea3337e6e62698ad657241dffe264143b64
4
+ data.tar.gz: 21cbbcf1476283d6e7a0b71f4be5279834cd38d752473d04a119d0ab60d17228
5
5
  SHA512:
6
- metadata.gz: ad9b557b9ff3d9091663df6041b63672ba96a2e192f23deba2dbe6dfe94edf09f36176e8894b2e71c8194f68e6f4e23b1e67c9a7064c52c5dea5ce0723be9e14
7
- data.tar.gz: 7da7f62f72373a83ef662ee62cd37c7fdac28a52c6fc059af337970a7249103858442c304b139945118371c2893ac6057404f619016d4cff758a5aabaffd80f2
6
+ metadata.gz: 5167ed5ba650846bb0efa583969bd0ebee8dd66f7a20b30711a7c04774e3362e48805a3a56408af550a235830be4029f6f9728bd2590603511d9a5b1b259c212
7
+ data.tar.gz: 0a466f32ea539cb7e794bc761fca6a8aa97b64a120b61803141500f940144959f3695ece1c04930981ee86af1dac4b7841cc1891682d82118a51edeb0d3515f0
data/ChangeLog CHANGED
@@ -1,3 +1,36 @@
1
+ Sun Feb 7 2021 arton
2
+ * ext/extconf.rb
3
+ use javah if `javac -version` didn't return the version number (ex. 1.4.2)
4
+ * ext/rjb.c
5
+ RJB_VERSION -> 1.6.3
6
+ Sun Feb 7 2021 arton
7
+ * ext/extconf.rb
8
+ check javac and javah version
9
+ * ext/rjb.c
10
+ RJB_VERSION -> 1.6.3
11
+ Sat Aug 1 2020 arton
12
+ * ext/rjb.c
13
+ RJB_VERSION -> 1.6.2
14
+ * ext/load.c
15
+ support OpenJDK directory structure (without jre)
16
+ * lib/rjb.rb
17
+ change copyright notice
18
+ Wed Jul 17 2019 arton
19
+ * ext/rjb.c
20
+ RJB_VERSION -> 1.6.1
21
+ * lib/rjb.rb
22
+ java_methods and methods return symbol
23
+ implements respond_to? for Java methods
24
+ * ext/rbjexception.c
25
+ delegate to JavaProxy for respond_to? (except for to_str and exception)
26
+ * test/test.rb
27
+ change java_methods test to adjust above change
28
+ add respond_to? test
29
+ Thu Jul 11 2019 arton
30
+ * ext/rjb.c
31
+ RJB_VERSION -> 1.6.0
32
+ * ext/riconv.c
33
+ encode/decode between utf-8 and cesu-8 if char was greater than \uffff
1
34
  Sun Feb 17 2019 lamby / arton
2
35
  * ext/rjb.c
3
36
  RJB_VERSION -> 1.5.9
data/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # Rjb is Ruby-Java bridge using Java Native Interface.
2
+
3
+ The [Ruby Kaigi 2010](http://www.slideshare.net/artonx/j-ruby-kaigi-2010)
4
+ Presentation on `Rjb`.
5
+
6
+ A short [introduction](https://www.artonx.org/collabo/backyard/?RubyJavaBridge)
7
+ in English.
8
+
9
+ Some [examples](https://www.artonx.org/collabo/backyard/?RjbQandA) in
10
+ Japanese, but the source code is clear for everybody.
11
+
12
+ # How to install
13
+
14
+ You need to install Java2 sdk, and setup `JAVA_HOME` enviromental
15
+ varible except for OS X. I assume that OS X's `JAVA_HOME` is reported
16
+ by calling `/usr/libexec/java_home`.
17
+
18
+ This done please proceed with:
19
+
20
+ ``` bash
21
+ ruby setup.rb config
22
+ ruby setup.rb setup
23
+ ```
24
+
25
+ ``` bash
26
+ # (in Unix)
27
+ sudo ruby setup.rb install
28
+ ```
29
+
30
+ or
31
+
32
+ ``` bash
33
+ # (in win32)
34
+ ruby setup.rb install
35
+ ```
36
+
37
+ # How to test
38
+
39
+ On Windows based machines:
40
+
41
+ ``` bash
42
+ cd test
43
+ ruby test.rb
44
+ ```
45
+
46
+ On Unix based machines plese see `test/readme.unix`. You need to set
47
+ `LD_LIBRARY_PATH` environmental variable to run `rjb`.
48
+
49
+ # Notice for opening non-ASCII 7bit filename
50
+
51
+ If you'll plan to open the non-ascii character named file by Java
52
+ class through Rjb, it may require to set LC_ALL environment variable
53
+ in you sciprt.
54
+
55
+ For example in Rails, set above line in `production.rb` as your environment:
56
+
57
+ ``` bash
58
+ ENV['LC_ALL'] = 'en_us.utf8' # or ja_JP.utf8 etc.
59
+ ```
60
+
61
+ cf: http://bugs.sun.com/view_bug.do?bug_id=4733494
62
+ (Thanks Paul for this information).
63
+
64
+ # Contact
65
+ artonx@yahoo.co.jp
data/ext/extconf.h CHANGED
@@ -4,5 +4,5 @@
4
4
  #define HAVE_NL_LANGINFO 1
5
5
  #define HAVE_SETLOCALE 1
6
6
  #define HAVE_GETENV 1
7
- #define RJB_RUBY_VERSION_CODE 261
7
+ #define RJB_RUBY_VERSION_CODE 300
8
8
  #endif
data/ext/extconf.rb CHANGED
@@ -76,10 +76,19 @@ when /cygwin/, /mingw/
76
76
  $defs << '-DNONAMELESSUNION'
77
77
  end
78
78
 
79
+ JAVAH_COMMAND = 'javac -h . -classpath ../data/rjb RBridge.java'.freeze
80
+
79
81
  if find_executable('javah')
80
- javah = 'javah -classpath ../data/rjb jp.co.infoseek.hp.arton.rjb.RBridge'
82
+ cversion = (`javac -version` =~ /\d+\.\d+\.\d+/ ) ? $& : nil
83
+ hversion = (`javah -version` =~ /\d+\.\d+\.\d+/ ) ? $& : nil
84
+ if cversion == hversion || cversion.nil?
85
+ javah = 'javah -classpath ../data/rjb jp.co.infoseek.hp.arton.rjb.RBridge'
86
+ else
87
+ $stderr.puts "warning: javac and javah version unmatch => javah: #{hversion}, javac: #{cversion}"
88
+ javah = JAVAH_COMMAND
89
+ end
81
90
  else
82
- javah = 'javac -h . -classpath ../data/rjb RBridge.java'
91
+ javah = JAVAH_COMMAND
83
92
  end
84
93
  File.open('depend', 'w') do |fout|
85
94
  fout.write ERB.new(IO::read('depend.erb')).result
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 and Fiddle is not defined.");
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
- + strlen(ARCH) + strlen(jvmtype) + 1);
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 cEncoding, encoding, utf8;
196
- cEncoding = rb_const_get(rb_cObject, rb_intern("Encoding"));
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
- utf8 = rb_const_get(cEncoding, rb_intern("UTF_8"));
199
- if (encoding != utf8)
323
+ if (encoding != encoding_utf8)
200
324
  {
201
- VALUE ret = rb_funcall(local_string, rb_intern("encode"), 2, utf8, encoding);
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
- #endif
206
- return ret;
328
+ local_string = ret;
207
329
  }
208
- else
330
+ if (contains_surrogate_pair(StringValuePtr(local_string)))
209
331
  {
210
- return local_string;
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
- return rb_funcall(utf8_string, rb_intern("force_encoding"), 1, rb_const_get(rb_cEncoding, rb_intern("UTF_8")));
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.5.9"
17
+ #define RJB_VERSION "1.6.4"
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
@@ -29,7 +29,7 @@
29
29
  static VALUE missing_delegate(int argc, VALUE* argv, VALUE self)
30
30
  {
31
31
  ID rmid = rb_to_id(argv[0]);
32
- return rb_funcall(rb_ivar_get(self, rb_intern("@cause")), rmid, argc - 1, argv + 1);
32
+ return rb_funcallv(rb_ivar_get(self, rb_intern("@cause")), rmid, argc - 1, argv + 1);
33
33
  }
34
34
 
35
35
  static VALUE get_cause(VALUE self)
@@ -43,7 +43,18 @@ static VALUE ex_respond_to(int argc, VALUE* argv, VALUE self)
43
43
  {
44
44
  rb_raise(rb_eArgError, "respond_to? require 1 or 2 arguments");
45
45
  }
46
- return rb_to_id(argv[0]) == rb_intern("to_str") ? Qfalse : Qtrue;
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
+ }
47
58
  }
48
59
 
49
60
  /*
@@ -86,7 +97,7 @@ VALUE rjb_get_exception_class(JNIEnv* jenv, jstring str)
86
97
  st_insert(RHASH(rjb_loaded_classes)->tbl, cname, rexp);
87
98
  #endif
88
99
  #endif
89
-
100
+
90
101
  }
91
102
  return rexp;
92
103
  }
@@ -98,7 +109,7 @@ VALUE rjb_s_throw(int argc, VALUE* argv, VALUE self)
98
109
  {
99
110
  VALUE klass;
100
111
  VALUE message;
101
- JNIEnv* jenv = NULL;
112
+ JNIEnv* jenv = NULL;
102
113
 
103
114
  rjb_load_vm_default();
104
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\xed\xa1\xa9\xed\xba\xb2\xe3\x81\x8b\xe3\x82\x9a"
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
- teststr = teststr.force_encoding(Encoding::UTF_8)
224
- assert_equal(s, teststr)
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(s, teststr)
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?('indexOf')
729
+ assert m.include?(:indexOf)
719
730
  end
720
731
  def test_class_methods_extension
721
732
  m = @jString.methods
722
- assert m.include?('format')
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?('indexOf')
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?('format')
741
+ assert m.include?(:format)
731
742
  end
732
743
  def test_java_methods
733
744
  indexof = @jString.new('').java_methods.find do |m|
@@ -947,5 +958,22 @@ class TestRjb < Test::Unit::TestCase
947
958
  end
948
959
  end
949
960
  end
950
- end
951
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,19 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rjb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.9
4
+ version: 1.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - arton
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-17 00:00:00.000000000 Z
11
+ date: 2021-02-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 'RJB is a bridge program that connect between Ruby and Java with Java
13
+ description: RJB is a Bridge library which connects Ruby and Java code using the Java
14
14
  Native Interface.
15
-
16
- '
17
15
  email: artonx@gmail.com
18
16
  executables: []
19
17
  extensions:
@@ -22,6 +20,7 @@ extra_rdoc_files: []
22
20
  files:
23
21
  - COPYING
24
22
  - ChangeLog
23
+ - README.md
25
24
  - data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class
26
25
  - ext/RBridge.java
27
26
  - ext/depend.erb
@@ -72,11 +71,11 @@ files:
72
71
  - test/test_osxload.rb
73
72
  - test/test_unload.rb
74
73
  - test/x.rb
75
- homepage: https://www.artonx.org/collabo/backyard/?RubyJavaBridge
74
+ homepage: http://www.artonx.org/collabo/backyard/?RubyJavaBridge
76
75
  licenses:
77
- - LGPL
76
+ - LGPL-2.1-or-later
78
77
  metadata: {}
79
- post_install_message:
78
+ post_install_message:
80
79
  rdoc_options: []
81
80
  require_paths:
82
81
  - lib
@@ -91,11 +90,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
90
  - !ruby/object:Gem::Version
92
91
  version: '0'
93
92
  requirements:
94
- - none
95
93
  - JDK 5.0
96
- rubygems_version: 3.0.1
97
- signing_key:
94
+ rubygems_version: 3.2.3
95
+ signing_key:
98
96
  specification_version: 4
99
- summary: Ruby Java bridge
100
- test_files:
101
- - test/test.rb
97
+ summary: Ruby Java Bridge
98
+ test_files: []