package com.oracle.truffle.llvm.tests.interop;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import com.oracle.truffle.llvm.runtime.NativeContextExtension;
import com.oracle.truffle.llvm.runtime.options.SulongEngineOption;
import com.oracle.truffle.llvm.tests.BaseSuiteHarness;
import org.graalvm.polyglot.Context;
import org.junit.ClassRule;
import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.TruffleFile;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.interop.InteropException;
import com.oracle.truffle.api.interop.InteropLibrary;
import com.oracle.truffle.api.nodes.RootNode;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.llvm.tests.options.TestOptions;
import com.oracle.truffle.tck.TruffleRunner;
import org.graalvm.polyglot.Value;
public class InteropTestBase {
@ClassRule public static TruffleRunner.RunWithPolyglotRule runWithPolyglot = new TruffleRunner.RunWithPolyglotRule(getContextBuilder());
public static Context.Builder getContextBuilder() {
String lib = System.getProperty("test.sulongtest.lib.path");
return Context.newBuilder().allowAllAccess(true).allowExperimentalOptions(true).option(SulongEngineOption.LIBRARY_PATH_NAME, lib).option(SulongEngineOption.CXX_INTEROP_NAME, "true");
}
protected static final Path testBase = Paths.get(TestOptions.TEST_SUITE_PATH, "interop");
public static final String TEST_FILE_NAME = "O1." + NativeContextExtension.getNativeLibrarySuffix();
protected static Object loadTestBitcodeInternal(String name) {
File file = Paths.get(testBase.toString(), name + BaseSuiteHarness.TEST_DIR_EXT, TEST_FILE_NAME).toFile();
CallTarget target = getTestBitcodeCallTarget(file);
return target.call();
}
protected static CallTarget getTestBitcodeCallTarget(File file) {
TruffleFile tf = runWithPolyglot.getTruffleTestEnv().getPublicTruffleFile(file.toURI());
try {
Source source = Source.newBuilder("llvm", tf).build();
return runWithPolyglot.getTruffleTestEnv().parsePublic(source);
} catch (IOException ex) {
throw new AssertionError(ex);
}
}
protected static Value loadTestBitcodeValue(String name) {
File file = Paths.get(testBase.toString(), name + BaseSuiteHarness.TEST_DIR_EXT, TEST_FILE_NAME).toFile();
org.graalvm.polyglot.Source source;
try {
source = org.graalvm.polyglot.Source.newBuilder("llvm", file).build();
} catch (IOException ex) {
throw new AssertionError(ex);
}
return runWithPolyglot.getPolyglotContext().eval(source);
}
public static class SulongTestNode extends RootNode {
private final Object function;
@Child InteropLibrary interop;
protected SulongTestNode(Object testLibrary, String fnName) {
super(null);
try {
function = InteropLibrary.getFactory().getUncached().readMember(testLibrary, fnName);
} catch (InteropException ex) {
throw new AssertionError(ex);
}
this.interop = InteropLibrary.getFactory().create(function);
}
@Override
public Object execute(VirtualFrame frame) {
try {
return interop.execute(function, frame.getArguments());
} catch (InteropException ex) {
throw new AssertionError(ex);
}
}
}
}