package com.oracle.truffle.llvm.runtime;
import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.TruffleFile;
import com.oracle.truffle.api.interop.ArityException;
import com.oracle.truffle.api.interop.UnsupportedMessageException;
import com.oracle.truffle.api.interop.UnsupportedTypeException;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.llvm.runtime.nodes.api.LLVMNode;
import com.oracle.truffle.llvm.runtime.types.FunctionType;
import com.oracle.truffle.llvm.runtime.types.Type;
public abstract class NativeContextExtension implements ContextExtension {
public static class UnsupportedNativeTypeException extends Exception {
private static final long serialVersionUID = 1L;
private final Type type;
public UnsupportedNativeTypeException(Type type) {
super("unsupported type " + type + " in native interop");
this.type = type;
}
public Type getType() {
return type;
}
}
public static final class NativeLookupResult {
private final Object object;
public NativeLookupResult(Object object) {
this.object = object;
}
public Object getObject() {
return object;
}
}
public static final class NativePointerIntoLibrary {
private final long address;
public NativePointerIntoLibrary(long address) {
this.address = address;
}
public long getAddress() {
return address;
}
}
public abstract NativePointerIntoLibrary getNativeHandle(String name);
public abstract Object createNativeWrapper(LLVMFunction function, LLVMFunctionCode code);
public abstract void addLibraryHandles(Object library);
public abstract CallTarget parseNativeLibrary(String path, LLVMContext context) throws UnsatisfiedLinkError;
public abstract NativeLookupResult getNativeFunctionOrNull(String name);
public abstract static class WellKnownNativeFunctionNode extends LLVMNode {
public final Object execute(Object... args) throws ArityException, UnsupportedMessageException, UnsupportedTypeException {
return executeImpl(args);
}
protected abstract Object executeImpl(Object[] args) throws ArityException, UnsupportedMessageException, UnsupportedTypeException;
}
public abstract WellKnownNativeFunctionNode getWellKnownNativeFunction(String name, String signature);
public abstract Object getNativeFunction(String name, String signature);
public abstract Source getNativeSignatureSourceSkipStackArg(FunctionType type) throws UnsupportedNativeTypeException;
public abstract Object bindSignature(LLVMFunctionCode function, Source signatureSource);
public abstract Object bindSignature(long fnPtr, Source signatureSource);
protected TruffleFile locateInternalLibrary(LLVMContext context, String lib, Object reason) {
return LLVMContext.InternalLibraryLocator.INSTANCE.locateLibrary(context, lib, reason);
}
public static String getNativeLibrarySuffix() {
if (System.getProperty("os.name").toLowerCase().contains("mac")) {
return "dylib";
} else {
return "so";
}
}
public static String getNativeLibrarySuffixVersioned(int version) {
if (System.getProperty("os.name").toLowerCase().contains("mac")) {
return version + ".dylib";
} else {
return "so." + version;
}
}
}