Skip to content

Commit bd7668b

Browse files
committed
Add missing Truffle::Interop methods
1 parent 134c136 commit bd7668b

File tree

1 file changed

+180
-18
lines changed

1 file changed

+180
-18
lines changed

src/main/java/org/truffleruby/interop/InteropNodes.java

Lines changed: 180 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -715,10 +715,28 @@ protected boolean isNumber(Object receiver,
715715
}
716716
}
717717

718+
@CoreMethod(names = "fits_in_byte?", onSingleton = true, required = 1)
719+
public abstract static class FitsInByteNode extends InteropCoreMethodArrayArgumentsNode {
720+
@Specialization(limit = "getCacheLimit()")
721+
protected boolean fits(Object receiver,
722+
@CachedLibrary("receiver") InteropLibrary receivers) {
723+
return receivers.fitsInByte(receiver);
724+
}
725+
}
726+
727+
@CoreMethod(names = "fits_in_short?", onSingleton = true, required = 1)
728+
public abstract static class FitsInShortNode extends InteropCoreMethodArrayArgumentsNode {
729+
@Specialization(limit = "getCacheLimit()")
730+
protected boolean fits(Object receiver,
731+
@CachedLibrary("receiver") InteropLibrary receivers) {
732+
return receivers.fitsInShort(receiver);
733+
}
734+
}
735+
718736
@CoreMethod(names = "fits_in_int?", onSingleton = true, required = 1)
719737
public abstract static class FitsInIntNode extends InteropCoreMethodArrayArgumentsNode {
720738
@Specialization(limit = "getCacheLimit()")
721-
protected boolean fitsInInt(Object receiver,
739+
protected boolean fits(Object receiver,
722740
@CachedLibrary("receiver") InteropLibrary receivers) {
723741
return receivers.fitsInInt(receiver);
724742
}
@@ -727,25 +745,62 @@ protected boolean fitsInInt(Object receiver,
727745
@CoreMethod(names = "fits_in_long?", onSingleton = true, required = 1)
728746
public abstract static class FitsInLongNode extends InteropCoreMethodArrayArgumentsNode {
729747
@Specialization(limit = "getCacheLimit()")
730-
protected boolean fitsInLong(Object receiver,
748+
protected boolean fits(Object receiver,
731749
@CachedLibrary("receiver") InteropLibrary receivers) {
732750
return receivers.fitsInLong(receiver);
733751
}
734752
}
735753

754+
@CoreMethod(names = "fits_in_float?", onSingleton = true, required = 1)
755+
public abstract static class FitsInFloatNode extends InteropCoreMethodArrayArgumentsNode {
756+
@Specialization(limit = "getCacheLimit()")
757+
protected boolean fits(Object receiver,
758+
@CachedLibrary("receiver") InteropLibrary receivers) {
759+
return receivers.fitsInFloat(receiver);
760+
}
761+
}
762+
736763
@CoreMethod(names = "fits_in_double?", onSingleton = true, required = 1)
737764
public abstract static class FitsInDoubleNode extends InteropCoreMethodArrayArgumentsNode {
738765
@Specialization(limit = "getCacheLimit()")
739-
protected boolean fitsInDouble(Object receiver,
766+
protected boolean fits(Object receiver,
740767
@CachedLibrary("receiver") InteropLibrary receivers) {
741768
return receivers.fitsInDouble(receiver);
742769
}
743770
}
744771

772+
@CoreMethod(names = "as_byte", onSingleton = true, required = 1)
773+
public abstract static class AsByteNode extends InteropCoreMethodArrayArgumentsNode {
774+
@Specialization(limit = "getCacheLimit()")
775+
protected int as(Object receiver,
776+
@CachedLibrary("receiver") InteropLibrary receivers,
777+
@Cached TranslateInteropExceptionNode translateInteropException) {
778+
try {
779+
return receivers.asByte(receiver);
780+
} catch (InteropException e) {
781+
throw translateInteropException.execute(e);
782+
}
783+
}
784+
}
785+
786+
@CoreMethod(names = "as_short", onSingleton = true, required = 1)
787+
public abstract static class AsShortNode extends InteropCoreMethodArrayArgumentsNode {
788+
@Specialization(limit = "getCacheLimit()")
789+
protected int as(Object receiver,
790+
@CachedLibrary("receiver") InteropLibrary receivers,
791+
@Cached TranslateInteropExceptionNode translateInteropException) {
792+
try {
793+
return receivers.asShort(receiver);
794+
} catch (InteropException e) {
795+
throw translateInteropException.execute(e);
796+
}
797+
}
798+
}
799+
745800
@CoreMethod(names = "as_int", onSingleton = true, required = 1)
746801
public abstract static class AsIntNode extends InteropCoreMethodArrayArgumentsNode {
747802
@Specialization(limit = "getCacheLimit()")
748-
protected int asInt(Object receiver,
803+
protected int as(Object receiver,
749804
@CachedLibrary("receiver") InteropLibrary receivers,
750805
@Cached TranslateInteropExceptionNode translateInteropException) {
751806
try {
@@ -759,7 +814,7 @@ protected int asInt(Object receiver,
759814
@CoreMethod(names = "as_long", onSingleton = true, required = 1)
760815
public abstract static class AsLongNode extends InteropCoreMethodArrayArgumentsNode {
761816
@Specialization(limit = "getCacheLimit()")
762-
protected long asLong(Object receiver,
817+
protected long as(Object receiver,
763818
@CachedLibrary("receiver") InteropLibrary receivers,
764819
@Cached TranslateInteropExceptionNode translateInteropException) {
765820
try {
@@ -770,10 +825,24 @@ protected long asLong(Object receiver,
770825
}
771826
}
772827

828+
@CoreMethod(names = "as_float", onSingleton = true, required = 1)
829+
public abstract static class AsFloatNode extends InteropCoreMethodArrayArgumentsNode {
830+
@Specialization(limit = "getCacheLimit()")
831+
protected double as(Object receiver,
832+
@CachedLibrary("receiver") InteropLibrary receivers,
833+
@Cached TranslateInteropExceptionNode translateInteropException) {
834+
try {
835+
return receivers.asFloat(receiver);
836+
} catch (InteropException e) {
837+
throw translateInteropException.execute(e);
838+
}
839+
}
840+
}
841+
773842
@CoreMethod(names = "as_double", onSingleton = true, required = 1)
774843
public abstract static class AsDoubleNode extends InteropCoreMethodArrayArgumentsNode {
775844
@Specialization(limit = "getCacheLimit()")
776-
protected double asDouble(Object receiver,
845+
protected double as(Object receiver,
777846
@CachedLibrary("receiver") InteropLibrary receivers,
778847
@Cached TranslateInteropExceptionNode translateInteropException) {
779848
try {
@@ -1439,9 +1508,26 @@ private Object javaType(String name) {
14391508
// endregion
14401509

14411510
// region MetaObject
1511+
@CoreMethod(names = "meta_object?", onSingleton = true, required = 1)
1512+
public abstract static class IsMetaObjectNode extends InteropCoreMethodArrayArgumentsNode {
1513+
@Specialization(limit = "getCacheLimit()")
1514+
protected boolean isMetaObject(Object receiver,
1515+
@CachedLibrary("receiver") InteropLibrary interop) {
1516+
return interop.isMetaObject(receiver);
1517+
}
1518+
}
1519+
1520+
@CoreMethod(names = "has_meta_object?", onSingleton = true, required = 1)
1521+
public abstract static class HasMetaObjectNode extends InteropCoreMethodArrayArgumentsNode {
1522+
@Specialization(limit = "getCacheLimit()")
1523+
protected boolean hasMetaObject(Object receiver,
1524+
@CachedLibrary("receiver") InteropLibrary interop) {
1525+
return interop.hasMetaObject(receiver);
1526+
}
1527+
}
1528+
14421529
@CoreMethod(names = "meta_object", onSingleton = true, required = 1)
14431530
public abstract static class InteropMetaObjectNode extends InteropCoreMethodArrayArgumentsNode {
1444-
14451531
@Specialization(limit = "getCacheLimit()")
14461532
protected Object metaObject(Object value,
14471533
@CachedLibrary("value") InteropLibrary interop,
@@ -1457,14 +1543,67 @@ protected Object metaObject(Object value,
14571543
return coreLibrary().getLogicalClass(value);
14581544
}
14591545
}
1546+
}
14601547

1548+
@CoreMethod(names = "has_declaring_meta_object?", onSingleton = true, required = 1)
1549+
public abstract static class HasDeclaringMetaObjectNode extends InteropCoreMethodArrayArgumentsNode {
1550+
@Specialization(limit = "getCacheLimit()")
1551+
protected boolean hasDeclaringMetaObject(Object receiver,
1552+
@CachedLibrary("receiver") InteropLibrary interop) {
1553+
return interop.hasDeclaringMetaObject(receiver);
1554+
}
1555+
}
1556+
1557+
@CoreMethod(names = "declaring_meta_object", onSingleton = true, required = 1)
1558+
public abstract static class DeclaringMetaObjectNode extends InteropCoreMethodArrayArgumentsNode {
1559+
@Specialization(limit = "getCacheLimit()")
1560+
protected Object declaringMetaObject(Object value,
1561+
@CachedLibrary("value") InteropLibrary interop,
1562+
@Cached TranslateInteropExceptionNode translateInteropException) {
1563+
try {
1564+
return interop.getDeclaringMetaObject(value);
1565+
} catch (UnsupportedMessageException e) {
1566+
throw translateInteropException.execute(e);
1567+
}
1568+
}
1569+
}
1570+
1571+
@CoreMethod(names = "meta_instance?", onSingleton = true, required = 2)
1572+
public abstract static class IsMetaInstanceNode extends InteropCoreMethodArrayArgumentsNode {
1573+
@Specialization(limit = "getCacheLimit()")
1574+
protected boolean isMetaInstance(Object metaObject, Object instance,
1575+
@CachedLibrary("metaObject") InteropLibrary interop,
1576+
@Cached TranslateInteropExceptionNode translateInteropException) {
1577+
try {
1578+
return interop.isMetaInstance(metaObject, instance);
1579+
} catch (UnsupportedMessageException e) {
1580+
throw translateInteropException.execute(e);
1581+
}
1582+
}
1583+
}
1584+
1585+
@CoreMethod(names = "meta_simple_name", onSingleton = true, required = 1)
1586+
public abstract static class GetMetaSimpleNameNode extends InteropCoreMethodArrayArgumentsNode {
1587+
@Specialization(limit = "getCacheLimit()")
1588+
protected Object getMetaSimpleName(Object metaObject,
1589+
@CachedLibrary("metaObject") InteropLibrary interop,
1590+
@CachedLibrary(limit = "1") InteropLibrary asStrings,
1591+
@Cached FromJavaStringNode fromJavaStringNode,
1592+
@Cached TranslateInteropExceptionNode translateInteropException) {
1593+
try {
1594+
final Object simpleName = interop.getMetaSimpleName(metaObject);
1595+
final String string = asStrings.asString(simpleName);
1596+
return fromJavaStringNode.executeFromJavaString(string);
1597+
} catch (UnsupportedMessageException e) {
1598+
throw translateInteropException.execute(e);
1599+
}
1600+
}
14611601
}
14621602

14631603
@CoreMethod(names = "meta_qualified_name", onSingleton = true, required = 1)
14641604
public abstract static class GetMetaQualifiedNameNode extends InteropCoreMethodArrayArgumentsNode {
1465-
14661605
@Specialization(limit = "getCacheLimit()")
1467-
protected Object metaObject(Object metaObject,
1606+
protected Object getMetaQualifiedName(Object metaObject,
14681607
@CachedLibrary("metaObject") InteropLibrary interop,
14691608
@CachedLibrary(limit = "1") InteropLibrary asStrings,
14701609
@Cached FromJavaStringNode fromJavaStringNode,
@@ -1477,22 +1616,45 @@ protected Object metaObject(Object metaObject,
14771616
throw translateInteropException.execute(e);
14781617
}
14791618
}
1480-
14811619
}
14821620
// endregion
14831621

14841622
// region Identity
1485-
@CoreMethod(names = "identity_hash_code", onSingleton = true, required = 1)
1486-
public abstract static class InteropIdentityHashCodeNode extends CoreMethodArrayArgumentsNode {
1623+
@CoreMethod(names = "identical?", onSingleton = true, required = 2)
1624+
public abstract static class IsIdenticalNode extends InteropCoreMethodArrayArgumentsNode {
1625+
@Specialization(limit = "getCacheLimit()")
1626+
protected boolean isIdentical(Object receiver, Object other,
1627+
@CachedLibrary("receiver") InteropLibrary lhsInterop,
1628+
@CachedLibrary("other") InteropLibrary rhsInterop) {
1629+
return lhsInterop.isIdentical(receiver, other, rhsInterop);
1630+
}
1631+
}
14871632

1488-
@Specialization
1489-
@TruffleBoundary
1490-
protected int identityHashCode(Object value) {
1491-
final int code = System.identityHashCode(value);
1492-
assert code >= 0;
1493-
return code;
1633+
@CoreMethod(names = "has_identity?", onSingleton = true, required = 1)
1634+
public abstract static class HasIdentityNode extends InteropCoreMethodArrayArgumentsNode {
1635+
@Specialization(limit = "getCacheLimit()")
1636+
protected boolean hasIdentity(Object receiver,
1637+
@CachedLibrary("receiver") InteropLibrary interop) {
1638+
return interop.hasIdentity(receiver);
14941639
}
1640+
}
14951641

1642+
@CoreMethod(names = "identity_hash_code", onSingleton = true, required = 1)
1643+
public abstract static class InteropIdentityHashCodeNode extends InteropCoreMethodArrayArgumentsNode {
1644+
@Specialization(limit = "getCacheLimit()")
1645+
protected int identityHashCode(Object value,
1646+
@CachedLibrary("value") InteropLibrary interop,
1647+
@Cached TranslateInteropExceptionNode translateInteropException) {
1648+
if (interop.hasIdentity(value)) {
1649+
try {
1650+
return interop.identityHashCode(value);
1651+
} catch (UnsupportedMessageException e) {
1652+
throw translateInteropException.execute(e);
1653+
}
1654+
} else {
1655+
return System.identityHashCode(value);
1656+
}
1657+
}
14961658
}
14971659
// endregion
14981660

0 commit comments

Comments
 (0)