This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Provide support for types PVN and UNDEF in
[perl5.git] / lib / ExtUtils / typemap
CommitLineData
93a17b20 1# basic C types
85e6fe83 2int T_IV
3aa35033
GS
3unsigned T_UV
4unsigned int T_UV
a0d0e21e 5long T_IV
3aa35033 6unsigned long T_UV
85e6fe83 7short T_IV
3aa35033 8unsigned short T_UV
93a17b20 9char T_CHAR
85e6fe83 10unsigned char T_U_CHAR
a0d0e21e
LW
11char * T_PV
12unsigned char * T_PV
f8c11764 13const char * T_PV
a0d0e21e
LW
14caddr_t T_PV
15wchar_t * T_PV
16wchar_t T_IV
d2b7433c 17# bool_t is defined in <rpc/rpc.h>
a0d0e21e 18bool_t T_IV
12734836 19size_t T_UV
a0d0e21e
LW
20ssize_t T_IV
21time_t T_NV
93a17b20 22unsigned long * T_OPAQUEPTR
5abff6f9 23char ** T_PACKEDARRAY
93a17b20 24void * T_PTR
a0d0e21e 25Time_t * T_PV
2304df62 26SV * T_SV
a0d0e21e
LW
27SVREF T_SVREF
28AV * T_AVREF
29HV * T_HVREF
30CV * T_CVREF
93a17b20 31
a0d0e21e 32IV T_IV
0ca04487 33UV T_UV
f8c11764 34NV T_NV
85e6fe83
LW
35I32 T_IV
36I16 T_IV
37I8 T_IV
12734836 38STRLEN T_UV
93a17b20
LW
39U32 T_U_LONG
40U16 T_U_SHORT
3aa35033 41U8 T_UV
93a17b20 42Result T_U_CHAR
f8c11764
TJ
43Boolean T_BOOL
44float T_FLOAT
93a17b20 45double T_DOUBLE
2304df62 46SysRet T_SYSRET
a0d0e21e 47SysRetLong T_SYSRET
f7e7eb72
NIS
48FILE * T_STDIO
49PerlIO * T_INOUT
a0d0e21e
LW
50FileHandle T_PTROBJ
51InputStream T_IN
52InOutStream T_INOUT
53OutputStream T_OUT
1cc23d7f 54bool T_BOOL
93a17b20 55
8990e307
LW
56#############################################################################
57INPUT
2304df62 58T_SV
a0d0e21e
LW
59 $var = $arg
60T_SVREF
f8c11764 61 if (SvROK($arg))
a0d0e21e 62 $var = (SV*)SvRV($arg);
2304df62 63 else
f8c11764 64 Perl_croak(aTHX_ \"$var is not a reference\")
a0d0e21e 65T_AVREF
f8c11764 66 if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
2304df62
AD
67 $var = (AV*)SvRV($arg);
68 else
f8c11764 69 Perl_croak(aTHX_ \"$var is not an array reference\")
a0d0e21e 70T_HVREF
f8c11764 71 if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
2304df62
AD
72 $var = (HV*)SvRV($arg);
73 else
f8c11764 74 Perl_croak(aTHX_ \"$var is not a hash reference\")
a0d0e21e 75T_CVREF
f8c11764 76 if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV)
2304df62
AD
77 $var = (CV*)SvRV($arg);
78 else
f8c11764 79 Perl_croak(aTHX_ \"$var is not a code reference\")
2304df62
AD
80T_SYSRET
81 $var NOT IMPLEMENTED
3aa35033
GS
82T_UV
83 $var = ($type)SvUV($arg)
85e6fe83
LW
84T_IV
85 $var = ($type)SvIV($arg)
8990e307
LW
86T_INT
87 $var = (int)SvIV($arg)
88T_ENUM
89 $var = ($type)SvIV($arg)
1cc23d7f 90T_BOOL
f8c11764 91 $var = (bool)SvTRUE($arg)
8990e307 92T_U_INT
3aa35033 93 $var = (unsigned int)SvUV($arg)
8990e307
LW
94T_SHORT
95 $var = (short)SvIV($arg)
96T_U_SHORT
3aa35033 97 $var = (unsigned short)SvUV($arg)
8990e307
LW
98T_LONG
99 $var = (long)SvIV($arg)
100T_U_LONG
3aa35033 101 $var = (unsigned long)SvUV($arg)
8990e307 102T_CHAR
3521e4ee 103 $var = (char)*SvPV_nolen($arg)
8990e307 104T_U_CHAR
3aa35033 105 $var = (unsigned char)SvUV($arg)
8990e307
LW
106T_FLOAT
107 $var = (float)SvNV($arg)
85e6fe83
LW
108T_NV
109 $var = ($type)SvNV($arg)
8990e307 110T_DOUBLE
85e6fe83 111 $var = (double)SvNV($arg)
a0d0e21e 112T_PV
3521e4ee 113 $var = ($type)SvPV_nolen($arg)
8990e307 114T_PTR
56431972 115 $var = INT2PTR($type,SvIV($arg))
8990e307 116T_PTRREF
85e6fe83 117 if (SvROK($arg)) {
a0d0e21e 118 IV tmp = SvIV((SV*)SvRV($arg));
56431972 119 $var = INT2PTR($type,tmp);
85e6fe83 120 }
8990e307 121 else
32b48a68 122 Perl_croak(aTHX_ \"$var is not a reference\")
a0d0e21e 123T_REF_IV_REF
5abff6f9 124 if (sv_isa($arg, \"${ntype}\")) {
a0d0e21e 125 IV tmp = SvIV((SV*)SvRV($arg));
c725d115 126 $var = *INT2PTR($type *, tmp);
a0d0e21e
LW
127 }
128 else
32b48a68 129 Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
a0d0e21e 130T_REF_IV_PTR
f8c11764 131 if (sv_isa($arg, \"${ntype}\")) {
a0d0e21e 132 IV tmp = SvIV((SV*)SvRV($arg));
c725d115 133 $var = INT2PTR($type, tmp);
a0d0e21e
LW
134 }
135 else
32b48a68 136 Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
8990e307 137T_PTROBJ
55497cff 138 if (sv_derived_from($arg, \"${ntype}\")) {
a0d0e21e 139 IV tmp = SvIV((SV*)SvRV($arg));
56431972 140 $var = INT2PTR($type,tmp);
85e6fe83 141 }
8990e307 142 else
32b48a68 143 Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
8990e307
LW
144T_PTRDESC
145 if (sv_isa($arg, \"${ntype}\")) {
a0d0e21e 146 IV tmp = SvIV((SV*)SvRV($arg));
f7e7eb72 147 ${type}_desc = (\U${type}_DESC\E*) tmp;
8990e307
LW
148 $var = ${type}_desc->ptr;
149 }
150 else
32b48a68 151 Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
8990e307 152T_REFREF
85e6fe83 153 if (SvROK($arg)) {
a0d0e21e 154 IV tmp = SvIV((SV*)SvRV($arg));
56431972 155 $var = *INT2PTR($type,tmp);
85e6fe83 156 }
8990e307 157 else
32b48a68 158 Perl_croak(aTHX_ \"$var is not a reference\")
8990e307 159T_REFOBJ
85e6fe83 160 if (sv_isa($arg, \"${ntype}\")) {
a0d0e21e 161 IV tmp = SvIV((SV*)SvRV($arg));
56431972 162 $var = *INT2PTR($type,tmp);
85e6fe83 163 }
8990e307 164 else
32b48a68 165 Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
8990e307 166T_OPAQUE
3521e4ee 167 $var = *($type *)SvPV_nolen($arg)
8990e307 168T_OPAQUEPTR
3521e4ee 169 $var = ($type)SvPV_nolen($arg)
8990e307
LW
170T_PACKED
171 $var = XS_unpack_$ntype($arg)
172T_PACKEDARRAY
173 $var = XS_unpack_$ntype($arg)
174T_CALLBACK
175 $var = make_perl_cb_$type($arg)
176T_ARRAY
8990e307 177 U32 ix_$var = $argoff;
f8c11764 178 $var = $ntype(items -= $argoff);
8990e307
LW
179 while (items--) {
180 DO_ARRAY_ELEM;
f8c11764 181 ix_$var++;
8990e307 182 }
f8c11764
TJ
183 /* this is the number of elements in the array */
184 ix_$var -= $argoff
f7e7eb72
NIS
185T_STDIO
186 $var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
a0d0e21e
LW
187T_IN
188 $var = IoIFP(sv_2io($arg))
189T_INOUT
190 $var = IoIFP(sv_2io($arg))
191T_OUT
192 $var = IoOFP(sv_2io($arg))
8990e307
LW
193#############################################################################
194OUTPUT
2304df62
AD
195T_SV
196 $arg = $var;
a0d0e21e 197T_SVREF
2304df62 198 $arg = newRV((SV*)$var);
a0d0e21e 199T_AVREF
2304df62 200 $arg = newRV((SV*)$var);
a0d0e21e 201T_HVREF
2304df62 202 $arg = newRV((SV*)$var);
a0d0e21e 203T_CVREF
2304df62 204 $arg = newRV((SV*)$var);
85e6fe83 205T_IV
ef50df4b 206 sv_setiv($arg, (IV)$var);
3aa35033
GS
207T_UV
208 sv_setuv($arg, (UV)$var);
8990e307 209T_INT
ef50df4b 210 sv_setiv($arg, (IV)$var);
2304df62
AD
211T_SYSRET
212 if ($var != -1) {
213 if ($var == 0)
ef50df4b 214 sv_setpvn($arg, "0 but true", 10);
2304df62 215 else
ef50df4b 216 sv_setiv($arg, (IV)$var);
2304df62 217 }
8990e307 218T_ENUM
ef50df4b 219 sv_setiv($arg, (IV)$var);
1cc23d7f 220T_BOOL
54310121 221 $arg = boolSV($var);
8990e307 222T_U_INT
3aa35033 223 sv_setuv($arg, (UV)$var);
8990e307 224T_SHORT
ef50df4b 225 sv_setiv($arg, (IV)$var);
8990e307 226T_U_SHORT
3aa35033 227 sv_setuv($arg, (UV)$var);
8990e307 228T_LONG
ef50df4b 229 sv_setiv($arg, (IV)$var);
8990e307 230T_U_LONG
3aa35033 231 sv_setuv($arg, (UV)$var);
8990e307 232T_CHAR
ef50df4b 233 sv_setpvn($arg, (char *)&$var, 1);
8990e307 234T_U_CHAR
3aa35033 235 sv_setuv($arg, (UV)$var);
8990e307 236T_FLOAT
ef50df4b 237 sv_setnv($arg, (double)$var);
85e6fe83 238T_NV
59f3815a 239 sv_setnv($arg, (NV)$var);
8990e307 240T_DOUBLE
ef50df4b 241 sv_setnv($arg, (double)$var);
a0d0e21e 242T_PV
ef50df4b 243 sv_setpv((SV*)$arg, $var);
8990e307 244T_PTR
46e87256 245 sv_setiv($arg, PTR2IV($var));
8990e307 246T_PTRREF
a0d0e21e
LW
247 sv_setref_pv($arg, Nullch, (void*)$var);
248T_REF_IV_REF
249 sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
250T_REF_IV_PTR
251 sv_setref_pv($arg, \"${ntype}\", (void*)$var);
8990e307 252T_PTROBJ
a0d0e21e 253 sv_setref_pv($arg, \"${ntype}\", (void*)$var);
8990e307 254T_PTRDESC
a0d0e21e 255 sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
8990e307 256T_REFREF
f8c11764 257 NOT_IMPLEMENTED
8990e307
LW
258T_REFOBJ
259 NOT IMPLEMENTED
260T_OPAQUE
ef50df4b 261 sv_setpvn($arg, (char *)&$var, sizeof($var));
8990e307 262T_OPAQUEPTR
4bd3d083 263 sv_setpvn($arg, (char *)$var, sizeof(*$var));
8990e307
LW
264T_PACKED
265 XS_pack_$ntype($arg, $var);
266T_PACKEDARRAY
267 XS_pack_$ntype($arg, $var, count_$ntype);
268T_DATAUNIT
ef50df4b 269 sv_setpvn($arg, $var.chp(), $var.size());
8990e307 270T_CALLBACK
ef50df4b 271 sv_setpvn($arg, $var.context.value().chp(),
8990e307
LW
272 $var.context.value().size());
273T_ARRAY
f8c11764
TJ
274 {
275 U32 ix_$var;
276 EXTEND(SP,size_$var);
277 for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
8990e307
LW
278 ST(ix_$var) = sv_newmortal();
279 DO_ARRAY_ELEM
f8c11764
TJ
280 }
281 }
f7e7eb72
NIS
282T_STDIO
283 {
284 GV *gv = newGVgen("$Package");
285 PerlIO *fp = PerlIO_importFILE($var,0);
286 if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
287 sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
288 else
289 $arg = &PL_sv_undef;
290 }
a0d0e21e
LW
291T_IN
292 {
293 GV *gv = newGVgen("$Package");
c07a80fd 294 if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
ef50df4b 295 sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
a0d0e21e 296 else
6b88bc9c 297 $arg = &PL_sv_undef;
a0d0e21e
LW
298 }
299T_INOUT
300 {
301 GV *gv = newGVgen("$Package");
c07a80fd 302 if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
ef50df4b 303 sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
a0d0e21e 304 else
6b88bc9c 305 $arg = &PL_sv_undef;
a0d0e21e
LW
306 }
307T_OUT
308 {
309 GV *gv = newGVgen("$Package");
c07a80fd 310 if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
ef50df4b 311 sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
a0d0e21e 312 else
6b88bc9c 313 $arg = &PL_sv_undef;
a0d0e21e 314 }