Example #1
0
  public static CallAdapter createFor(
      CallType callType, MethAddr methAddr, Operand args[], Operand closure) {
    CallSite callSite = getCallSiteFor(callType, methAddr);

    if (callType == CallType.UNKNOWN)
      return new AttrAssignCallAdapter(callSite, methAddr.getName(), args);
    if (containsSplat(args)) return new ManyArgBlockSplatCallAdapter(callSite, args, closure);

    switch (args.length) {
      case 0:
        if (closure != null) return new NoArgBlockOperandCallAdapter(callSite, args, closure);

        return new NoArgNoBlockOperandCallAdapter(callSite, args);
      case 1:
        if (isFixnum(args) && closure == null) {
          return new OneArgNoBlockFixnumCallAdapter(callSite, args);
        }
        if (isConstant(args) && closure == null)
          return new OneArgNoBlockConstantCallAdapter(callSite, args);

        if (closure != null) return new OneArgBlockOperandCallAdapter(callSite, args, closure);

        return new OneArgNoBlockOperandCallAdapter(callSite, args);
      case 2:
        if (isConstant(args) && closure == null)
          return new TwoArgNoBlockConstantCallAdapter(callSite, args);

        if (closure != null) return new TwoArgBlockOperandCallAdapter(callSite, args, closure);

        return new TwoArgNoBlockOperandCallAdapter(callSite, args);
      case 3:
        if (isConstant(args) && closure == null)
          return new ThreeArgNoBlockConstantCallAdapter(callSite, args);

        if (closure != null) return new ThreeArgBlockOperandCallAdapter(callSite, args, closure);

        return new ThreeArgNoBlockOperandCallAdapter(callSite, args);
      case 4:
        if (isConstant(args) && closure == null)
          return new FourArgNoBlockConstantCallAdapter(callSite, args);

        if (closure == null) return new FourArgNoBlockOperandCallAdapter(callSite, args);
    }

    return new ManyArgBlockOperandCallAdapter(callSite, args, closure);
  }
Example #2
0
  private static CallSite getCallSiteFor(CallType callType, MethAddr methAddr) {
    assert callType != null : "Calltype should never be null";

    String name = methAddr.toString();

    switch (callType) {
      case NORMAL:
        return MethodIndex.getCallSite(name);
      case FUNCTIONAL:
        return MethodIndex.getFunctionalCallSite(name);
      case VARIABLE:
        return MethodIndex.getVariableCallSite(name);
      case SUPER:
        return MethodIndex.getSuperCallSite();
      case UNKNOWN:
    }

    return null; // fallthrough for unknown
  }