package st.gravel.support.jvm.runtime; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles.Lookup; import java.lang.invoke.MethodType; @SuppressWarnings("rawtypes") public class SmalltalkCallSite extends PolymorphicCallSite { public static BaseCallSite newInstance(Lookup lookup, MethodType type, String selector) { BaseCallSite callsite = new SmalltalkCallSite(lookup, type, selector); BaseCallSite.register(callsite); return callsite; } private SmalltalkCallSite(Lookup lookup, MethodType type, String selector) { super(lookup, type, selector); } protected MethodHandle findMethodForNil() { MethodHandle methodHandle = ImageBootstrapper.systemMapping .methodHandleForNil_(selector); if (methodHandle == null) { return createDNUHandleForNil(); } MethodHandle castHandle = methodHandle.asType(type); return castHandle; } protected MethodHandle findMethod(final Class receiverClass) { MethodHandle methodHandle = ImageBootstrapper.systemMapping .methodHandleFor_methodName_(receiverClass, selector); if (methodHandle == null) { methodHandle = createDNUHandle(receiverClass); } MethodHandle castHandle = methodHandle.asType(type); return castHandle; } public MethodHandle createDNUHandleForNil() { MethodHandle dnuHandle = ImageBootstrapper.systemMapping .methodHandleForNil_("doesNotUnderstand_arguments_"); return wrapDNUHandle(dnuHandle); } public MethodHandle createDNUHandle(final Class receiverClass) { MethodHandle dnuHandle = ImageBootstrapper.systemMapping .methodHandleFor_methodName_(receiverClass, "doesNotUnderstand_arguments_"); return wrapDNUHandle(dnuHandle); } }