public abstract class DynamicDispatchLibrary extends Library
ExportLibrary annotation. To allow such types to dynamically dispatch to exports the
dynamic dispatch library can be exported instead. By exporting dynamic dispatch the export target
can be chosen dynamically.
The dynamic dispatch library requires to implement the dispatch method. The dispatch method
returns the target exports class that this receiver should dispatch to. If it returns
null then the type will dispatch to the library default exports. The implementation
of the dispatch must be stable for a single receiver value. For example it is not allowed to
change the dispatch target for a receiver instance. If the dispatch target was changed while the
receiver was used by a library then an AssertionError will be thrown.
@ExportLibrary(DynamicDispatchLibrary.class)
static final class DispatchObject {
final Object data;
final Class> dispatchTarget;
DispatchObject(Object data, Class> dispatchTarget) {
this.data = data;
this.dispatchTarget = dispatchTarget;
}
@ExportMessage
Class> dispatch() {
return dispatchTarget;
}
}
@GenerateLibrary
public abstract static class ArrayLibrary extends Library {
public boolean isArray(Object receiver) {
return false;
}
public abstract int read(Object receiver, int index);
}
@ExportLibrary(value = ArrayLibrary.class, receiverType = DispatchObject.class)
static final class DispatchedBufferArray {
@ExportMessage
static boolean isArray(DispatchObject o) {
return true;
}
@ExportMessage
static int read(DispatchObject o, int index) {
return ((int[]) o.data)[index];
}
}
public static void main(String[] args) {
ArrayLibrary arrays = LibraryFactory.resolve(ArrayLibrary.class).getUncached();
assert 42 == arrays.read(new DispatchObject(new int[]{42}, DispatchedBufferArray.class), 0);
}
Node.Child, Node.Children| Modifier | Constructor and Description |
|---|---|
protected |
DynamicDispatchLibrary()
Constructor for generated subclasses.
|
| Modifier and Type | Method and Description |
|---|---|
abstract Object |
cast(Object receiver)
Cast the object receiver type to the dispatched type.
|
Class<?> |
dispatch(Object receiver)
Returns a class that
exports at least one library with an explicit
receiver. |
static LibraryFactory<DynamicDispatchLibrary> |
getFactory()
Returns the library factory for
DynamicDispatchLibrary. |
accept, adoptChildren, atomic, atomic, copy, deepCopy, getChildren, getCost, getDebugProperties, getDescription, getEncapsulatingSourceSection, getLock, getParent, getRootNode, getSourceSection, insert, insert, isAdoptable, isSafelyReplaceableBy, notifyInserted, onReplace, replace, replace, reportPolymorphicSpecialize, toStringprotected DynamicDispatchLibrary()
public Class<?> dispatch(Object receiver)
exports at least one library with an explicit
receiver. Returns null to indicate that the default dispatch of the library
should be used.public abstract Object cast(Object receiver)
public static LibraryFactory<DynamicDispatchLibrary> getFactory()
DynamicDispatchLibrary.