+# The type checking code in B has always been identical for all SV types,
+# irrespective of whether the action is actually defined on that SV.
+# We should fix this
+void
+IVX(sv)
+ B::SV sv
+ ALIAS:
+ B::IV::IVX = IV_ivx_ix
+ B::IV::UVX = IV_uvx_ix
+ B::NV::NVX = NV_nvx_ix
+ B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
+ B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
+ B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
+ B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
+ B::PV::CUR = PV_cur_ix
+ B::PV::LEN = PV_len_ix
+ B::PVMG::SvSTASH = PVMG_stash_ix
+ B::PVLV::TARGOFF = PVLV_targoff_ix
+ B::PVLV::TARGLEN = PVLV_targlen_ix
+ B::PVLV::TARG = PVLV_targ_ix
+ B::PVLV::TYPE = PVLV_type_ix
+ B::GV::STASH = PVGV_stash_ix
+ B::GV::GvFLAGS = PVGV_flags_ix
+ B::BM::USEFUL = PVBM_useful_ix
+ B::BM::PREVIOUS = PVBM_previous_ix
+ B::BM::RARE = PVBM_rare_ix
+ B::IO::LINES = PVIO_lines_ix
+ B::IO::PAGE = PVIO_page_ix
+ B::IO::PAGE_LEN = PVIO_page_len_ix
+ B::IO::LINES_LEFT = PVIO_lines_left_ix
+ B::IO::TOP_NAME = PVIO_top_name_ix
+ B::IO::TOP_GV = PVIO_top_gv_ix
+ B::IO::FMT_NAME = PVIO_fmt_name_ix
+ B::IO::FMT_GV = PVIO_fmt_gv_ix
+ B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
+ B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
+ B::IO::IoTYPE = PVIO_type_ix
+ B::IO::IoFLAGS = PVIO_flags_ix
+ B::AV::MAX = PVAV_max_ix
+ B::FM::LINES = PVFM_lines_ix
+ B::CV::STASH = PVCV_stash_ix
+ B::CV::GV = PVCV_gv_ix
+ B::CV::FILE = PVCV_file_ix
+ B::CV::DEPTH = PVCV_depth_ix
+ B::CV::PADLIST = PVCV_padlist_ix
+ B::CV::OUTSIDE = PVCV_outside_ix
+ B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
+ B::CV::CvFLAGS = PVCV_flags_ix
+ B::HV::MAX = PVHV_max_ix
+ B::HV::KEYS = PVHV_keys_ix
+ PREINIT:
+ char *ptr;
+ SV *ret;
+ PPCODE:
+ ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
+ switch ((U8)(ix >> 16)) {
+ case (U8)(sv_SVp >> 16):
+ ret = make_sv_object(aTHX_ *((SV **)ptr));
+ break;
+ case (U8)(sv_IVp >> 16):
+ ret = sv_2mortal(newSViv(*((IV *)ptr)));
+ break;
+ case (U8)(sv_UVp >> 16):
+ ret = sv_2mortal(newSVuv(*((UV *)ptr)));
+ break;
+ case (U8)(sv_STRLENp >> 16):
+ ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
+ break;
+ case (U8)(sv_U32p >> 16):
+ ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
+ break;
+ case (U8)(sv_U8p >> 16):
+ ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
+ break;
+ case (U8)(sv_char_pp >> 16):
+ ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
+ break;
+ case (U8)(sv_NVp >> 16):
+ ret = sv_2mortal(newSVnv(*((NV *)ptr)));
+ break;
+ case (U8)(sv_char_p >> 16):
+ ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
+ break;
+ case (U8)(sv_SSize_tp >> 16):
+ ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
+ break;
+ case (U8)(sv_I32p >> 16):
+ ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
+ break;
+ case (U8)(sv_U16p >> 16):
+ ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
+ break;
+ }
+ ST(0) = ret;
+ XSRETURN(1);