package com.oracle.truffle.llvm.tests.interop;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.interop.InteropException;
import com.oracle.truffle.api.interop.InteropLibrary;
import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.library.ExportLibrary;
import com.oracle.truffle.api.library.ExportMessage;
import com.oracle.truffle.llvm.tests.interop.values.NativeValue;
import com.oracle.truffle.tck.TruffleRunner;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(TruffleRunner.class)
@SuppressWarnings("deprecation")
public class DeprecatedPointerCompareTest extends InteropTestBase {
static final InteropLibrary INTEROP = InteropLibrary.getUncached();
static final com.oracle.truffle.llvm.spi.ReferenceLibrary REFERENCES = com.oracle.truffle.llvm.spi.ReferenceLibrary.getFactory().getUncached();
static Object testPointerAdd;
@BeforeClass
public static void loadLibrary() throws InteropException {
Object testLibrary = loadTestBitcodeInternal("pointerArithmetic.c");
testPointerAdd = INTEROP.readMember(testLibrary, "test_pointer_add");
}
@ExportLibrary(com.oracle.truffle.llvm.spi.ReferenceLibrary.class)
@ExportLibrary(InteropLibrary.class)
@SuppressWarnings("deprecation")
static class ReferenceEqualObject implements TruffleObject {
final int identity;
ReferenceEqualObject(int identity) {
this.identity = identity;
}
@ExportMessage
static class IsSame {
@Specialization
static boolean doCompare(ReferenceEqualObject self, ReferenceEqualObject other) {
return self.identity == other.identity;
}
@Fallback
static boolean doOther(@SuppressWarnings("unused") ReferenceEqualObject self, Object other) {
assert !(other instanceof ReferenceEqualObject);
return false;
}
}
@ExportMessage
void toNative() {
Assert.fail("unexpected toNative");
}
}
private static Object ptr(long v) {
return new NativeValue(v);
}
@Test
public void testIdenticalObject() throws InteropException {
Object ptr1 = INTEROP.execute(testPointerAdd, new ReferenceEqualObject(1), ptr(42));
Object ptr2 = INTEROP.execute(testPointerAdd, new ReferenceEqualObject(1), ptr(42));
Assert.assertTrue("equals", REFERENCES.isSame(ptr1, ptr2));
}
@Test
public void testSameAndIdenticalObject() throws InteropException {
ReferenceEqualObject obj = new ReferenceEqualObject(2);
Object ptr1 = INTEROP.execute(testPointerAdd, obj, ptr(42));
Object ptr2 = INTEROP.execute(testPointerAdd, obj, ptr(42));
Assert.assertTrue("equals", REFERENCES.isSame(ptr1, ptr2));
}
@Test
public void testNotIdenticalObject() throws InteropException {
Object ptr1 = INTEROP.execute(testPointerAdd, new ReferenceEqualObject(3), ptr(42));
Object ptr2 = INTEROP.execute(testPointerAdd, new ReferenceEqualObject(4), ptr(42));
Assert.assertFalse("!equals", REFERENCES.isSame(ptr1, ptr2));
}
}