def unpack(self, fio):
        """
        Read the ConstantPool from the file-like object `fio`.

        .. note::

            Advanced usage only. You will typically never need to call this
            method as it will be called for you when loading a ClassFile.

        :param fio: Any file-like object providing `read()`
        """
        # Reads in the ConstantPool (constant_pool in the JVM Spec)
        constant_pool_count = unpack('>H', fio.read(2))[0]

        # Pull this locally so CPython doesn't do a lookup each time.
        read = fio.read

        while constant_pool_count > 1:
            constant_pool_count -= 1
            # The 1-byte prefix identifies the type of constant.
            tag = ord(read(1))

            if tag == 1:
                # CONSTANT_Utf8_info, a length prefixed UTF-8-ish string.
                # Only attempt to properly decode the MUTF8 if it fails
                # regular UTF8 decoding, which overs huge time savings over
                # large JARs.
                utf8_str = read(unpack('>H', read(2))[0])
                try:
                    utf8_str = utf8_str.decode('utf8')
                except UnicodeDecodeError:
                    utf8_str = decode_modified_utf8(utf8_str)
                self.append((tag, utf8_str))
            else:
                # Every other constant type is trivial.
                fmt, size = _constant_fmts[tag]
                self.append((tag, *unpack(fmt, read(size))))
                if tag == 5 or tag == 6:
                    # LONG (5) and DOUBLE (6) count as two entries in the
                    # pool.
                    self.append(None)
                    constant_pool_count -= 1
Read the ConstantPool from the file-like object `fio`.

        .. note::

            Advanced usage only. You will typically never need to call this
            method as it will be called for you when loading a ClassFile.

        :param fio: Any file-like object providing `read()`