@@ -226,8 +226,8 @@ public static IRubyObject op_minus(final ThreadContext context, final IRubyObjec
226
226
@ JRubyMethod
227
227
public static IRubyObject dup (final ThreadContext context , final IRubyObject self ) {
228
228
java .util .Collection coll = unwrapIfJavaObject (self );
229
- final JavaProxy dup = (JavaProxy ) self .dup ();
230
- if ( coll == dup .getObject () ) { // not Cloneable
229
+ final JavaProxy dup = (JavaProxy ) (( RubyBasicObject ) self ) .dup ();
230
+ if ( coll == dup .getObject () && ! ( coll instanceof Cloneable ) ) {
231
231
dup .setObject ( tryNewEqualInstance (coll ) );
232
232
}
233
233
return dup ;
@@ -236,8 +236,8 @@ public static IRubyObject dup(final ThreadContext context, final IRubyObject sel
236
236
@ JRubyMethod
237
237
public static IRubyObject clone (final ThreadContext context , final IRubyObject self ) {
238
238
java .util .Collection coll = unwrapIfJavaObject (self );
239
- final JavaProxy dup = (JavaProxy ) self .rbClone ();
240
- if ( coll == dup .getObject () ) { // not Cloneable
239
+ final JavaProxy dup = (JavaProxy ) (( RubyBasicObject ) self ) .rbClone ();
240
+ if ( coll == dup .getObject () && ! ( coll instanceof Cloneable ) ) {
241
241
dup .setObject ( tryNewEqualInstance (coll ) );
242
242
}
243
243
return dup ;
@@ -608,8 +608,10 @@ private static java.util.Collection tryNewEqualInstance(final java.util.Collecti
608
608
}
609
609
}
610
610
}
611
- if ( CAN_SET_ACCESSIBLE ) best .setAccessible (true );
612
- return (java .util .Collection ) best .newInstance (coll );
611
+ if ( best != null ) {
612
+ if ( CAN_SET_ACCESSIBLE ) best .setAccessible (true );
613
+ return (java .util .Collection ) best .newInstance (coll );
614
+ }
613
615
}
614
616
catch (IllegalAccessException e ) {
615
617
// fallback on getConstructor();
0 commit comments