diff options
Diffstat (limited to 'ext/typemap')
-rw-r--r-- | ext/typemap | 155 |
1 files changed, 106 insertions, 49 deletions
diff --git a/ext/typemap b/ext/typemap index 1d0c9baef3..98493e7c04 100644 --- a/ext/typemap +++ b/ext/typemap @@ -3,24 +3,32 @@ int T_IV unsigned T_IV unsigned int T_IV -long T_NV -unsigned long T_NV +long T_IV +unsigned long T_IV short T_IV unsigned short T_IV char T_CHAR unsigned char T_U_CHAR -char * T_STRING -unsigned char * T_STRING -caddr_t T_STRING +char * T_PV +unsigned char * T_PV +caddr_t T_PV +wchar_t * T_PV +wchar_t T_IV +bool_t T_IV +size_t T_IV +ssize_t T_IV +time_t T_NV unsigned long * T_OPAQUEPTR char ** T_PACKED void * T_PTR +Time_t * T_PV SV * T_SV -SV * T_SVOBJ -AV * T_AVOBJ -HV * T_HVOBJ -CV * T_CVOBJ +SVREF T_SVREF +AV * T_AVREF +HV * T_HVREF +CV * T_CVREF +IV T_IV I32 T_IV I16 T_IV I8 T_IV @@ -28,30 +36,36 @@ U32 T_U_LONG U16 T_U_SHORT U8 T_IV Result T_U_CHAR -Boolean T_U_CHAR +Boolean T_IV double T_DOUBLE SysRet T_SYSRET +SysRetLong T_SYSRET +FILE * T_IN +FileHandle T_PTROBJ +InputStream T_IN +InOutStream T_INOUT +OutputStream T_OUT ############################################################################# INPUT T_SV - $var = $arg; -T_SVOBJ + $var = $arg +T_SVREF if (sv_isa($arg, \"${ntype}\")) - $var = (AV*)SvRV($arg); + $var = (SV*)SvRV($arg); else croak(\"$var is not of type ${ntype}\") -T_AVOBJ +T_AVREF if (sv_isa($arg, \"${ntype}\")) $var = (AV*)SvRV($arg); else croak(\"$var is not of type ${ntype}\") -T_HVOBJ +T_HVREF if (sv_isa($arg, \"${ntype}\")) $var = (HV*)SvRV($arg); else croak(\"$var is not of type ${ntype}\") -T_CVOBJ +T_CVREF if (sv_isa($arg, \"${ntype}\")) $var = (CV*)SvRV($arg); else @@ -84,30 +98,41 @@ T_NV $var = ($type)SvNV($arg) T_DOUBLE $var = (double)SvNV($arg) -T_STRING - $var = SvPV($arg,na) +T_PV + $var = ($type)SvPV($arg,na) T_PTR - $var = ($type)(unsigned long)SvNV($arg) + $var = ($type)SvIV($arg) T_PTRREF if (SvROK($arg)) { - unsigned long tmp; - tmp = (unsigned long)SvNV((SV*)SvRV($arg)); + IV tmp = SvIV((SV*)SvRV($arg)); $var = ($type) tmp; } else croak(\"$var is not a reference\") +T_REF_IV_REF + if (sv_isa($arg, \"${type}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = *($type *) tmp; + } + else + croak(\"$var is not of type ${ntype}\") +T_REF_IV_PTR + if (sv_isa($arg, \"${type}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = ($type) tmp; + } + else + croak(\"$var is not of type ${ntype}\") T_PTROBJ if (sv_isa($arg, \"${ntype}\")) { - unsigned long tmp; - tmp = (unsigned long)SvNV((SV*)SvRV($arg)); + IV tmp = SvIV((SV*)SvRV($arg)); $var = ($type) tmp; } else croak(\"$var is not of type ${ntype}\") T_PTRDESC if (sv_isa($arg, \"${ntype}\")) { - unsigned long tmp; - tmp = (unsigned long)SvNV((SV*)SvRV($arg)); + IV tmp = SvIV((SV*)SvRV($arg)); ${type}_desc = (\U${type}_DESC\E*) tmp; $var = ${type}_desc->ptr; } @@ -115,16 +140,14 @@ T_PTRDESC croak(\"$var is not of type ${ntype}\") T_REFREF if (SvROK($arg)) { - unsigned long tmp; - tmp = (unsigned long)SvNV((SV*)SvRV($arg)); + IV tmp = SvIV((SV*)SvRV($arg)); $var = *($type) tmp; } else croak(\"$var is not a reference\") T_REFOBJ if (sv_isa($arg, \"${ntype}\")) { - unsigned long tmp; - tmp = (unsigned long)SvNV((SV*)SvRV($arg)); + IV tmp = SvIV((SV*)SvRV($arg)); $var = *($type) tmp; } else @@ -145,61 +168,71 @@ T_ARRAY while (items--) { DO_ARRAY_ELEM; } +T_IN + $var = IoIFP(sv_2io($arg)) +T_INOUT + $var = IoIFP(sv_2io($arg)) +T_OUT + $var = IoOFP(sv_2io($arg)) ############################################################################# OUTPUT T_SV $arg = $var; -T_SVOBJ +T_SVREF $arg = newRV((SV*)$var); -T_AVOBJ +T_AVREF $arg = newRV((SV*)$var); -T_HVOBJ +T_HVREF $arg = newRV((SV*)$var); -T_CVOBJ +T_CVREF $arg = newRV((SV*)$var); T_IV - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_INT - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_SYSRET if ($var != -1) { if ($var == 0) sv_setpvn($arg, "0 but true", 10); else - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); } T_ENUM - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_U_INT - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_SHORT - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_U_SHORT - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_LONG - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_U_LONG - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_CHAR sv_setpvn($arg, (char *)&$var, 1); T_U_CHAR - sv_setiv($arg, (I32)$var); + sv_setiv($arg, (IV)$var); T_FLOAT sv_setnv($arg, (double)$var); T_NV sv_setnv($arg, (double)$var); T_DOUBLE sv_setnv($arg, (double)$var); -T_STRING - sv_setpv($arg, $var); +T_PV + sv_setpv((SV*)$arg, $var); T_PTR - sv_setnv($arg, (double)(unsigned long)$var); + sv_setiv($arg, (IV)$var); T_PTRREF - sv_setptrref($arg, $var); + sv_setref_pv($arg, Nullch, (void*)$var); +T_REF_IV_REF + sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var)); +T_REF_IV_PTR + sv_setref_pv($arg, \"${ntype}\", (void*)$var); T_PTROBJ - sv_setptrobj($arg, $var, \"${ntype}\"); + sv_setref_pv($arg, \"${ntype}\", (void*)$var); T_PTRDESC - sv_setptrobj($arg, (void*)new\U${type}_DESC\E($var), \"${ntype}\"); + sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var)); T_REFREF sv_setrefref($arg, \"${ntype}\", XS_service_$ntype, ($var ? (void*)new $ntype($var) : 0)); @@ -225,3 +258,27 @@ T_ARRAY DO_ARRAY_ELEM } sp += $var.size - 1; +T_IN + { + GV *gv = newGVgen("$Package"); + if ( do_open(gv, "<&", 2, $var) ) + sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))); + else + $arg = &sv_undef; + } +T_INOUT + { + GV *gv = newGVgen("$Package"); + if ( do_open(gv, "+<&", 3, $var) ) + sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))); + else + $arg = &sv_undef; + } +T_OUT + { + GV *gv = newGVgen("$Package"); + if ( do_open(gv, "+>&", 3, $var) ) + sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))); + else + $arg = &sv_undef; + } |