rjb 1.1.3 → 1.1.4

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.
data/ChangeLog CHANGED
@@ -1,3 +1,29 @@
1
+ Thu Aug 14 arton
2
+ *ext/rjb.c, load.c, etc
3
+ change comment line // -> /* */ because AIX's compiler
4
+ add _AIX for load.c (this patch from Ittay Dror, thanks)
5
+ *ext/load.c
6
+ add ALT_JVM_TYPE for alternative jvm directory (by Kumar)
7
+ Sun Jul 13 arton
8
+ *ext/rjb.c
9
+ display warning when Rjb load jvm implicitly if $DEBUG or $VERBOSE.
10
+ Mon May 26 arton
11
+ *ext/rjb.c
12
+ correct char primitive conversion for Bigendian machine.
13
+ use macroes for loading classes
14
+ *ext/load.c
15
+ adjust OS X's directory
16
+ *ext/extconf.rb
17
+ adjust OS X's directory if Home exists
18
+ Thu Mar 27 arton
19
+ *ext/rjb.c
20
+ mark version 1.1.4 for the next release.
21
+ *test/test.rb
22
+ remove unload, because it fails.
23
+ It's more important to assert each functions.
24
+ Thu Mar 27 arton
25
+ *ext/riconv.c
26
+ activate conv tables for getenv configuration.
1
27
  Tue Mar 5 Kuwashima
2
28
  *ext/rjb.c
3
29
  *ext/rjb.h
@@ -5,5 +5,5 @@
5
5
  #define HAVE_NL_LANGINFO 1
6
6
  #define HAVE_SETLOCALE 1
7
7
  #define HAVE_GETENV 1
8
- #define RJB_RUBY_VERSION_CODE 186
8
+ #define RJB_RUBY_VERSION_CODE 187
9
9
  #endif
@@ -33,6 +33,7 @@ if !javahome.nil?
33
33
  raise "JAVA_HOME is not directory." unless File.directory?(javahome)
34
34
  p = Path.new
35
35
  inc = p.include(javahome, 'include')
36
+ inc = p.include(javahome, 'Home/include') unless File.exists?(inc)
36
37
  Dir.open(inc).each do |d|
37
38
  next if d[0] == ?.
38
39
  if File.directory?(p.joint(inc, d))
@@ -12,7 +12,7 @@
12
12
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
13
  * Lesser General Public License for more details.
14
14
  *
15
- * $Id: jniwrap.h 4 2006-09-11 15:21:38Z arton $
15
+ * $Id: jniwrap.h 78 2008-08-14 10:47:31Z arton $
16
16
  */
17
17
  #ifndef _Included_jniwrap
18
18
  #define _Included_jniwrap
data/ext/load.c CHANGED
@@ -12,7 +12,7 @@
12
12
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
13
  * Lesser General Public License for more details.
14
14
  *
15
- * $Id: load.c 65 2008-03-26 13:19:29Z arton $
15
+ * $Id: load.c 77 2008-08-14 10:22:35Z arton $
16
16
  */
17
17
 
18
18
  #include <stdlib.h>
@@ -33,6 +33,7 @@
33
33
  #include "rjb.h"
34
34
 
35
35
  #define JVM_TYPE "client"
36
+ #define ALT_JVM_TYPE "classic"
36
37
 
37
38
  #if defined(_WIN32) || defined(__CYGWIN__)
38
39
  #if defined(__CYGWIN__)
@@ -47,6 +48,12 @@
47
48
  #define JVMDLL "%s/Libraries/libjvm_compat.dylib"
48
49
  #define DIRSEPARATOR '/'
49
50
  #define CLASSPATH_SEP ':'
51
+ #define HOME_NAME "/Home"
52
+ #define HOME_NAME_LEN strlen(HOME_NAME)
53
+ #define DEFAULT_HOME "/System/Library/Frameworks/JavaVM.framework"
54
+ #elif defined(_AIX)
55
+ #define ARCH "ppc"
56
+ #define JVM_TYPE "j9vm"
50
57
  #else /* defined(_WIN32) || defined(__CYGWIN__) */
51
58
  #if defined(__sparc_v9__)
52
59
  #define ARCH "sparcv9"
@@ -83,13 +90,23 @@ static int load_jvm(char* jvmtype)
83
90
  char* libpath;
84
91
  char* java_home;
85
92
  char* jh;
86
- VALUE dl;
87
- VALUE importer;
88
93
 
89
- #if defined(__APPLE__) && defined(__MACH__)
90
- jh = "/System/Library/Frameworks/JavaVM.framework";
91
- #else
92
94
  jh = getenv("JAVA_HOME");
95
+ #if defined(__APPLE__) && defined(__MACH__)
96
+ if (!jh)
97
+ {
98
+ jh = DEFAULT_HOME;
99
+ }
100
+ else
101
+ {
102
+ if (strlen(jh) > HOME_NAME_LEN
103
+ && strcasecmp(jh + strlen(jh) - HOME_NAME_LEN, HOME_NAME) == 0)
104
+ {
105
+ char* p = ALLOCA_N(char, strlen(jh) + 8);
106
+ sprintf(p, "%s/..", jh);
107
+ jh = p;
108
+ }
109
+ }
93
110
  #endif
94
111
  if (!jh)
95
112
  {
@@ -136,7 +153,7 @@ static int load_jvm(char* jvmtype)
136
153
 
137
154
  jvmdll = rb_funcall(rb_const_get(rb_cObject, rb_intern("DL")), rb_intern("dlopen"), 1, rb_str_new2(libpath));
138
155
 
139
- //get function pointers of JNI
156
+ /* get function pointers of JNI */
140
157
  #if RJB_RUBY_VERSION_CODE < 190
141
158
  getdefaultjavavminitargsfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2("JNI_GetDefaultJavaVMInitArgs"), rb_str_new2("IP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
142
159
  createjavavmfunc = rb_funcall(rb_funcall(rb_funcall(jvmdll, rb_intern("[]"), 2, rb_str_new2("JNI_CreateJavaVM"), rb_str_new2("IPPP")), rb_intern("to_ptr"), 0), rb_intern("to_i"), 0);
@@ -211,7 +228,6 @@ int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs* vm_args, char* userpath, VALU
211
228
  { "DUMMY", NULL }, /* for classpath count */
212
229
  };
213
230
  char* newpath;
214
- VALUE ptr;
215
231
  int len;
216
232
  int result;
217
233
  GETDEFAULTJAVAVMINITARGS initargs;
@@ -223,7 +239,7 @@ int rjb_create_jvm(JNIEnv** pjenv, JavaVMInitArgs* vm_args, char* userpath, VALU
223
239
 
224
240
  if (!RTEST(jvmdll))
225
241
  {
226
- if (!load_jvm(JVM_TYPE))
242
+ if (!load_jvm(JVM_TYPE) && !load_jvm(ALT_JVM_TYPE))
227
243
  {
228
244
  return -1;
229
245
  }
data/ext/rjb.c CHANGED
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Rjb - Ruby <-> Java Bridge
3
- * Copyright(c) 2004,2005,2006,2007 arton
3
+ * Copyright(c) 2004,2005,2006,2007,2008 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
@@ -12,10 +12,10 @@
12
12
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
13
  * Lesser General Public License for more details.
14
14
  *
15
- * $Id: rjb.c 64 2008-03-05 14:24:22Z kuwa1 $
15
+ * $Id: rjb.c 77 2008-08-14 10:22:35Z arton $
16
16
  */
17
17
 
18
- #define RJB_VERSION "1.1.3"
18
+ #define RJB_VERSION "1.1.4"
19
19
 
20
20
  #include "ruby.h"
21
21
  #include "extconf.h"
@@ -28,6 +28,7 @@
28
28
  #include "jp_co_infoseek_hp_arton_rjb_RBridge.h"
29
29
  #include "riconv.h"
30
30
  #include "rjb.h"
31
+ #include "ctype.h"
31
32
 
32
33
  /*
33
34
  * Method Modifier Flag defined in
@@ -41,6 +42,20 @@
41
42
  #define ACC_VOLATILE 0x0040
42
43
  #define ACC_TRANSIENT 0x0080
43
44
 
45
+ #define RJB_FIND_CLASS(var, name) \
46
+ var = (*jenv)->FindClass(jenv, name); \
47
+ rjb_check_exception(jenv, 1)
48
+ #define RJB_HOLD_CLASS(var, name) \
49
+ var = (*jenv)->FindClass(jenv, name); \
50
+ rjb_check_exception(jenv, 1); \
51
+ var = (*jenv)->NewGlobalRef(jenv, var)
52
+ #define RJB_LOAD_METHOD(var, obj, name, sig) \
53
+ var = (*jenv)->GetMethodID(jenv, obj, name, sig); \
54
+ rjb_check_exception(jenv, 1)
55
+ #define RJB_LOAD_STATIC_METHOD(var, obj, name, sig) \
56
+ var = (*jenv)->GetStaticMethodID(jenv, obj, name, sig); \
57
+ rjb_check_exception(jenv, 1)
58
+
44
59
  static void register_class(VALUE, VALUE);
45
60
  static VALUE import_class(JNIEnv* jenv, jclass, VALUE);
46
61
  static VALUE register_instance(JNIEnv* jenv, struct jvi_data*, jobject);
@@ -101,7 +116,7 @@ enum PrimitiveType {
101
116
  PRM_SHORT,
102
117
  PRM_BYTE,
103
118
  PRM_FLOAT,
104
- //
119
+ /* */
105
120
  PRM_LAST
106
121
  };
107
122
 
@@ -145,6 +160,7 @@ static char* java2jniname(char* jnicls)
145
160
  return jnicls;
146
161
  }
147
162
 
163
+ #if 0
148
164
  static char* jni2javaname(char* jnicls)
149
165
  {
150
166
  char* p;
@@ -157,6 +173,7 @@ static char* jni2javaname(char* jnicls)
157
173
  }
158
174
  return jnicls;
159
175
  }
176
+ #endif
160
177
 
161
178
  static char* next_sig(char* p)
162
179
  {
@@ -239,7 +256,7 @@ static VALUE jv2rv_r(JNIEnv* jenv, jvalue val)
239
256
  VALUE clsname;
240
257
  VALUE v;
241
258
  struct jv_data* ptr;
242
- // object to ruby
259
+ /* object to ruby */
243
260
  if (!val.l) return Qnil;
244
261
  klass = (*jenv)->GetObjectClass(jenv, val.l);
245
262
 
@@ -517,7 +534,7 @@ static jprimitive_table jpcvt[] = {
517
534
  { "java/lang/Double", "doubleValue", "()D", "(D)V", NULL, 0, 0, jdouble2rv, },
518
535
  { "java/lang/Boolean", "booleanValue", "()Z", "(Z)Ljava/lang/Boolean;",
519
536
  NULL, 0, 0, jboolean2rv, },
520
- { "java/lang/Character", "charValue", "()C", NULL, NULL, 0, 0, jint2rv, },
537
+ { "java/lang/Character", "charValue", "()C", NULL, NULL, 0, 0, jchar2rv, },
521
538
  { "java/lang/Short", "intValue", "()I", NULL, NULL, 0, 0, jint2rv, },
522
539
  { "java/lang/Byte", "intValue", "()I", NULL, NULL, 0, 0, jint2rv, },
523
540
  { "java/lang/Float", "doubleValue", "()D", NULL, NULL, 0, 0, jdouble2rv, },
@@ -701,7 +718,7 @@ static void rv2jstring(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
701
718
  Data_Get_Struct(val, struct jvi_data, ptr);
702
719
  if ((*jenv)->IsInstanceOf(jenv, ptr->obj, j_string))
703
720
  {
704
- return; // never delete at this time
721
+ return; /* never delete at this time */
705
722
  }
706
723
  }
707
724
  }
@@ -725,7 +742,7 @@ static void rv2jobject(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
725
742
  }
726
743
  else if (NIL_P(val))
727
744
  {
728
- // no-op
745
+ /* no-op */
729
746
  }
730
747
  else if (FIXNUM_P(val))
731
748
  {
@@ -751,7 +768,7 @@ static void rv2jobject(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
751
768
  case T_DATA:
752
769
  if (RBASIC(val)->klass == rjbi || RBASIC(val)->klass == rjb)
753
770
  {
754
- // TODO: check instanceof (class (in psig) )
771
+ /* TODO: check instanceof (class (in psig) ) */
755
772
  struct jvi_data* ptr;
756
773
  Data_Get_Struct(val, struct jvi_data, ptr);
757
774
  jv->l = ptr->obj;
@@ -812,7 +829,7 @@ static void check_fixnumarray(VALUE v)
812
829
  int i;
813
830
  int len = RARRAY_LEN(v);
814
831
  VALUE* p = RARRAY_PTR(v);
815
- // check all fixnum (overflow is permit)
832
+ /* check all fixnum (overflow is permit) */
816
833
  for (i = 0; i < len; i++)
817
834
  {
818
835
  if (!FIXNUM_P(*p++))
@@ -829,7 +846,7 @@ static jarray r2barray(JNIEnv* jenv, VALUE v, const char* cls)
829
846
  {
830
847
  ary = (*jenv)->NewByteArray(jenv, RSTRING_LEN(v));
831
848
  (*jenv)->SetByteArrayRegion(jenv, ary, 0, RSTRING_LEN(v),
832
- RSTRING_PTR(v));
849
+ (const jbyte*)RSTRING_PTR(v));
833
850
  }
834
851
  else if (TYPE(v) == T_ARRAY)
835
852
  {
@@ -1079,7 +1096,7 @@ static void rv2jarray(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, int
1079
1096
  jarray ja = NULL;
1080
1097
  if (NIL_P(val))
1081
1098
  {
1082
- // no-op, null for an array
1099
+ /* no-op, null for an array */
1083
1100
  }
1084
1101
  else if (*(psig + 1) == '[')
1085
1102
  {
@@ -1178,7 +1195,7 @@ static J2R get_arrayconv(const char* cname, char* pdepth)
1178
1195
  return jcvt[i].ja2r;
1179
1196
  }
1180
1197
  }
1181
- return jarray2rv;
1198
+ return &jarray2rv;
1182
1199
  }
1183
1200
 
1184
1201
  static J2R get_j2r(JNIEnv* jenv, jobject cls, char* psig, char* pdepth, char* ppsig, off_t* piv, int static_method)
@@ -1333,7 +1350,6 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
1333
1350
  {
1334
1351
  struct cls_method* result;
1335
1352
  struct cls_method* pm;
1336
- char* param = NULL;
1337
1353
  const char* jname;
1338
1354
  jstring nm;
1339
1355
  jobjectArray parama;
@@ -1362,7 +1378,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
1362
1378
  (*jenv)->DeleteLocalRef(jenv, cls);
1363
1379
  result->static_method = static_method;
1364
1380
  register_methodinfo(result, tbl);
1365
- // create method alias
1381
+ /* create method alias */
1366
1382
  pm = NULL;
1367
1383
  if (strlen(rname) > 3
1368
1384
  && (*rname == 'g' || *rname == 's') && *(rname + 1) == 'e' && *(rname + 2) == 't')
@@ -1409,7 +1425,6 @@ static void create_fieldinfo(JNIEnv* jenv, st_table* tbl, jobject f, int readonl
1409
1425
  jobject cls;
1410
1426
  char sigs[256];
1411
1427
  off_t iv = 0;
1412
- char sig = 0;
1413
1428
 
1414
1429
  result = ALLOC(struct cls_field);
1415
1430
  memset(result, 0, sizeof(struct cls_field));
@@ -1525,7 +1540,7 @@ static void load_constants(JNIEnv* jenv, jclass klass, VALUE self, jobjectArray
1525
1540
  char sigs[256];
1526
1541
  char* pname;
1527
1542
 
1528
- // constants make define directly in the ruby object
1543
+ /* constants make define directly in the ruby object */
1529
1544
  cls = (*jenv)->CallObjectMethod(jenv, f, field_getType);
1530
1545
  rjb_check_exception(jenv, 0);
1531
1546
  iv = 0;
@@ -1673,67 +1688,44 @@ static VALUE rjb_s_load(int argc, VALUE* argv, VALUE self)
1673
1688
  main_jenv = jenv;
1674
1689
  }
1675
1690
 
1676
- jconstructor = (*jenv)->FindClass(jenv, "java/lang/reflect/Constructor");
1677
- rjb_check_exception(jenv, 1);
1678
- ctrGetParameterTypes = (*jenv)->GetMethodID(jenv, jconstructor, "getParameterTypes", "()[Ljava/lang/Class;");
1679
- rjb_check_exception(jenv, 1);
1680
- jmethod = (*jenv)->FindClass(jenv, "java/lang/reflect/Method");
1681
- method_getModifiers = (*jenv)->GetMethodID(jenv, jmethod, "getModifiers", "()I");
1682
- rjb_check_exception(jenv, 1);
1683
- method_getName = (*jenv)->GetMethodID(jenv, jmethod, "getName", "()Ljava/lang/String;");
1684
- rjb_check_exception(jenv, 1);
1685
- getParameterTypes = (*jenv)->GetMethodID(jenv, jmethod, "getParameterTypes", "()[Ljava/lang/Class;");
1686
- rjb_check_exception(jenv, 1);
1687
- getReturnType = (*jenv)->GetMethodID(jenv, jmethod, "getReturnType", "()Ljava/lang/Class;");
1688
- rjb_check_exception(jenv, 1);
1691
+ RJB_FIND_CLASS(jconstructor, "java/lang/reflect/Constructor");
1692
+ RJB_LOAD_METHOD(ctrGetParameterTypes, jconstructor, "getParameterTypes", "()[Ljava/lang/Class;");
1693
+ RJB_FIND_CLASS(jmethod, "java/lang/reflect/Method");
1694
+ RJB_LOAD_METHOD(method_getModifiers, jmethod, "getModifiers", "()I");
1695
+ RJB_LOAD_METHOD(method_getName, jmethod, "getName", "()Ljava/lang/String;");
1696
+ RJB_LOAD_METHOD(getParameterTypes, jmethod, "getParameterTypes", "()[Ljava/lang/Class;");
1697
+ RJB_LOAD_METHOD(getReturnType, jmethod, "getReturnType", "()Ljava/lang/Class;");
1689
1698
 
1690
- jfield = (*jenv)->FindClass(jenv, "java/lang/reflect/Field");
1691
- field_getModifiers = (*jenv)->GetMethodID(jenv, jfield, "getModifiers", "()I");
1692
- rjb_check_exception(jenv, 1);
1693
- field_getName = (*jenv)->GetMethodID(jenv, jfield, "getName", "()Ljava/lang/String;");
1694
- rjb_check_exception(jenv, 1);
1695
- field_getType = (*jenv)->GetMethodID(jenv, jfield, "getType", "()Ljava/lang/Class;");
1696
- rjb_check_exception(jenv, 1);
1699
+ RJB_FIND_CLASS(jfield, "java/lang/reflect/Field");
1700
+ RJB_LOAD_METHOD(field_getModifiers, jfield, "getModifiers", "()I");
1701
+ RJB_LOAD_METHOD(field_getName, jfield, "getName", "()Ljava/lang/String;");
1702
+ RJB_LOAD_METHOD(field_getType, jfield, "getType", "()Ljava/lang/Class;");
1697
1703
 
1698
- j_class = (*jenv)->FindClass(jenv, "java/lang/Class");
1699
- rjb_check_exception(jenv, 1);
1700
- rjb_class_getName = (*jenv)->GetMethodID(jenv, j_class, "getName", "()Ljava/lang/String;");
1701
- rjb_check_exception(jenv, 1);
1702
- j_class = (*jenv)->NewGlobalRef(jenv, j_class);
1704
+ RJB_HOLD_CLASS(j_class, "java/lang/Class");
1705
+ RJB_LOAD_METHOD(rjb_class_getName, j_class, "getName", "()Ljava/lang/String;");
1703
1706
 
1704
- rjb_j_throwable = (*jenv)->FindClass(jenv, "java/lang/Throwable");
1705
- rjb_check_exception(jenv, 1);
1706
- rjb_throwable_getMessage = (*jenv)->GetMethodID(jenv, rjb_j_throwable, "getMessage", "()Ljava/lang/String;");
1707
- rjb_check_exception(jenv, 1);
1707
+ RJB_HOLD_CLASS(rjb_j_throwable, "java/lang/Throwable");
1708
+ RJB_LOAD_METHOD(rjb_throwable_getMessage, rjb_j_throwable, "getMessage", "()Ljava/lang/String;");
1708
1709
 
1709
- j_string = (*jenv)->FindClass(jenv, "java/lang/String");
1710
- rjb_check_exception(jenv, 1);
1711
- str_tostring = (*jenv)->GetMethodID(jenv, j_string, "toString", "()Ljava/lang/String;");
1712
- rjb_check_exception(jenv, 1);
1713
- j_string = (*jenv)->NewGlobalRef(jenv, j_string);
1710
+ RJB_HOLD_CLASS(j_string, "java/lang/String");
1711
+ RJB_LOAD_METHOD(str_tostring, j_string, "toString", "()Ljava/lang/String;");
1714
1712
 
1715
- j_object = (*jenv)->FindClass(jenv, "java/lang/Object");
1716
- rjb_check_exception(jenv, 1);
1717
- j_object = (*jenv)->NewGlobalRef(jenv, j_object);
1713
+ RJB_HOLD_CLASS(j_object, "java/lang/Object");
1718
1714
 
1719
1715
  for (i = PRM_INT; i < PRM_LAST; i++)
1720
1716
  {
1721
1717
  jclass klass = (*jenv)->FindClass(jenv, jpcvt[i].classname);
1722
1718
  if (i == PRM_BOOLEAN)
1723
1719
  {
1724
- jpcvt[i].ctr_id = (*jenv)->GetStaticMethodID(jenv,
1725
- klass, "valueOf", jpcvt[i].ctrsig);
1726
- rjb_check_exception(jenv, 1);
1720
+ RJB_LOAD_STATIC_METHOD(jpcvt[i].ctr_id, klass, "valueOf", jpcvt[i].ctrsig);
1727
1721
  }
1728
1722
  else if (jpcvt[i].ctrsig)
1729
1723
  {
1730
- jpcvt[i].ctr_id = (*jenv)->GetMethodID(jenv, klass,
1731
- "<init>", jpcvt[i].ctrsig);
1732
- rjb_check_exception(jenv, 1);
1724
+ RJB_LOAD_METHOD(jpcvt[i].ctr_id, klass, "<init>", jpcvt[i].ctrsig);
1733
1725
  }
1734
- jpcvt[i].to_prim_id = (*jenv)->GetMethodID(jenv, klass,
1726
+ RJB_LOAD_METHOD(jpcvt[i].to_prim_id, klass,
1735
1727
  jpcvt[i].to_prim_method, jpcvt[i].prmsig);
1736
- rjb_check_exception(jenv, 1);
1728
+
1737
1729
  jpcvt[i].klass = (*jenv)->NewGlobalRef(jenv, klass);
1738
1730
  }
1739
1731
 
@@ -1749,6 +1741,9 @@ static VALUE rjb_s_load(int argc, VALUE* argv, VALUE self)
1749
1741
  */
1750
1742
  VALUE rjb_load_vm_default()
1751
1743
  {
1744
+ if (rjb_jvm) return Qfalse;
1745
+
1746
+ rb_warning("Rjb::implicit jvm loading");
1752
1747
  return rjb_s_load(0, NULL, 0);
1753
1748
  }
1754
1749
 
@@ -1766,15 +1761,16 @@ static int clear_classes(VALUE key, VALUE val, VALUE dummy)
1766
1761
  }
1767
1762
  static VALUE rjb_s_unload(int argc, VALUE* argv, VALUE self)
1768
1763
  {
1764
+ int result = 0;
1769
1765
  st_foreach(RHASH_TBL(rjb_loaded_classes), clear_classes, 0);
1770
1766
  if (rjb_jvm)
1771
1767
  {
1772
1768
  JNIEnv* jenv = rjb_attach_current_thread();
1773
- (*jenv)->ExceptionClear(jenv);
1774
- (*rjb_jvm)->DestroyJavaVM(rjb_jvm);
1775
- rjb_jvm = NULL;
1769
+ (*jenv)->ExceptionClear(jenv);
1770
+ result = (*rjb_jvm)->DestroyJavaVM(rjb_jvm);
1771
+ rjb_jvm = NULL;
1776
1772
  }
1777
- return Qnil;
1773
+ return INT2NUM(result);
1778
1774
  }
1779
1775
 
1780
1776
  /*
@@ -1808,6 +1804,7 @@ static VALUE rjb_s_get_pconversion(VALUE self)
1808
1804
  /*
1809
1805
  * free java class
1810
1806
  */
1807
+ #if 0
1811
1808
  static void free_constructor(struct cls_constructor* p)
1812
1809
  {
1813
1810
  free(p->arg_convert);
@@ -1821,6 +1818,7 @@ static int free_method_item(ID key, struct cls_method* pm, int dummy)
1821
1818
  }
1822
1819
  return ST_CONTINUE;
1823
1820
  }
1821
+ #endif
1824
1822
 
1825
1823
  /*
1826
1824
  * finalize Object instance
@@ -1996,7 +1994,7 @@ static int check_rtype(JNIEnv* jenv, VALUE v, char* p)
1996
1994
  case T_DATA:
1997
1995
  if (RBASIC(v)->klass == rjbi && pcls)
1998
1996
  {
1999
- // imported object
1997
+ /* imported object */
2000
1998
  jclass cls;
2001
1999
  struct jvi_data* ptr;
2002
2000
  int result = 0;
@@ -2010,9 +2008,9 @@ static int check_rtype(JNIEnv* jenv, VALUE v, char* p)
2010
2008
  }
2011
2009
  return result;
2012
2010
  }
2013
- // fall down to the next case
2011
+ /* fall down to the next case */
2014
2012
  case T_OBJECT:
2015
- // fall down to the next case
2013
+ /* fall down to the next case */
2016
2014
  default:
2017
2015
  if (pcls || *p == '[')
2018
2016
  {
@@ -2129,11 +2127,12 @@ static VALUE rjb_s_bind(VALUE self, VALUE rbobj, VALUE itfname)
2129
2127
  {
2130
2128
  VALUE result = Qnil;
2131
2129
  JNIEnv* jenv = NULL;
2132
-
2130
+ jclass itf;
2131
+
2133
2132
  rjb_load_vm_default();
2134
2133
  jenv = rjb_attach_current_thread();
2135
2134
  (*jenv)->ExceptionClear(jenv);
2136
- jclass itf = rjb_find_class(jenv, itfname);
2135
+ itf = rjb_find_class(jenv, itfname);
2137
2136
  rjb_check_exception(jenv, 1);
2138
2137
  if (itf)
2139
2138
  {
@@ -2468,7 +2467,7 @@ static VALUE invoke(JNIEnv* jenv, struct cls_method* pm, struct jvi_data* ptr,
2468
2467
  }
2469
2468
  if (!found)
2470
2469
  {
2471
- char* tname = rb_id2name(orgpm->name);
2470
+ const char* tname = rb_id2name(orgpm->name);
2472
2471
  if (sig)
2473
2472
  {
2474
2473
  rb_raise(rb_eRuntimeError, "Fail: unknown method name `%s(\'%s\')'", tname, sig);
@@ -2557,7 +2556,7 @@ static VALUE invoke_by_instance(ID rmid, int argc, VALUE* argv,
2557
2556
  JNIEnv* jenv = rjb_attach_current_thread();
2558
2557
  struct cls_field* pf;
2559
2558
  struct cls_method* pm;
2560
- char* tname = rb_id2name(rmid);
2559
+ const char* tname = rb_id2name(rmid);
2561
2560
 
2562
2561
  if (argc == 0 && st_lookup(ptr->fields, rmid, (st_data_t*)&pf))
2563
2562
  {
@@ -2575,7 +2574,7 @@ static VALUE invoke_by_instance(ID rmid, int argc, VALUE* argv,
2575
2574
  setter(jenv, pf, ptr, *argv);
2576
2575
  return ret;
2577
2576
  }
2578
- // fall through for the setter alias name
2577
+ /* fall through for the setter alias name */
2579
2578
  }
2580
2579
  if (st_lookup(ptr->methods, rmid, (st_data_t*)&pm))
2581
2580
  {
@@ -2623,7 +2622,7 @@ static VALUE invoke_by_class(ID rmid, int argc, VALUE* argv,
2623
2622
  struct jv_data* clsptr;
2624
2623
  struct cls_field* pf;
2625
2624
  struct cls_method* pm;
2626
- char* tname = rb_id2name(rmid);
2625
+ const char* tname = rb_id2name(rmid);
2627
2626
  JNIEnv* jenv = rjb_attach_current_thread();
2628
2627
 
2629
2628
  Data_Get_Struct(jklass, struct jv_data, clsptr);
@@ -2700,7 +2699,7 @@ static VALUE rjb_missing(int argc, VALUE* argv, VALUE self)
2700
2699
  {
2701
2700
  struct jv_data* ptr;
2702
2701
  ID rmid = rb_to_id(argv[0]);
2703
- char* rmname = rb_id2name(rmid);
2702
+ const char* rmname = rb_id2name(rmid);
2704
2703
  if (isupper(*rmname))
2705
2704
  {
2706
2705
  VALUE r, args[2];
@@ -2832,7 +2831,7 @@ JNIEXPORT jobject JNICALL Java_jp_co_infoseek_hp_arton_rjb_RBridge_call
2832
2831
  *(argv + 2) = argc - 3;
2833
2832
  result = rb_protect(safe_funcall, (VALUE)argv, &sstat);
2834
2833
  rv2jobject(jenv, result, &j, NULL, 0);
2835
- // I can't delete this object...
2834
+ /* I can't delete this object... */
2836
2835
  break;
2837
2836
  }
2838
2837
  }
@@ -12,7 +12,7 @@
12
12
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
13
  * Lesser General Public License for more details.
14
14
  *
15
- * $Id: rjbexception.c 64 2008-03-05 14:24:22Z kuwa1 $
15
+ * $Id: rjbexception.c 75 2008-08-14 10:03:52Z arton $
16
16
  */
17
17
 
18
18
  #include "ruby.h"
@@ -109,7 +109,6 @@ void rjb_check_exception(JNIEnv* jenv, int t)
109
109
  (*jenv)->ExceptionDescribe(jenv);
110
110
  }
111
111
  (*jenv)->ExceptionClear(jenv);
112
- // if (t)
113
112
  if(1)
114
113
  {
115
114
  char* msg = "unknown exception";
@@ -1,5 +1,5 @@
1
1
  #!/usr/local/env ruby
2
- # $Id: test.rb 63 2008-03-04 15:34:24Z kuwa1 $
2
+ # $Id: test.rb 70 2008-05-26 12:31:35Z arton $
3
3
 
4
4
  begin
5
5
  require 'rjb'
@@ -27,8 +27,7 @@ class TestRjb < Test::Unit::TestCase
27
27
  @jChar = Rjb::import('java.lang.Character')
28
28
  end
29
29
 
30
- def tearDown
31
- unload
30
+ def teardown
32
31
  end
33
32
 
34
33
  def test_metaclass
@@ -616,5 +615,16 @@ class TestRjb < Test::Unit::TestCase
616
615
  assert_equal "\0\x1\x2\x3\x4", map.get('abc')
617
616
  assert_equal "\x5\x6\x7\x8\x9", map.get('def')
618
617
  end
618
+
619
+ def x_test_zzunload
620
+ # this test should run at the last
621
+ unload
622
+ begin
623
+ load('.')
624
+ fail 'no exception'
625
+ rescue
626
+ assert_equal "can't create Java VM", $!.message
627
+ end
628
+ end
619
629
  end
620
630
 
metadata CHANGED
@@ -1,78 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
2
4
  name: rjb
3
5
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
6
+ version: 1.1.4
7
+ date: 2008-08-14 00:00:00 +09:00
8
+ summary: Ruby Java bridge
9
+ require_paths:
10
+ - lib
11
+ email: artonx@gmail.com
12
+ homepage: http://rjb.rubyforge.org/
13
+ rubyforge_project:
14
+ description: RJB is a bridge program that connect between Ruby and Java with Java Native Interface.
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.2
24
+ version:
5
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
6
29
  authors:
7
30
  - arton
8
- autorequire:
9
- bindir: bin
10
- cert_chain: []
11
-
12
- date: 2008-03-26 00:00:00 +09:00
13
- default_executable:
14
- dependencies: []
15
-
16
- description: RJB is a bridge program that connect between Ruby and Java with Java Native Interface.
17
- email: artonx@gmail.com
18
- executables: []
19
-
20
- extensions:
21
- - ext/extconf.rb
22
- extra_rdoc_files: []
23
-
24
31
  files:
25
32
  - ext/RBridge.java
26
33
  - ext/load.c
27
34
  - ext/riconv.c
28
- - ext/rjb.c
29
35
  - ext/rjbexception.c
30
- - ext/extconf.h
36
+ - ext/rjb.c
31
37
  - ext/jniwrap.h
32
- - ext/jp_co_infoseek_hp_arton_rjb_RBridge.h
33
- - ext/riconv.h
34
38
  - ext/rjb.h
39
+ - ext/riconv.h
40
+ - ext/jp_co_infoseek_hp_arton_rjb_RBridge.h
41
+ - ext/extconf.h
35
42
  - ext/depend
36
43
  - data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class
37
44
  - lib/rjb.rb
38
45
  - samples/filechooser.rb
39
- - test/gctest.rb
40
46
  - test/test.rb
41
- - test/jp/co/infoseek/hp/arton/rjb/Base.class
47
+ - test/gctest.rb
42
48
  - test/jp/co/infoseek/hp/arton/rjb/ExtBase.class
49
+ - test/jp/co/infoseek/hp/arton/rjb/Test.class
43
50
  - test/jp/co/infoseek/hp/arton/rjb/IBase.class
44
51
  - test/jp/co/infoseek/hp/arton/rjb/Test$TestTypes.class
45
- - test/jp/co/infoseek/hp/arton/rjb/Test.class
52
+ - test/jp/co/infoseek/hp/arton/rjb/Base.class
46
53
  - COPYING
47
54
  - ChangeLog
48
55
  - readme.sj
49
56
  - readme.txt
50
- has_rdoc: false
51
- homepage: http://rjb.rubyforge.org/
52
- post_install_message:
57
+ test_files:
58
+ - test/test.rb
53
59
  rdoc_options: []
54
60
 
55
- require_paths:
56
- - lib
57
- required_ruby_version: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: 1.8.2
62
- version:
63
- required_rubygems_version: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: "0"
68
- version:
61
+ extra_rdoc_files: []
62
+
63
+ executables: []
64
+
65
+ extensions:
66
+ - ext/extconf.rb
69
67
  requirements:
70
68
  - none
71
69
  - JDK 5.0
72
- rubyforge_project:
73
- rubygems_version: 1.0.1
74
- signing_key:
75
- specification_version: 2
76
- summary: Ruby Java bridge
77
- test_files:
78
- - test/test.rb
70
+ dependencies: []
71
+