rjb 1.2.0-x86-mswin32-60 → 1.2.1-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,21 @@
1
+ Tue May 11 arton
2
+ *ext/rjb.c
3
+ fix duplicate method registering while no alias.
4
+ add class methods for inspecting method signatures.
5
+ add class_eval method for extending Java class
6
+ *test/test.rb
7
+ add class methods test for inspecting method signatures.
8
+ add mixin tests
9
+ Tue May 4 arton
10
+ *ext/load.c
11
+ corrected wrong function signature (BUG#28088), pointed and fixed by Romulo A. Ceccon (thanks)
12
+ *ext/rjb.c
13
+ using inheritance check while inspecting a object is RJB's instance (for extending it).
14
+ Tue Mar 16 arton
15
+ *ext/riconv.c
16
+ change locale setting "" to "C", fixed by Fabien Sartor (rjb-Bugs-27968)
17
+ *ext/rjb.c
18
+ RJB_VERSION -> 1.2.1
1
19
  Sun Nov 1 arton
2
20
  *ext/load.c
3
21
  load jvm pointed by JVM_LIB environment variable first (suggested by Ittay Dror).
@@ -1,21 +1,21 @@
1
- /* DO NOT EDIT THIS FILE - it is machine generated */
2
- #include <jni.h>
3
- /* Header for class jp_co_infoseek_hp_arton_rjb_RBridge */
4
-
5
- #ifndef _Included_jp_co_infoseek_hp_arton_rjb_RBridge
6
- #define _Included_jp_co_infoseek_hp_arton_rjb_RBridge
7
- #ifdef __cplusplus
8
- extern "C" {
9
- #endif
10
- /*
11
- * Class: jp_co_infoseek_hp_arton_rjb_RBridge
12
- * Method: call
13
- * Signature: (Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
14
- */
15
- JNIEXPORT jobject JNICALL Java_jp_co_infoseek_hp_arton_rjb_RBridge_call
16
- (JNIEnv *, jobject, jstring, jobject, jobjectArray);
17
-
18
- #ifdef __cplusplus
19
- }
20
- #endif
21
- #endif
1
+ /* DO NOT EDIT THIS FILE - it is machine generated */
2
+ #include <jni.h>
3
+ /* Header for class jp_co_infoseek_hp_arton_rjb_RBridge */
4
+
5
+ #ifndef _Included_jp_co_infoseek_hp_arton_rjb_RBridge
6
+ #define _Included_jp_co_infoseek_hp_arton_rjb_RBridge
7
+ #ifdef __cplusplus
8
+ extern "C" {
9
+ #endif
10
+ /*
11
+ * Class: jp_co_infoseek_hp_arton_rjb_RBridge
12
+ * Method: call
13
+ * Signature: (Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
14
+ */
15
+ JNIEXPORT jobject JNICALL Java_jp_co_infoseek_hp_arton_rjb_RBridge_call
16
+ (JNIEnv *, jobject, jstring, jobject, jobjectArray);
17
+
18
+ #ifdef __cplusplus
19
+ }
20
+ #endif
21
+ #endif
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 102 2009-11-01 14:01:41Z arton $
15
+ * $Id: load.c 105 2010-05-04 00:01:26Z arton $
16
16
  */
17
17
 
18
18
  #include <stdlib.h>
@@ -90,8 +90,8 @@
90
90
  #define GETDEFAULTJVMINITARGS "JNI_GetDefaultJavaVMInitArgs"
91
91
  #endif
92
92
 
93
- typedef int (*GETDEFAULTJAVAVMINITARGS)(void*);
94
- typedef int (*CREATEJAVAVM)(JavaVM**, JNIEnv**, void*);
93
+ typedef int (JNICALL *GETDEFAULTJAVAVMINITARGS)(void*);
94
+ typedef int (JNICALL *CREATEJAVAVM)(JavaVM**, JNIEnv**, void*);
95
95
 
96
96
 
97
97
  static VALUE jvmdll = Qnil;
data/ext/riconv.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: riconv.c 65 2008-03-26 13:19:29Z arton $
15
+ * $Id: riconv.c 104 2010-03-16 12:19:18Z arton $
16
16
  */
17
17
 
18
18
  #include "ruby.h"
@@ -98,14 +98,14 @@ static const char* get_charcode_name()
98
98
  #if defined _WIN32 || defined __CYGWIN__
99
99
  if (932 == GetACP()) result = CS_CP932;
100
100
  #elif defined HAVE_NL_LANGINFO
101
- setlocale(LC_ALL, ""); //initialize
101
+ setlocale(LC_ALL, "C"); //initialize
102
102
  lang = nl_langinfo(CODESET);
103
103
  if (find_table(lang, NL_EUC_TABLE))
104
104
  result = CS_EUCJP;
105
105
  else if (find_table(lang, NL_SJIS_TABLE))
106
106
  result = CS_SJIS;
107
107
  #elif defined HAVE_SETLOCALE
108
- setlocale(LC_ALL, ""); //initialize
108
+ setlocale(LC_ALL, "C"); //initialize
109
109
  result = get_charcode_name_by_locale(setlocale(LC_ALL, NULL));
110
110
  #elif defined HAVE_GETENV
111
111
  if (result = get_charcode_name_by_locale(getenv("LC_ALL")))
data/ext/rjb.c CHANGED
@@ -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 102 2009-11-01 14:01:41Z arton $
15
+ * $Id: rjb.c 109 2010-05-11 13:04:25Z arton $
16
16
  */
17
17
 
18
- #define RJB_VERSION "1.2.0"
18
+ #define RJB_VERSION "1.2.1"
19
19
 
20
20
  #include "ruby.h"
21
21
  #include "extconf.h"
@@ -55,10 +55,12 @@
55
55
  #define RJB_LOAD_STATIC_METHOD(var, obj, name, sig) \
56
56
  var = (*jenv)->GetStaticMethodID(jenv, obj, name, sig); \
57
57
  rjb_check_exception(jenv, 1)
58
+ #define IS_RJB_OBJECT(v) (rb_class_inherited(rjbi, RBASIC(v)->klass) || RBASIC(v)->klass == rjb)
59
+ #define USER_INITIALIZE "@user_initialize"
58
60
 
59
61
  static void register_class(VALUE, VALUE);
60
62
  static VALUE import_class(JNIEnv* jenv, jclass, VALUE);
61
- static VALUE register_instance(JNIEnv* jenv, struct jvi_data*, jobject);
63
+ static VALUE register_instance(JNIEnv* jenv, VALUE klass, struct jv_data*, jobject);
62
64
  static VALUE rjb_s_free(struct jv_data*);
63
65
  static VALUE rjb_class_forname(int argc, VALUE* argv, VALUE self);
64
66
  static void setup_metadata(JNIEnv* jenv, VALUE self, struct jv_data*, VALUE classname);
@@ -73,6 +75,8 @@ static VALUE rjbc;
73
75
  static VALUE rjbi;
74
76
  static VALUE rjbb;
75
77
 
78
+ static ID user_initialize;
79
+
76
80
  VALUE rjb_loaded_classes;
77
81
  static VALUE proxies;
78
82
  JavaVM* rjb_jvm;
@@ -286,7 +290,7 @@ static VALUE jv2rv_r(JNIEnv* jenv, jvalue val)
286
290
  v = import_class(jenv, klass, clsname);
287
291
  }
288
292
  Data_Get_Struct(v, struct jv_data, ptr);
289
- v = register_instance(jenv, (struct jvi_data*)ptr, val.l);
293
+ v = register_instance(jenv, v, (struct jv_data*)ptr, val.l);
290
294
  (*jenv)->DeleteLocalRef(jenv, klass);
291
295
  (*jenv)->DeleteLocalRef(jenv, val.l);
292
296
  return v;
@@ -673,8 +677,7 @@ static void rv2jstring(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
673
677
  {
674
678
  if (!release)
675
679
  {
676
- if (TYPE(val) == T_DATA
677
- && (RBASIC(val)->klass == rjbi || RBASIC(val)->klass == rjb))
680
+ if (TYPE(val) == T_DATA && IS_RJB_OBJECT(val))
678
681
  {
679
682
  struct jvi_data* ptr;
680
683
  Data_Get_Struct(val, struct jvi_data, ptr);
@@ -710,7 +713,7 @@ static void rv2jstring(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
710
713
  {
711
714
  if (TYPE(val) == T_DATA)
712
715
  {
713
- if (RBASIC(val)->klass == rjbi || RBASIC(val)->klass == rjb)
716
+ if (IS_RJB_OBJECT(val))
714
717
  {
715
718
  struct jvi_data* ptr;
716
719
  Data_Get_Struct(val, struct jvi_data, ptr);
@@ -764,9 +767,9 @@ static void rv2jobject(JNIEnv* jenv, VALUE val, jvalue* jv, const char* psig, in
764
767
  switch (TYPE(val))
765
768
  {
766
769
  case T_DATA:
767
- if (RBASIC(val)->klass == rjbi || RBASIC(val)->klass == rjb)
770
+ if (IS_RJB_OBJECT(val))
768
771
  {
769
- /* TODO: check instanceof (class (in psig) ) */
772
+ /* TODO: check instanceof (class (in psig) ) */
770
773
  struct jvi_data* ptr;
771
774
  Data_Get_Struct(val, struct jvi_data, ptr);
772
775
  jv->l = ptr->obj;
@@ -1327,14 +1330,16 @@ static struct cls_method* clone_methodinfo(struct cls_method* pm)
1327
1330
  return result;
1328
1331
  }
1329
1332
 
1330
- static void make_alias(const char* jname, char* rname)
1333
+ static int make_alias(const char* jname, char* rname)
1331
1334
  {
1335
+ int ret = 0;
1332
1336
  while (*jname)
1333
1337
  {
1334
1338
  if (isupper(*jname))
1335
1339
  {
1336
1340
  *rname++ = '_';
1337
1341
  *rname++ = tolower(*jname++);
1342
+ ret = 1;
1338
1343
  }
1339
1344
  else
1340
1345
  {
@@ -1342,6 +1347,7 @@ static void make_alias(const char* jname, char* rname)
1342
1347
  }
1343
1348
  }
1344
1349
  *rname = '\0';
1350
+ return ret;
1345
1351
  }
1346
1352
 
1347
1353
  static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static_method)
@@ -1349,6 +1355,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
1349
1355
  struct cls_method* result;
1350
1356
  struct cls_method* pm;
1351
1357
  const char* jname;
1358
+ int alias;
1352
1359
  jstring nm;
1353
1360
  jobjectArray parama;
1354
1361
  jobject cls;
@@ -1365,7 +1372,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
1365
1372
  rjb_check_exception(jenv, 0);
1366
1373
  jname = (*jenv)->GetStringUTFChars(jenv, nm, NULL);
1367
1374
  rname = ALLOCA_N(char, strlen(jname) * 2 + 8);
1368
- make_alias(jname, rname);
1375
+ alias = make_alias(jname, rname);
1369
1376
  result->name = rb_intern(jname);
1370
1377
  rjb_release_string(jenv, nm, jname);
1371
1378
  result->basic.id = (*jenv)->FromReflectedMethod(jenv, m);
@@ -1404,7 +1411,7 @@ static void create_methodinfo(JNIEnv* jenv, st_table* tbl, jobject m, int static
1404
1411
  if (*rname == '_') rname++;
1405
1412
  strcat(rname, "?");
1406
1413
  }
1407
- else
1414
+ else if (alias)
1408
1415
  {
1409
1416
  pm = clone_methodinfo(result);
1410
1417
  }
@@ -1729,6 +1736,7 @@ static VALUE rjb_s_load(int argc, VALUE* argv, VALUE self)
1729
1736
 
1730
1737
  jklass = import_class(jenv, j_class, rb_str_new2("java.lang.Class"));
1731
1738
  rb_define_method(RBASIC(jklass)->klass, "forName", rjb_class_forname, -1);
1739
+ rb_define_method(RBASIC(jklass)->klass, "for_name", rjb_class_forname, -1);
1732
1740
  rb_gc_register_address(&jklass);
1733
1741
 
1734
1742
  return Qnil;
@@ -1745,6 +1753,18 @@ VALUE rjb_load_vm_default()
1745
1753
  return rjb_s_load(0, NULL, 0);
1746
1754
  }
1747
1755
 
1756
+ /*
1757
+ * common prelude
1758
+ */
1759
+ JNIEnv* rjb_prelude()
1760
+ {
1761
+ JNIEnv* jenv = NULL;
1762
+ rjb_load_vm_default();
1763
+ jenv = rjb_attach_current_thread();
1764
+ (*jenv)->ExceptionClear(jenv);
1765
+ return jenv;
1766
+ }
1767
+
1748
1768
  /*
1749
1769
  * unload Java Virtual Machine
1750
1770
  *
@@ -1883,14 +1903,19 @@ static VALUE rjb_s_free(struct jv_data* ptr)
1883
1903
  * create new instance of this class
1884
1904
  */
1885
1905
  static VALUE createinstance(JNIEnv* jenv, int argc, VALUE* argv,
1886
- struct jvi_data* org, struct cls_constructor* pc)
1906
+ VALUE self, struct cls_constructor* pc)
1887
1907
  {
1888
1908
  int i;
1889
1909
  char* psig = pc->method_signature;
1890
1910
  jobject obj = NULL;
1891
1911
  VALUE result;
1892
-
1912
+ struct jv_data* jklass;
1913
+ struct jvi_data* org;
1893
1914
  jvalue* args = (argc) ? ALLOCA_N(jvalue, argc) : NULL;
1915
+
1916
+ Data_Get_Struct(self, struct jv_data, jklass);
1917
+ org = &jklass->idata;
1918
+
1894
1919
  for (i = 0; i < argc; i++)
1895
1920
  {
1896
1921
  R2J pr2j = *(pc->arg_convert + i);
@@ -1911,7 +1936,7 @@ static VALUE createinstance(JNIEnv* jenv, int argc, VALUE* argv,
1911
1936
  psig = next_sig(psig);
1912
1937
  }
1913
1938
 
1914
- result = register_instance(jenv, org, obj);
1939
+ result = register_instance(jenv, self, jklass, obj);
1915
1940
  (*jenv)->DeleteLocalRef(jenv, obj);
1916
1941
  return result;
1917
1942
  }
@@ -1941,16 +1966,29 @@ static VALUE import_class(JNIEnv* jenv, jclass jcls, VALUE clsname)
1941
1966
  return v;
1942
1967
  }
1943
1968
 
1944
- static VALUE register_instance(JNIEnv* jenv, struct jvi_data* org, jobject obj)
1969
+ static VALUE rjb_i_prepare_proxy(VALUE self)
1970
+ {
1971
+ return rb_funcall(self, rb_intern("instance_eval"), 1,
1972
+ rb_str_new2("instance_eval &" USER_INITIALIZE));
1973
+ }
1974
+
1975
+ static VALUE register_instance(JNIEnv* jenv, VALUE klass, struct jv_data* org, jobject obj)
1945
1976
  {
1946
1977
  VALUE v;
1978
+ VALUE iproc;
1947
1979
  struct jvi_data* ptr = ALLOC(struct jvi_data);
1948
1980
  memset(ptr, 0, sizeof(struct jvi_data));
1949
1981
  v = Data_Wrap_Struct(rjbi, NULL, rjb_delete_ref, ptr);
1950
- ptr->klass = org->obj;
1982
+ ptr->klass = org->idata.obj;
1951
1983
  ptr->obj = (*jenv)->NewGlobalRef(jenv, obj);
1952
- ptr->methods = org->methods;
1953
- ptr->fields = org->fields;
1984
+ ptr->methods = org->idata.methods;
1985
+ ptr->fields = org->idata.fields;
1986
+ iproc = rb_ivar_get(klass, user_initialize);
1987
+ if (iproc != Qnil)
1988
+ {
1989
+ rb_ivar_set(v, user_initialize, iproc);
1990
+ rb_funcall(v, rb_intern("_prepare_proxy"), 0, 0);
1991
+ }
1954
1992
  return v;
1955
1993
  }
1956
1994
 
@@ -1990,7 +2028,7 @@ static int check_rtype(JNIEnv* jenv, VALUE v, char* p)
1990
2028
  case T_ARRAY:
1991
2029
  return *p == '[';
1992
2030
  case T_DATA:
1993
- if (RBASIC(v)->klass == rjbi && pcls)
2031
+ if (IS_RJB_OBJECT(v) && pcls)
1994
2032
  {
1995
2033
  /* imported object */
1996
2034
  jclass cls;
@@ -2028,11 +2066,7 @@ static VALUE rjb_newinstance_s(int argc, VALUE* argv, VALUE self)
2028
2066
  VALUE ret = Qnil;
2029
2067
  struct jv_data* ptr;
2030
2068
  int found = 0;
2031
- JNIEnv* jenv = NULL;
2032
-
2033
- rjb_load_vm_default();
2034
- jenv = rjb_attach_current_thread();
2035
- (*jenv)->ExceptionClear(jenv);
2069
+ JNIEnv* jenv = rjb_prelude();
2036
2070
 
2037
2071
  rb_scan_args(argc, argv, "1*", &vsig, &rest);
2038
2072
  sig = StringValueCStr(vsig);
@@ -2046,7 +2080,7 @@ static VALUE rjb_newinstance_s(int argc, VALUE* argv, VALUE self)
2046
2080
  && !strcmp(sig, (*pc)->method_signature))
2047
2081
  {
2048
2082
  found = 1;
2049
- ret = createinstance(jenv, argc - 1, argv + 1, &ptr->idata, *pc);
2083
+ ret = createinstance(jenv, argc - 1, argv + 1, self, *pc);
2050
2084
  break;
2051
2085
  }
2052
2086
  }
@@ -2063,12 +2097,8 @@ static VALUE rjb_newinstance(int argc, VALUE* argv, VALUE self)
2063
2097
  struct jv_data* ptr;
2064
2098
  struct cls_constructor** pc;
2065
2099
  int found = 0;
2066
- JNIEnv* jenv = NULL;
2100
+ JNIEnv* jenv = rjb_prelude();
2067
2101
 
2068
- rjb_load_vm_default();
2069
- jenv = rjb_attach_current_thread();
2070
- (*jenv)->ExceptionClear(jenv);
2071
-
2072
2102
  Data_Get_Struct(self, struct jv_data, ptr);
2073
2103
 
2074
2104
  if (ptr->constructors)
@@ -2092,7 +2122,7 @@ static VALUE rjb_newinstance(int argc, VALUE* argv, VALUE self)
2092
2122
  }
2093
2123
  if (found)
2094
2124
  {
2095
- ret = createinstance(jenv, argc, argv, &ptr->idata, *pc);
2125
+ ret = createinstance(jenv, argc, argv, self, *pc);
2096
2126
  break;
2097
2127
  }
2098
2128
  }
@@ -2118,18 +2148,71 @@ jclass rjb_find_class(JNIEnv* jenv, VALUE name)
2118
2148
  return (*jenv)->FindClass(jenv, java2jniname(jnicls));
2119
2149
  }
2120
2150
 
2151
+ /*
2152
+ * get specified method signature
2153
+ */
2154
+ static VALUE get_signatures(VALUE mname, st_table* st)
2155
+ {
2156
+ VALUE ret;
2157
+ struct cls_method* pm;
2158
+ ID rmid = rb_to_id(mname);
2159
+
2160
+ if (!st_lookup(st, rmid, (st_data_t*)&pm))
2161
+ {
2162
+ const char* tname = rb_id2name(rmid);
2163
+ rb_raise(rb_eRuntimeError, "Fail: unknown method name `%s'", tname);
2164
+ }
2165
+ ret = rb_ary_new();
2166
+ for (; pm; pm = pm->next)
2167
+ {
2168
+ rb_ary_push(ret, rb_str_new2(pm->basic.method_signature));
2169
+ }
2170
+ return ret;
2171
+ }
2172
+
2173
+ static VALUE rjb_get_signatures(VALUE self, VALUE mname)
2174
+ {
2175
+ struct jv_data* ptr;
2176
+
2177
+ Data_Get_Struct(self, struct jv_data, ptr);
2178
+ return get_signatures(mname, ptr->idata.methods);
2179
+ }
2180
+
2181
+ static VALUE rjb_get_static_signatures(VALUE self, VALUE mname)
2182
+ {
2183
+ struct jv_data* ptr;
2184
+
2185
+ Data_Get_Struct(self, struct jv_data, ptr);
2186
+ return get_signatures(mname, ptr->static_methods);
2187
+ }
2188
+
2189
+ static VALUE rjb_get_ctor_signatures(VALUE self)
2190
+ {
2191
+ VALUE ret;
2192
+ struct jv_data* ptr;
2193
+ struct cls_constructor** pc;
2194
+
2195
+ Data_Get_Struct(self, struct jv_data, ptr);
2196
+ ret = rb_ary_new();
2197
+ if (ptr->constructors)
2198
+ {
2199
+ for (pc = ptr->constructors; *pc; pc++)
2200
+ {
2201
+ rb_ary_push(ret, rb_str_new2((*pc)->method_signature));
2202
+ }
2203
+ }
2204
+ return ret;
2205
+ }
2206
+
2121
2207
  /*
2122
2208
  * jclass Rjb::bind(rbobj, interface_name)
2123
2209
  */
2124
2210
  static VALUE rjb_s_bind(VALUE self, VALUE rbobj, VALUE itfname)
2125
2211
  {
2126
2212
  VALUE result = Qnil;
2127
- JNIEnv* jenv = NULL;
2128
2213
  jclass itf;
2214
+ JNIEnv* jenv = rjb_prelude();
2129
2215
 
2130
- rjb_load_vm_default();
2131
- jenv = rjb_attach_current_thread();
2132
- (*jenv)->ExceptionClear(jenv);
2133
2216
  itf = rjb_find_class(jenv, itfname);
2134
2217
  rjb_check_exception(jenv, 1);
2135
2218
  if (itf)
@@ -2154,15 +2237,24 @@ static VALUE rjb_s_bind(VALUE self, VALUE rbobj, VALUE itfname)
2154
2237
  return result;
2155
2238
  }
2156
2239
 
2240
+ /*
2241
+ * Rjb's class is not Class but Object, so add class_eval for the Java class.
2242
+ */
2243
+ static VALUE rjb_class_eval(int argc, VALUE* argv, VALUE self)
2244
+ {
2245
+ if (rb_block_given_p())
2246
+ {
2247
+ rb_ivar_set(self, user_initialize, rb_block_proc());
2248
+ }
2249
+ return self;
2250
+ }
2251
+
2157
2252
  /*
2158
2253
  * jclass Rjb::bind(rbobj, interface_name)
2159
2254
  */
2160
2255
  static VALUE rjb_s_unbind(VALUE self, VALUE rbobj)
2161
2256
  {
2162
- JNIEnv* jenv;
2163
- rjb_load_vm_default();
2164
- jenv = rjb_attach_current_thread();
2165
- (*jenv)->ExceptionClear(jenv);
2257
+ JNIEnv* jenv = rjb_prelude();
2166
2258
  return rb_ary_delete(proxies, rbobj);
2167
2259
  }
2168
2260
 
@@ -2179,9 +2271,7 @@ static VALUE rjb_s_import(VALUE self, VALUE clsname)
2179
2271
  return v;
2180
2272
  }
2181
2273
 
2182
- rjb_load_vm_default();
2183
- jenv = rjb_attach_current_thread();
2184
- (*jenv)->ExceptionClear(jenv);
2274
+ jenv = rjb_prelude();
2185
2275
  jcls = rjb_find_class(jenv, clsname);
2186
2276
  if (!jcls)
2187
2277
  {
@@ -2196,6 +2286,10 @@ static void register_class(VALUE self, VALUE clsname)
2196
2286
  {
2197
2287
  rb_define_singleton_method(self, "new", rjb_newinstance, -1);
2198
2288
  rb_define_singleton_method(self, "new_with_sig", rjb_newinstance_s, -1);
2289
+ rb_define_singleton_method(self, "class_eval", rjb_class_eval, -1);
2290
+ rb_define_singleton_method(self, "sigs", rjb_get_signatures, 1);
2291
+ rb_define_singleton_method(self, "static_sigs", rjb_get_static_signatures, 1);
2292
+ rb_define_singleton_method(self, "ctor_sigs", rjb_get_ctor_signatures, 0);
2199
2293
  /*
2200
2294
  * the hash was frozen, so it need to call st_ func directly.
2201
2295
  */
@@ -2745,6 +2839,7 @@ void Init_rjbcore()
2745
2839
  rb_global_variable(&rjb_loaded_classes);
2746
2840
  proxies = rb_ary_new();
2747
2841
  rb_global_variable(&proxies);
2842
+ user_initialize = rb_intern(USER_INITIALIZE);
2748
2843
 
2749
2844
  rjb = rb_define_module("Rjb");
2750
2845
  rb_define_module_function(rjb, "load", rjb_s_load, -1);
@@ -2763,7 +2858,7 @@ void Init_rjbcore()
2763
2858
  rb_gc_register_address(&rjbc);
2764
2859
  rb_define_method(rjbc, "method_missing", rjb_missing, -1);
2765
2860
  rb_define_method(rjbc, "_invoke", rjb_invoke, -1);
2766
- rb_define_method(rjbc, "_classname", rjb_i_class, 0);
2861
+ rb_define_method(rjbc, "_classname", rjb_i_class, 0);
2767
2862
 
2768
2863
  /* Java instance object */
2769
2864
  rjbi = rb_class_new(rb_cObject);
@@ -2771,6 +2866,8 @@ void Init_rjbcore()
2771
2866
  rb_define_method(rjbi, "method_missing", rjb_i_missing, -1);
2772
2867
  rb_define_method(rjbi, "_invoke", rjb_i_invoke, -1);
2773
2868
  rb_define_method(rjbi, "_classname", rjb_i_class, 0);
2869
+ rb_define_method(rjbi, "_prepare_proxy", rjb_i_prepare_proxy, 0);
2870
+ rb_define_alias(rjbi, "include", "extend");
2774
2871
 
2775
2872
  /* Ruby-Java Bridge object */
2776
2873
  rjbb = rb_class_new(rb_cObject);
data/lib/rjb.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  =begin
2
- Copyright(c) 2006 arton
2
+ Copyright(c) 2006-2010 arton
3
3
  =end
4
4
 
5
5
  require 'rbconfig'
@@ -20,3 +20,4 @@ end
20
20
 
21
21
  require 'rjbcore'
22
22
 
23
+
data/lib/rjbcore.so CHANGED
Binary file
data/test/Base.class ADDED
Binary file
Binary file
data/test/IBase.class ADDED
Binary file
data/test/JTest.class ADDED
Binary file
Binary file
data/test/Test.class ADDED
Binary file
data/test/test.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/local/env ruby -Ku
2
2
  # encoding: utf-8
3
- # $Id: test.rb 87 2009-02-15 12:25:36Z arton $
3
+ # $Id: test.rb 109 2010-05-11 13:04:25Z arton $
4
4
 
5
5
  begin
6
6
  require 'rjb'
@@ -18,14 +18,14 @@ class TestRjb < Test::Unit::TestCase
18
18
  Rjb::primitive_conversion = false
19
19
 
20
20
  @jString = import('java.lang.String')
21
- @jInteger = Rjb::import('java.lang.Integer')
22
- @jShort = Rjb::import('java.lang.Short')
23
- @jDouble = Rjb::import('java.lang.Double')
24
- @jFloat = Rjb::import('java.lang.Float')
25
- @jBoolean = Rjb::import('java.lang.Boolean')
26
- @jByte = Rjb::import('java.lang.Byte')
27
- @jLong = Rjb::import('java.lang.Long')
28
- @jChar = Rjb::import('java.lang.Character')
21
+ @jInteger = import('java.lang.Integer')
22
+ @jShort = import('java.lang.Short')
23
+ @jDouble = import('java.lang.Double')
24
+ @jFloat = import('java.lang.Float')
25
+ @jBoolean = import('java.lang.Boolean')
26
+ @jByte = import('java.lang.Byte')
27
+ @jLong = import('java.lang.Long')
28
+ @jChar = import('java.lang.Character')
29
29
  end
30
30
 
31
31
  def teardown
@@ -650,5 +650,48 @@ class TestRjb < Test::Unit::TestCase
650
650
  assert_equal "can't create Java VM", $!.message
651
651
  end
652
652
  end
653
+
654
+ module TestMixin
655
+ def test_hello(s)
656
+ 'hello ' + s
657
+ end
658
+ end
659
+ def test_extend
660
+ @jString.class_eval do
661
+ include TestMixin
662
+ end
663
+ s = @jString.new
664
+ assert_equal('hello world', s.test_hello('world'))
665
+ end
666
+ def test_extend_with_factory
667
+ point = import('java.awt.Point')
668
+ point.class_eval do
669
+ include TestMixin
670
+ end
671
+ p = point.new(11, 12)
672
+ assert_equal(11, p.x)
673
+ assert_equal(12, p.y)
674
+ assert_equal('hello world', p.test_hello('world'))
675
+ p = p.location
676
+ assert_equal(11, p.x)
677
+ assert_equal(12, p.y)
678
+ assert_equal('hello world', p.test_hello('world'))
679
+ end
680
+ def test_fetch_method_signature
681
+ expected = ['I', 'II', 'Ljava.lang.String;', 'Ljava.lang.String;I']
682
+ sig = @jString.sigs('indexOf').sort
683
+ assert_equal(expected, sig)
684
+ end
685
+ def test_fetch_static_method_signature
686
+ expected = ['Ljava.lang.String;[Ljava.lang.Object;',
687
+ 'Ljava.util.Locale;Ljava.lang.String;[Ljava.lang.Object;']
688
+ sig = @jString.static_sigs('format').sort
689
+ assert_equal(expected, sig)
690
+ end
691
+ def test_fetch_ctor_signature
692
+ expected = ['I', 'Ljava.lang.String;']
693
+ sig = @jInteger.ctor_sigs.sort
694
+ assert_equal(expected, sig)
695
+ end
653
696
  end
654
697
 
data/test/tx.rb ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/local/env ruby -Ku
2
+ # encoding: utf-8
3
+ # $Id: test.rb 87 2009-02-15 12:25:36Z arton $
4
+
5
+ begin
6
+ require 'rjb'
7
+ rescue LoadError
8
+ require 'rubygems'
9
+ require 'rjb'
10
+ end
11
+ require 'test/unit'
12
+
13
+ puts "start RJB(#{Rjb::VERSION}) test"
14
+ class TestRjb < Test::Unit::TestCase
15
+ include Rjb
16
+ def setup
17
+ Rjb::load('.')
18
+ @jString = import('java.lang.String')
19
+ @jInteger = Rjb::import('java.lang.Integer')
20
+ @jShort = Rjb::import('java.lang.Short')
21
+ @jDouble = Rjb::import('java.lang.Double')
22
+ @jFloat = Rjb::import('java.lang.Float')
23
+ @jBoolean = Rjb::import('java.lang.Boolean')
24
+ @jByte = Rjb::import('java.lang.Byte')
25
+ @jLong = Rjb::import('java.lang.Long')
26
+ @jChar = Rjb::import('java.lang.Character')
27
+ end
28
+
29
+ def teardown
30
+ end
31
+
32
+ def test_scalar
33
+ str = @jString.new_with_sig('Ljava.lang.String;', "abcde")
34
+ p str
35
+ p str.class
36
+ # rjb object (String)
37
+ str2 = @jString.new_with_sig('Ljava.lang.String;', 'fghijk')
38
+ p str2
39
+ p str2.class
40
+ a = str.concat(str2)
41
+ p a
42
+ p a.class
43
+ p str2
44
+ p str2.class
45
+ a = str.concat(str2)
46
+ p a
47
+ p a.class
48
+ assert_equal('abcdefghijk', str.concat(str2))
49
+ end
50
+
51
+ end
52
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rjb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: x86-mswin32-60
6
6
  authors:
7
7
  - arton
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-01 00:00:00 +09:00
12
+ date: 2010-05-11 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -26,25 +26,32 @@ extra_rdoc_files: []
26
26
  files:
27
27
  - ext/RBridge.java
28
28
  - ext/load.c
29
- - ext/rjbexception.c
30
29
  - ext/riconv.c
31
30
  - ext/rjb.c
32
- - ext/jp_co_infoseek_hp_arton_rjb_RBridge.h
33
- - ext/riconv.h
31
+ - ext/rjbexception.c
34
32
  - ext/extconf.h
35
33
  - ext/jniwrap.h
34
+ - ext/jp_co_infoseek_hp_arton_rjb_RBridge.h
35
+ - ext/riconv.h
36
36
  - ext/rjb.h
37
37
  - ext/depend
38
38
  - data/rjb/jp/co/infoseek/hp/arton/rjb/RBridge.class
39
39
  - lib/rjb.rb
40
40
  - samples/filechooser.rb
41
- - test/test.rb
42
41
  - test/gctest.rb
42
+ - test/test.rb
43
+ - test/tx.rb
44
+ - test/Base.class
45
+ - test/ExtBase.class
46
+ - test/IBase.class
43
47
  - test/jp/co/infoseek/hp/arton/rjb/Base.class
48
+ - test/jp/co/infoseek/hp/arton/rjb/ExtBase.class
44
49
  - test/jp/co/infoseek/hp/arton/rjb/IBase.class
45
- - test/jp/co/infoseek/hp/arton/rjb/Test.class
46
50
  - test/jp/co/infoseek/hp/arton/rjb/Test$TestTypes.class
47
- - test/jp/co/infoseek/hp/arton/rjb/ExtBase.class
51
+ - test/jp/co/infoseek/hp/arton/rjb/Test.class
52
+ - test/JTest.class
53
+ - test/Test$TestTypes.class
54
+ - test/Test.class
48
55
  - COPYING
49
56
  - ChangeLog
50
57
  - readme.sj
@@ -76,7 +83,7 @@ requirements:
76
83
  - JDK 5.0
77
84
  - " VC6 version of Ruby"
78
85
  rubyforge_project:
79
- rubygems_version: 1.3.4
86
+ rubygems_version: 1.3.5
80
87
  signing_key:
81
88
  specification_version: 3
82
89
  summary: Ruby Java bridge