rjb 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +16 -0
- data/ext/rjb.c +74 -74
- data/ext/rjbexception.c +15 -4
- data/lib/rjb.rb +20 -1
- data/test/test.rb +17 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f75da380b876687e4355f11f4637d408ed0aad22b83ed03ff8d766cd96352ba
|
4
|
+
data.tar.gz: 30fa4dd4c8e197722cc799a3258a629016067dc16022c4100f934ec7074388b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6637eb828550bf98bc4ed693428d209dc5d24f042e29f8a0f48cde1d32e764c6fb67adb64f1a2e67e5ca5f2e815dfd29bbc9f8bdfe9f18a5ad0e12599c4b0465
|
7
|
+
data.tar.gz: 501f7f908fe7e6a3ceb33aa07fa8f4903554ccbbfea22d39ea5e213a85f4e7b7e5fd567ce0b1a43d8afba96aeebd9f718783d21e158d7a4042661f43e5888111
|
data/ChangeLog
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
Wed Jul 17 2019 arton
|
2
|
+
* ext/rjb.c
|
3
|
+
RJB_VERSION -> 1.6.1
|
4
|
+
* lib/rjb.rb
|
5
|
+
java_methods and methods return symbol
|
6
|
+
implements respond_to? for Java methods
|
7
|
+
* ext/rbjexception.c
|
8
|
+
delegate to JavaProxy for respond_to? (except for to_str and exception)
|
9
|
+
* test/test.rb
|
10
|
+
change java_methods test to adjust above change
|
11
|
+
add respond_to? test
|
12
|
+
Thu Jul 11 2019 arton
|
13
|
+
* ext/rjb.c
|
14
|
+
RJB_VERSION -> 1.6.0
|
15
|
+
* ext/riconv.c
|
16
|
+
encode/decode between utf-8 and cesu-8 if char was greater than \uffff
|
1
17
|
Sun Feb 17 2019 lamby / arton
|
2
18
|
* ext/rjb.c
|
3
19
|
RJB_VERSION -> 1.5.9
|
data/ext/rjb.c
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
*
|
15
15
|
*/
|
16
16
|
|
17
|
-
#define RJB_VERSION "1.6.
|
17
|
+
#define RJB_VERSION "1.6.1"
|
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
|
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
|
-
|
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
@@ -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
@@ -726,19 +726,19 @@ class TestRjb < Test::Unit::TestCase
|
|
726
726
|
end
|
727
727
|
def test_methods_extension
|
728
728
|
m = @jString.new('').methods
|
729
|
-
assert m.include?(
|
729
|
+
assert m.include?(:indexOf)
|
730
730
|
end
|
731
731
|
def test_class_methods_extension
|
732
732
|
m = @jString.methods
|
733
|
-
assert m.include?(
|
733
|
+
assert m.include?(:format)
|
734
734
|
end
|
735
735
|
def test_pmethods_extension
|
736
736
|
m = @jString.new('').public_methods
|
737
|
-
assert m.include?(
|
737
|
+
assert m.include?(:indexOf)
|
738
738
|
end
|
739
739
|
def test_class_pmethods_extension
|
740
740
|
m = @jString.public_methods
|
741
|
-
assert m.include?(
|
741
|
+
assert m.include?(:format)
|
742
742
|
end
|
743
743
|
def test_java_methods
|
744
744
|
indexof = @jString.new('').java_methods.find do |m|
|
@@ -963,5 +963,17 @@ class TestRjb < Test::Unit::TestCase
|
|
963
963
|
y = @jString.new('𠮷野家')
|
964
964
|
assert_equal '𠮷野家', y.toString
|
965
965
|
end
|
966
|
-
end
|
967
966
|
|
967
|
+
def test_respond_to
|
968
|
+
str = @jString.new('blabla')
|
969
|
+
assert str.respond_to? :substring
|
970
|
+
assert_false str.respond_to? :unknown_method
|
971
|
+
begin
|
972
|
+
@jInteger.parseInt('blabla')
|
973
|
+
rescue => e
|
974
|
+
assert e.respond_to? :print_stack_trace
|
975
|
+
assert e.respond_to? :printStackTrace
|
976
|
+
# assert_false e.respond_to? :unknown_method
|
977
|
+
end
|
978
|
+
end
|
979
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rjb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- arton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'RJB is a bridge program that connect between Ruby and Java with Java
|
14
14
|
Native Interface.
|