rjb 1.7.0 → 1.7.3

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: eb30d6521841ff5187f03891746f241d1484f6acec69219124321a77d0f9e183
4
- data.tar.gz: fcbcc52de14fd2103fdb2e3ffad9644cbf74587c621c5362c02a4fa46c6a40b2
3
+ metadata.gz: cf18c1b6b1e6b35fcd568d56c8185e00c26041e1b84afbc97b36071523daab40
4
+ data.tar.gz: 7af7cbd1a3c6a8d7538bf3e0c06ed17e42ce01b3eb487a834612876bedadb837
5
5
  SHA512:
6
- metadata.gz: 77f20a728bad840480a3851c78a60970cd6e773d3b4261c8d738099177af9f69d04010d7ba3c4ee914dcbed0c5608976689ba4a7cd7d94797d523709ab1b81ad
7
- data.tar.gz: 499ca077eb5cedae7eef353d2964a7e6be942bcbddcf14939d141913856ede4a2d5f09cbf76a0edebb4cb00c021ba64859dc1517dc9769a85ea609b46ec9b249
6
+ metadata.gz: c37493cbabd35c53cf0ebf94e2cfbc961110e6d983b7c103893592a9dfe6381f1c0f4ad6abbb5af876edba47518fe63b90a7739e7c044d715450191682a9233a
7
+ data.tar.gz: bbcadae2f7ad325f451b8d909f4a0fb4723b264418052fda0a37b9ea0beb9b1108041e019855168085409ff03e81580b4dbe79b289a90a7d24f46c67528dc30f
data/ChangeLog CHANGED
@@ -1,3 +1,36 @@
1
+ Wed May 1 2024 arton (reported and designed by uvlad7)
2
+ * test/Test105.java
3
+ add for test #105 (uvald7)
4
+ * test/test105.rb
5
+ add for test #105 (uvald7)
6
+ * ext/rjb.c
7
+ RJV_VERSION -> 1.7.3
8
+ invoke_by_instance takes six parameters. six is called by method_missing or _invoke
9
+ Wed May 1 2024 arton
10
+ * test/jartest3.rb
11
+ accept ClassNotFoundException for test
12
+ * ext/load.c
13
+ clear ruby error
14
+ * ext/rjb.c
15
+ change import => s_import for delegate. call Rjb::import instead of internal C fund.
16
+ * lib/rjb.rb
17
+ Rjb::import retry to import for NoSuchFieldException
18
+ Fri Apr 26 2024 arton
19
+ * ext/rjb.c
20
+ RJB_VERSION -> 1.7.2
21
+ * ext/extconf.rb
22
+ change javah and javac console encoding according to the locale (reported by winezer0)
23
+ * ext/load.c
24
+ fix win32 and cygwin JVM path detection (reported by winezer0)
25
+ * setup.rb
26
+ remove duplicate line
27
+ Sun Apr 14 2024 arton
28
+ * ext/rjb.c
29
+ RJB_VERSION -> 1.7.1
30
+ * lib/rjb/extension.rb
31
+ skip $LOAD_PATH check if absolute path was given
32
+ * test/exttest.rb
33
+ add absolute path test
1
34
  Sun Apr 14 2024 arton
2
35
  * ext/rjb.c
3
36
  RJB_VERSION -> 1.7.0
data/ext/extconf.rb CHANGED
@@ -79,8 +79,13 @@ end
79
79
  JAVAH_COMMAND = 'javac -h . -classpath ../data/rjb RBridge.java'.freeze
80
80
 
81
81
  if find_executable('javah')
82
- cversion = (`javac -version` =~ /\d+\.\d+\.\d+/ ) ? $& : nil
83
- hversion = (`javah -version` =~ /\d+\.\d+\.\d+/ ) ? $& : nil
82
+ if defined?(Encoding) && ''.respond_to?(:force_encoding)
83
+ cversion = (`javac -version`.force_encoding(Encoding.locale_charmap).encode('utf-8') =~ /\d+\.\d+\.\d+/ ) ? $& : nil
84
+ hversion = (`javah -version`.force_encoding(Encoding.locale_charmap).encode('utf-8') =~ /\d+\.\d+\.\d+/ ) ? $& : nil
85
+ else
86
+ cversion = (`javac -version` =~ /\d+\.\d+\.\d+/ ) ? $& : nil
87
+ hversion = (`javah -version` =~ /\d+\.\d+\.\d+/ ) ? $& : nil
88
+ end
84
89
  if cversion == hversion || cversion.nil?
85
90
  javah = 'javah -classpath ../data/rjb jp.co.infoseek.hp.arton.rjb.RBridge'
86
91
  else
data/ext/load.c CHANGED
@@ -95,7 +95,6 @@
95
95
  #define DIRSEPARATOR '/'
96
96
  #define CLASSPATH_SEP ':'
97
97
  #endif
98
-
99
98
  #if defined(__APPLE__) && defined(__MACH__)
100
99
  static char* CREATEJVM = "JNI_CreateJavaVM";
101
100
  static char* GETDEFAULTJVMINITARGS = "JNI_GetDefaultJavaVMInitArgs";
@@ -107,7 +106,6 @@
107
106
  typedef int (JNICALL *GETDEFAULTJAVAVMINITARGS)(void*);
108
107
  typedef int (JNICALL *CREATEJAVAVM)(JavaVM**, JNIEnv**, void*);
109
108
 
110
-
111
109
  static VALUE jvmdll = Qnil;
112
110
  static VALUE getdefaultjavavminitargsfunc;
113
111
  static VALUE createjavavmfunc;
@@ -147,13 +145,14 @@ static int open_jvm(char* libpath)
147
145
  #if !defined(RUBINIUS)
148
146
  if (state || !rb_const_defined_at(rb_cObject, rb_intern(DLNames[i])))
149
147
  {
150
- if (i > 0)
151
- {
152
- rb_raise(rb_eRuntimeError, "Constants DL or Fiddle is not defined.");
153
- return 0;
154
- }
155
- }
156
- else
148
+ rb_set_errinfo(Qnil);
149
+ if (i > 0)
150
+ {
151
+ rb_raise(rb_eRuntimeError, "Constants DL or Fiddle is not defined.");
152
+ return 0;
153
+ }
154
+ }
155
+ else
157
156
  #endif
158
157
  {
159
158
  sstat = 0;
@@ -167,9 +166,13 @@ static int open_jvm(char* libpath)
167
166
  {
168
167
  break;
169
168
  }
170
- else if (i > 0)
171
- {
172
- return 0;
169
+ else
170
+ {
171
+ rb_set_errinfo(Qnil);
172
+ if (i > 0)
173
+ {
174
+ return 0;
175
+ }
173
176
  }
174
177
  }
175
178
  }
@@ -274,7 +277,7 @@ static int load_jvm(const char* jvmtype)
274
277
  return 1;
275
278
  }
276
279
  #if defined(_WIN32) || defined(__CYGWIN__)
277
- return 0;
280
+ sprintf(libpath, JVMDLL, java_home, jvmtype);
278
281
  #else /* not Windows / MAC OS-X */
279
282
  sprintf(libpath, JVMDLL, java_home, ARCH, jvmtype);
280
283
  #endif
data/ext/rjb.c CHANGED
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Rjb - Ruby <-> Java Bridge
3
- * Copyright(c) 2004,2005,2006,2007,2008,2009,2010,2011,2012,2014-2016,2018 arton
3
+ * Copyright(c) 2004,2005,2006,2007,2008,2009,2010,2011,2012,2014-2016,2018,2024 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
@@ -14,7 +14,7 @@
14
14
  *
15
15
  */
16
16
 
17
- #define RJB_VERSION "1.7.0"
17
+ #define RJB_VERSION "1.7.3"
18
18
 
19
19
  #include "ruby.h"
20
20
  #include "extconf.h"
@@ -93,6 +93,8 @@ static ID initialize_proxy;
93
93
  static ID cvar_classpath;
94
94
  static ID anonymousblock;
95
95
  static ID id_call;
96
+ static ID id_import;
97
+
96
98
 
97
99
  VALUE rjb_loaded_classes;
98
100
  static VALUE proxies;
@@ -280,7 +282,7 @@ static VALUE jv2rclass(JNIEnv* jenv, jclass jc)
280
282
  v = rb_hash_aref(rjb_loaded_classes, clsname);
281
283
  if (v == Qnil)
282
284
  {
283
- v = import_class(jenv, jc, clsname);
285
+ v = rb_funcall(rjb, id_import, 1, clsname);
284
286
  }
285
287
  (*jenv)->DeleteLocalRef(jenv, jc);
286
288
  return v;
@@ -321,7 +323,7 @@ static VALUE jv2rv_r(JNIEnv* jenv, jvalue val)
321
323
  v = rb_hash_aref(rjb_loaded_classes, clsname);
322
324
  if (v == Qnil)
323
325
  {
324
- v = import_class(jenv, klass, clsname);
326
+ v = rb_funcall(rjb, id_import, 1, clsname);
325
327
  }
326
328
  Data_Get_Struct(v, struct jv_data, ptr);
327
329
  v = register_instance(jenv, v, (struct jv_data*)ptr, val.l);
@@ -3091,14 +3093,14 @@ static VALUE invoke(JNIEnv* jenv, struct cls_method* pm, struct jvi_data* ptr,
3091
3093
  * Object invocation
3092
3094
  */
3093
3095
  static VALUE invoke_by_instance(ID rmid, int argc, VALUE* argv,
3094
- struct jvi_data* ptr, char* sig)
3096
+ struct jvi_data* ptr, char* sig, int called_by_invoke)
3095
3097
  {
3096
3098
  VALUE ret = Qnil;
3097
3099
  JNIEnv* jenv = rjb_attach_current_thread();
3098
3100
  struct cls_field* pf;
3099
3101
  struct cls_method* pm;
3100
3102
  const char* tname = rb_id2name(rmid);
3101
- if (argc == 0 && st_lookup(ptr->fields, rmid, (st_data_t*)&pf))
3103
+ if (!called_by_invoke && argc == 0 && st_lookup(ptr->fields, rmid, (st_data_t*)&pf))
3102
3104
  {
3103
3105
  ret = getter(jenv, pf, ptr);
3104
3106
  }
@@ -3155,7 +3157,7 @@ static VALUE rjb_i_invoke(int argc, VALUE* argv, VALUE self)
3155
3157
  sig = NIL_P(vsig) ? NULL : StringValueCStr(vsig);
3156
3158
  Data_Get_Struct(self, struct jvi_data, ptr);
3157
3159
 
3158
- return invoke_by_instance(rmid, argc - 2, argv + 2, ptr, sig);
3160
+ return invoke_by_instance(rmid, argc - 2, argv + 2, ptr, sig, 1);
3159
3161
  }
3160
3162
 
3161
3163
  static VALUE rjb_i_missing(int argc, VALUE* argv, VALUE self)
@@ -3165,7 +3167,7 @@ static VALUE rjb_i_missing(int argc, VALUE* argv, VALUE self)
3165
3167
 
3166
3168
  Data_Get_Struct(self, struct jvi_data, ptr);
3167
3169
 
3168
- return invoke_by_instance(rmid, argc -1, argv + 1, ptr, NULL);
3170
+ return invoke_by_instance(rmid, argc -1, argv + 1, ptr, NULL, 0);
3169
3171
  }
3170
3172
 
3171
3173
  /*
@@ -3268,6 +3270,7 @@ static VALUE rjb_missing(int argc, VALUE* argv, VALUE self)
3268
3270
  {
3269
3271
  return r;
3270
3272
  }
3273
+ rb_set_errinfo(Qnil);
3271
3274
  }
3272
3275
 
3273
3276
  Data_Get_Struct(self, struct jv_data, ptr);
@@ -3281,7 +3284,7 @@ static VALUE rjb_class_forname(int argc, VALUE* argv, VALUE self)
3281
3284
  {
3282
3285
  if (argc == 1)
3283
3286
  {
3284
- return rjb_s_import(self, *argv);
3287
+ return rjb_s_import(self, *argv);
3285
3288
  }
3286
3289
  else
3287
3290
  {
@@ -3318,7 +3321,7 @@ void Init_rjbcore()
3318
3321
  rb_define_module_function(rjb, "load", rjb_s_load, -1);
3319
3322
  rb_define_module_function(rjb, "unload", rjb_s_unload, -1);
3320
3323
  rb_define_module_function(rjb, "loaded?", rjb_s_loaded, 0);
3321
- rb_define_module_function(rjb, "import", rjb_s_import, 1);
3324
+ rb_define_module_function(rjb, "s_import", rjb_s_import, 1);
3322
3325
  rb_define_module_function(rjb, "bind", rjb_s_bind, 2);
3323
3326
  rb_define_module_function(rjb, "unbind", rjb_s_unbind, 1);
3324
3327
  rb_define_module_function(rjb, "classes", rjb_s_classes, 0);
@@ -3363,6 +3366,7 @@ void Init_rjbcore()
3363
3366
  rb_define_method(rjba, "method_missing", rjb_a_missing, -1);
3364
3367
  anonymousblock = rb_intern("@anon_block");
3365
3368
  id_call = rb_intern("call");
3369
+ id_import = rb_intern("import");
3366
3370
  }
3367
3371
 
3368
3372
  VALUE rjb_safe_funcall(VALUE args)
data/lib/rjb/extension.rb CHANGED
@@ -51,10 +51,14 @@ module Kernel
51
51
 
52
52
  # This will maybe use the wrong jar file from a previous version of the GEM
53
53
  # puts "LOAD PATH #{$LOAD_PATH}"
54
- found_path = $LOAD_PATH.reverse.find{|p| File.exist?(File.join(p,path))}
54
+ if File.respond_to?(:absolute_path?) && File.absolute_path?(path)
55
+ found_path = File.exist?(path) ? '' : nil
56
+ else
57
+ found_path = $LOAD_PATH.reverse.find {|p| File.exist?(File.join(p, path))}
58
+ end
55
59
  raise unless found_path
56
60
 
57
- abs_path = File.join(found_path, path)
61
+ abs_path = found_path.length == 0 ? path : File.join(found_path, path)
58
62
  # check that the file exists
59
63
  raise unless File.exist?(abs_path)
60
64
 
data/lib/rjb.rb CHANGED
@@ -66,6 +66,20 @@ end
66
66
  require 'rjbcore'
67
67
 
68
68
  module Rjb
69
+ def self.import(cls)
70
+ s_import(cls)
71
+ rescue NoSuchFieldError => e
72
+ puts "#{cls}: #{e.inspect}" if $VERBOSE
73
+ s_import(cls)
74
+ end
75
+
76
+ def import(cls)
77
+ s_import(cls)
78
+ rescue NoSuchFieldError => e
79
+ puts "#{cls}: #{e.inspect}" if $VERBOSE
80
+ s_import(cls)
81
+ end
82
+
69
83
  module MODIFIER
70
84
  def self.STATIC
71
85
  8
data/test/exttest.rb CHANGED
@@ -26,9 +26,18 @@ class ExtTestRjb < Test::Unit::TestCase
26
26
  def jp
27
27
  JavaPackage.new('jp')
28
28
  end
29
-
30
- def test_require_extension
29
+
30
+ def test_absolute_path_require
31
31
  assert !Rjb::loaded?
32
+ require File.absolute_path('./rjbtest.jar')
33
+ Rjb::load
34
+ assert Rjb::loaded?
35
+ base = jp.co.infoseek.hp.arton.rjb.Base.new
36
+ assert_equal('hello', base.instance_var)
37
+ end
38
+
39
+ def test_require_extension
40
+ org_load_path = $LOAD_PATH
32
41
  $LOAD_PATH << '.'
33
42
  require 'rjbtest.jar'
34
43
  Rjb::load
@@ -36,4 +45,5 @@ class ExtTestRjb < Test::Unit::TestCase
36
45
  base = jp.co.infoseek.hp.arton.rjb.Base.new
37
46
  assert_equal('hello', base.instance_var)
38
47
  end
48
+
39
49
  end
data/test/jartest3.rb CHANGED
@@ -21,7 +21,8 @@ class JarTest < Test::Unit::TestCase
21
21
  begin
22
22
  Rjb::import('jp.co.infoseek.hp.arton.rjb.JarTest2')
23
23
  fail 'no exception'
24
- rescue NoClassDefFoundError
24
+ rescue => e
25
+ ['NoClassDefFoundError', 'ClassNotFoundException'].any? {|nm| e.class == nm}
25
26
  assert true
26
27
  end
27
28
  end
data/test/listtest.rb CHANGED
@@ -4,22 +4,20 @@
4
4
  Copyright(c) 2012 arton
5
5
  =end
6
6
 
7
- require 'test/unit'
8
7
  begin
9
8
  require 'rjb/list'
10
9
  rescue LoadError
11
10
  require 'rubygems'
12
11
  require 'rjb/list'
13
12
  end
13
+ require 'test/unit'
14
14
  require 'fileutils'
15
15
 
16
16
  class ListTest < Test::Unit::TestCase
17
17
  include Rjb
18
18
  def test_create
19
19
  ja = import('java.util.ArrayList')
20
- p 'imported'
21
20
  a = ja.new
22
- p 'new'
23
21
  a.add(1)
24
22
  a.add(2)
25
23
  a.add(3)
@@ -30,7 +28,6 @@ p 'new'
30
28
  end
31
29
  assert_equal 4, n
32
30
  end
33
- =begin
34
31
  def test_returned_proxy
35
32
  ja = import('java.util.Arrays')
36
33
  a = ja.as_list([1, 2, 3])
@@ -55,6 +52,5 @@ p 'new'
55
52
  ja = import('java.util.Arrays')
56
53
  assert_equal 55, ja.as_list((1..10).to_a).inject(0) {|r, e| r + e.intValue}
57
54
  end
58
- =end
59
55
  end
60
56
 
data/test/test105.rb ADDED
@@ -0,0 +1,28 @@
1
+ begin
2
+ require 'rjb'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'rjb'
6
+ end
7
+ require 'test/unit'
8
+
9
+ class Test105 < Test::Unit::TestCase
10
+ include Rjb
11
+ def setup
12
+ Rjb::load('.')
13
+ @test105 = import('jp.co.infoseek.hp.arton.rjb.Test105')
14
+ end
15
+
16
+ def test_field
17
+ test = @test105.new('xyz')
18
+ assert_equal('xyz', test.test)
19
+ end
20
+
21
+ def test_method
22
+ test = @test105.new('xyz')
23
+ ret = test._invoke('test')
24
+ assert_equal('method_xyz', ret)
25
+ end
26
+ end
27
+
28
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rjb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - arton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-14 00:00:00.000000000 Z
11
+ date: 2024-05-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: RJB is a Bridge library which connects Ruby and Java code using the Java
14
14
  Native Interface.
@@ -58,6 +58,7 @@ files:
58
58
  - test/jp/co/infoseek/hp/arton/rjb/JarTest2.class
59
59
  - test/jp/co/infoseek/hp/arton/rjb/Test$TestTypes.class
60
60
  - test/jp/co/infoseek/hp/arton/rjb/Test.class
61
+ - test/jp/co/infoseek/hp/arton/rjb/Test105.class
61
62
  - test/jp/co/infoseek/hp/arton/rjb/Two.class
62
63
  - test/jp/co/infoseek/hp/arton/rjb/TwoCaller.class
63
64
  - test/l.rb
@@ -65,6 +66,7 @@ files:
65
66
  - test/osx_jvmcheck.rb
66
67
  - test/rjbtest.jar
67
68
  - test/test.rb
69
+ - test/test105.rb
68
70
  - test/test_osxjvm.rb
69
71
  - test/test_osxload.rb
70
72
  - test/test_unload.rb