pub(crate) fn unpack(&self) -> RV {
        if !self.is_packed_value() {
            let info = self.rvalue();
            match info.kind() {
                ObjKind::INVALID => panic!(
                    "Invalid rvalue. (maybe GC problem) {:?} {:#?}",
                    &*info as *const RValue, info
                ),
                ObjKind::FLOAT => RV::Float(info.float()),
                _ => RV::Object(info),
            }
        } else if let Some(i) = self.as_fixnum() {
            RV::Integer(i)
        } else if let Some(f) = self.as_flonum() {
            RV::Float(f)
        } else if self.is_packed_symbol() {
            RV::Symbol(self.as_packed_symbol())
        } else {
            match self.get() {
                NIL_VALUE => RV::Nil,
                TRUE_VALUE => RV::True,
                FALSE_VALUE => RV::False,
                UNINITIALIZED => RV::Uninitialized,
                _ => unreachable!("Illegal packed value. {:x}", self.0),
            }
        }
    }
Convert `self` to `RV`.

`RV` is a struct for convenience in handling `Value`.
Both of packed integer and ObjKind::Integer are converted to RV::Integer.
Packed float and ObjKind::Float are converted to RV::Float.
ruruby/src/value/value.rs