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