Package st.gravel.support.jvm.runtime

Source Code of st.gravel.support.jvm.runtime.SmalltalkCallSite

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);
  }
}
TOP

Related Classes of st.gravel.support.jvm.runtime.SmalltalkCallSite

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.