예제 #1
0
  public EFun read_fun() throws IOException {
    final int tag = read1skip_version();
    if (tag == EExternal.funTag) {
      final int nFreeVars = read4BE();
      final EPID pid = read_pid();
      final EAtom module = read_atom();
      final long index = read_long();
      final long uniq = read_long();
      final EObject[] freeVars = new EObject[nFreeVars];
      for (int i = 0; i < nFreeVars; ++i) {
        freeVars[i] = read_any();
      }
      return EModuleManager.resolve(pid, module, (int) uniq, (int) index, freeVars);

    } else if (tag == EExternal.newFunTag) {
      @SuppressWarnings("unused")
      final int n = read4BE(); // size
      final int arity = read1();
      final byte[] md5 = new byte[16];
      readN(md5);
      final int index = read4BE();
      final int nFreeVars = read4BE();
      final EAtom module = read_atom();
      final long oldIndex = read_long();
      final long uniq = read_long();
      final EPID pid = read_pid();
      final EObject[] freeVars = new EObject[nFreeVars];
      for (int i = 0; i < nFreeVars; ++i) {
        freeVars[i] = read_any();
      }
      return EModuleManager.resolve(
          pid, module, new EBinary(md5), index, (int) uniq, (int) oldIndex, arity, freeVars);

    } else if (tag == EExternal.externalFunTag) {
      final EAtom module = read_atom();
      final EAtom function = read_atom();
      final int arity = (int) read_long();

      return EModuleManager.resolve(new FunID(module, function, arity));
    } else {
      throw new IOException("Wrong tag encountered, expected fun, got " + tag);
    }
  }