示例#1
0
  @BIF
  public static EObject hibernate(EProc self, EObject a1, EObject a2, EObject a3) {

    EAtom m = a1.testAtom();
    EAtom f = a2.testAtom();
    ESeq a = a3.testSeq();

    if (m == null || f == null || a == null) {
      throw ERT.badarg(a1, a2, a3);
    }

    int arity = a.length();

    EFun target = EModuleManager.resolve(new FunID(m, f, arity));

    if (target == null) {
      throw new ErlangUndefined(m, f, new ESmall(arity));
    }

    self.tail = target;
    a = a.reverse();
    switch (arity) {
      default:
        throw new NotImplemented("hibernate w/" + arity + " args");
      case 7:
        self.arg6 = a.head();
        a = a.tail();
      case 6:
        self.arg5 = a.head();
        a = a.tail();
      case 5:
        self.arg4 = a.head();
        a = a.tail();
      case 4:
        self.arg3 = a.head();
        a = a.tail();
      case 3:
        self.arg2 = a.head();
        a = a.tail();
      case 2:
        self.arg1 = a.head();
        a = a.tail();
      case 1:
        self.arg0 = a.head(); // a = a.tail();
      case 0:
    }

    throw ErjangHibernateException.INSTANCE;
  }