xref: /openbsd/gnu/usr.bin/perl/lib/ExtUtils/typemap (revision eac174f2)
1# basic C types
2int			T_IV
3unsigned		T_UV
4unsigned int		T_UV
5long			T_IV
6unsigned long		T_UV
7short			T_IV
8unsigned short		T_UV
9char			T_CHAR
10unsigned char		T_U_CHAR
11char *			T_PV
12unsigned char *		T_PV
13const char *		T_PV
14caddr_t			T_PV
15wchar_t *		T_PV
16wchar_t			T_IV
17# bool_t is defined in <rpc/rpc.h>
18bool_t			T_IV
19size_t			T_UV
20ssize_t			T_IV
21time_t			T_NV
22unsigned long *		T_OPAQUEPTR
23char **			T_PACKEDARRAY
24void *			T_PTR
25Time_t *		T_PV
26SV *			T_SV
27
28# These are the backwards-compatibility AV*/HV* typemaps that
29# do not decrement refcounts. Locally override with
30# "AV*	T_AVREF_REFCOUNT_FIXED", "HV*	T_HVREF_REFCOUNT_FIXED",
31# "CV*	T_CVREF_REFCOUNT_FIXED", "SVREF	T_SVREF_REFCOUNT_FIXED",
32# to get the fixed versions.
33SVREF			T_SVREF
34CV *			T_CVREF
35AV *			T_AVREF
36HV *			T_HVREF
37
38IV			T_IV
39UV			T_UV
40NV                      T_NV
41I32			T_IV
42I16			T_IV
43I8			T_IV
44STRLEN			T_UV
45U32			T_U_LONG
46U16			T_U_SHORT
47U8			T_UV
48Result			T_U_CHAR
49Boolean			T_BOOL
50float                   T_FLOAT
51double			T_DOUBLE
52SysRet			T_SYSRET
53SysRetLong		T_SYSRET
54FILE *			T_STDIO
55PerlIO *		T_INOUT
56FileHandle		T_PTROBJ
57InputStream		T_IN
58InOutStream		T_INOUT
59OutputStream		T_OUT
60bool			T_BOOL
61
62#############################################################################
63INPUT
64T_SV
65	$var = $arg
66T_SVREF
67	STMT_START {
68		SV* const xsub_tmp_sv = $arg;
69		SvGETMAGIC(xsub_tmp_sv);
70		if (SvROK(xsub_tmp_sv)){
71		    $var = SvRV(xsub_tmp_sv);
72		}
73		else{
74		    Perl_croak_nocontext(\"%s: %s is not a reference\",
75				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
76				\"$var\");
77		}
78	} STMT_END
79T_SVREF_REFCOUNT_FIXED
80	STMT_START {
81		SV* const xsub_tmp_sv = $arg;
82		SvGETMAGIC(xsub_tmp_sv);
83		if (SvROK(xsub_tmp_sv)){
84		    $var = SvRV(xsub_tmp_sv);
85		}
86		else{
87		    Perl_croak_nocontext(\"%s: %s is not a reference\",
88				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
89				\"$var\");
90		}
91	} STMT_END
92T_AVREF
93	STMT_START {
94		SV* const xsub_tmp_sv = $arg;
95		SvGETMAGIC(xsub_tmp_sv);
96		if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVAV){
97		    $var = (AV*)SvRV(xsub_tmp_sv);
98		}
99		else{
100		    Perl_croak_nocontext(\"%s: %s is not an ARRAY reference\",
101				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
102				\"$var\");
103		}
104	} STMT_END
105T_AVREF_REFCOUNT_FIXED
106	STMT_START {
107		SV* const xsub_tmp_sv = $arg;
108		SvGETMAGIC(xsub_tmp_sv);
109		if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVAV){
110		    $var = (AV*)SvRV(xsub_tmp_sv);
111		}
112		else{
113		    Perl_croak_nocontext(\"%s: %s is not an ARRAY reference\",
114				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
115				\"$var\");
116		}
117	} STMT_END
118T_HVREF
119	STMT_START {
120		SV* const xsub_tmp_sv = $arg;
121		SvGETMAGIC(xsub_tmp_sv);
122		if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVHV){
123		    $var = (HV*)SvRV(xsub_tmp_sv);
124		}
125		else{
126		    Perl_croak_nocontext(\"%s: %s is not a HASH reference\",
127				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
128				\"$var\");
129		}
130	} STMT_END
131T_HVREF_REFCOUNT_FIXED
132	STMT_START {
133		SV* const xsub_tmp_sv = $arg;
134		SvGETMAGIC(xsub_tmp_sv);
135		if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVHV){
136		    $var = (HV*)SvRV(xsub_tmp_sv);
137		}
138		else{
139		    Perl_croak_nocontext(\"%s: %s is not a HASH reference\",
140				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
141				\"$var\");
142		}
143	} STMT_END
144T_CVREF
145	STMT_START {
146                HV *st;
147                GV *gvp;
148		SV * const xsub_tmp_sv = $arg;
149		SvGETMAGIC(xsub_tmp_sv);
150                $var = sv_2cv(xsub_tmp_sv, &st, &gvp, 0);
151		if (!$var) {
152		    Perl_croak_nocontext(\"%s: %s is not a CODE reference\",
153				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
154				\"$var\");
155		}
156	} STMT_END
157T_CVREF_REFCOUNT_FIXED
158	STMT_START {
159                HV *st;
160                GV *gvp;
161		SV * const xsub_tmp_sv = $arg;
162		SvGETMAGIC(xsub_tmp_sv);
163                $var = sv_2cv(xsub_tmp_sv, &st, &gvp, 0);
164		if (!$var) {
165		    Perl_croak_nocontext(\"%s: %s is not a CODE reference\",
166				${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
167				\"$var\");
168		}
169	} STMT_END
170T_SYSRET
171	$var NOT IMPLEMENTED
172T_UV
173	$var = ($type)SvUV($arg)
174T_IV
175	$var = ($type)SvIV($arg)
176T_INT
177	$var = (int)SvIV($arg)
178T_ENUM
179	$var = ($type)SvIV($arg)
180T_BOOL
181	$var = (bool)SvTRUE($arg)
182T_U_INT
183	$var = (unsigned int)SvUV($arg)
184T_SHORT
185	$var = (short)SvIV($arg)
186T_U_SHORT
187	$var = (unsigned short)SvUV($arg)
188T_LONG
189	$var = (long)SvIV($arg)
190T_U_LONG
191	$var = (unsigned long)SvUV($arg)
192T_CHAR
193	$var = (char)*SvPV_nolen($arg)
194T_U_CHAR
195	$var = (unsigned char)SvUV($arg)
196T_FLOAT
197	$var = (float)SvNV($arg)
198T_NV
199	$var = ($type)SvNV($arg)
200T_DOUBLE
201	$var = (double)SvNV($arg)
202T_PV
203	$var = ($type)SvPV_nolen($arg)
204T_PTR
205	$var = INT2PTR($type,SvIV($arg))
206T_PTRREF
207	if (SvROK($arg)) {
208	    IV tmp = SvIV((SV*)SvRV($arg));
209	    $var = INT2PTR($type,tmp);
210	}
211	else
212	    Perl_croak_nocontext(\"%s: %s is not a reference\",
213			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
214			\"$var\")
215T_REF_IV_REF
216	if (sv_isa($arg, \"${ntype}\")) {
217	    IV tmp = SvIV((SV*)SvRV($arg));
218	    $var = *INT2PTR($type *, tmp);
219	}
220	else {
221		const char* refstr = SvROK($arg) ? \"\" : SvOK($arg) ? \"scalar \" : \"undef\";
222	    Perl_croak_nocontext(\"%s: Expected %s to be of type %s; got %s%\" SVf \" instead\",
223			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
224			\"$var\", \"$ntype\",
225			refstr, $arg
226		);
227	}
228T_REF_IV_PTR
229	if (sv_isa($arg, \"${ntype}\")) {
230	    IV tmp = SvIV((SV*)SvRV($arg));
231	    $var = INT2PTR($type, tmp);
232	}
233	else {
234		const char* refstr = SvROK($arg) ? \"\" : SvOK($arg) ? \"scalar \" : \"undef\";
235	    Perl_croak_nocontext(\"%s: Expected %s to be of type %s; got %s%\" SVf \" instead\",
236			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
237			\"$var\", \"$ntype\",
238			refstr, $arg
239		);
240	}
241T_PTROBJ
242	if (SvROK($arg) && sv_derived_from($arg, \"${ntype}\")) {
243	    IV tmp = SvIV((SV*)SvRV($arg));
244	    $var = INT2PTR($type,tmp);
245	}
246	else {
247		const char* refstr = SvROK($arg) ? \"\" : SvOK($arg) ? \"scalar \" : \"undef\";
248	    Perl_croak_nocontext(\"%s: Expected %s to be of type %s; got %s%\" SVf \" instead\",
249			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
250			\"$var\", \"$ntype\",
251			refstr, $arg
252		);
253	}
254T_PTRDESC
255	if (sv_isa($arg, \"${ntype}\")) {
256	    IV tmp = SvIV((SV*)SvRV($arg));
257	    ${type}_desc = (\U${type}_DESC\E*) tmp;
258	    $var = ${type}_desc->ptr;
259	}
260	else {
261		const char* refstr = SvROK($arg) ? \"\" : SvOK($arg) ? \"scalar \" : \"undef\";
262	    Perl_croak_nocontext(\"%s: Expected %s to be of type %s; got %s%\" SVf \" instead\",
263			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
264			\"$var\", \"$ntype\",
265			refstr, $arg
266		);
267	}
268T_REFREF
269	if (SvROK($arg)) {
270	    IV tmp = SvIV((SV*)SvRV($arg));
271	    $var = *INT2PTR($type,tmp);
272	}
273	else
274	    Perl_croak_nocontext(\"%s: %s is not a reference\",
275			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
276			\"$var\")
277T_REFOBJ
278	if (sv_isa($arg, \"${ntype}\")) {
279	    IV tmp = SvIV((SV*)SvRV($arg));
280	    $var = *INT2PTR($type,tmp);
281	}
282	else {
283		const char* refstr = SvROK($arg) ? \"\" : SvOK($arg) ? \"scalar \" : \"undef\";
284	    Perl_croak_nocontext(\"%s: Expected %s to be of type %s; got %s%\" SVf \" instead\",
285			${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
286			\"$var\", \"$ntype\",
287			refstr, $arg
288		);
289	}
290T_OPAQUE
291	$var = *($type *)SvPV_nolen($arg)
292T_OPAQUEPTR
293	$var = ($type)SvPV_nolen($arg)
294T_PACKED
295	$var = XS_unpack_$ntype($arg)
296T_PACKEDARRAY
297	$var = XS_unpack_$ntype($arg)
298T_ARRAY
299	U32 ix_$var = $argoff;
300	$var = $ntype(items -= $argoff);
301	while (items--) {
302	    DO_ARRAY_ELEM;
303	    ix_$var++;
304	}
305        /* this is the number of elements in the array */
306        ix_$var -= $argoff
307T_STDIO
308	$var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
309T_IN
310	$var = IoIFP(sv_2io($arg))
311T_INOUT
312	$var = IoIFP(sv_2io($arg))
313T_OUT
314	$var = IoOFP(sv_2io($arg))
315#############################################################################
316OUTPUT
317T_SV
318	${ "$var" eq "RETVAL" ? \"$arg = $var;" : \"sv_setsv_mg($arg, $var);" }
319T_SVREF
320	$arg = newRV((SV*)$var);
321T_SVREF_REFCOUNT_FIXED
322	${ "$var" eq "RETVAL" ? \"$arg = newRV_noinc((SV*)$var);" : \"sv_setrv_noinc($arg, (SV*)$var);" }
323T_AVREF
324	$arg = newRV((SV*)$var);
325T_AVREF_REFCOUNT_FIXED
326	${ "$var" eq "RETVAL" ? \"$arg = newRV_noinc((SV*)$var);" : \"sv_setrv_noinc($arg, (SV*)$var);" }
327T_HVREF
328	$arg = newRV((SV*)$var);
329T_HVREF_REFCOUNT_FIXED
330	${ "$var" eq "RETVAL" ? \"$arg = newRV_noinc((SV*)$var);" : \"sv_setrv_noinc($arg, (SV*)$var);" }
331T_CVREF
332	$arg = newRV((SV*)$var);
333T_CVREF_REFCOUNT_FIXED
334	${ "$var" eq "RETVAL" ? \"$arg = newRV_noinc((SV*)$var);" : \"sv_setrv_noinc($arg, (SV*)$var);" }
335T_IV
336	sv_setiv($arg, (IV)$var);
337T_UV
338	sv_setuv($arg, (UV)$var);
339T_INT
340	sv_setiv($arg, (IV)$var);
341T_SYSRET
342	if ($var != -1) {
343	    if ($var == 0)
344		sv_setpvn($arg, "0 but true", 10);
345	    else
346		sv_setiv($arg, (IV)$var);
347	}
348T_ENUM
349	sv_setiv($arg, (IV)$var);
350T_BOOL
351	${"$var" eq "RETVAL" ? \"$arg = boolSV($var);" : \"sv_setsv($arg, boolSV($var));"}
352T_U_INT
353	sv_setuv($arg, (UV)$var);
354T_SHORT
355	sv_setiv($arg, (IV)$var);
356T_U_SHORT
357	sv_setuv($arg, (UV)$var);
358T_LONG
359	sv_setiv($arg, (IV)$var);
360T_U_LONG
361	sv_setuv($arg, (UV)$var);
362T_CHAR
363	sv_setpvn($arg, (char *)&$var, 1);
364T_U_CHAR
365	sv_setuv($arg, (UV)$var);
366T_FLOAT
367	sv_setnv($arg, (double)$var);
368T_NV
369	sv_setnv($arg, (NV)$var);
370T_DOUBLE
371	sv_setnv($arg, (double)$var);
372T_PV
373	sv_setpv((SV*)$arg, $var);
374T_PTR
375	sv_setiv($arg, PTR2IV($var));
376T_PTRREF
377	sv_setref_pv($arg, Nullch, (void*)$var);
378T_REF_IV_REF
379	sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
380T_REF_IV_PTR
381	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
382T_PTROBJ
383	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
384T_PTRDESC
385	sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
386T_REFREF
387	NOT_IMPLEMENTED
388T_REFOBJ
389	NOT IMPLEMENTED
390T_OPAQUE
391	sv_setpvn($arg, (char *)&$var, sizeof($var));
392T_OPAQUEPTR
393	sv_setpvn($arg, (char *)$var, sizeof(*$var));
394T_PACKED
395	XS_pack_$ntype($arg, $var);
396T_PACKEDARRAY
397	XS_pack_$ntype($arg, $var, count_$ntype);
398T_ARRAY
399        {
400	    U32 ix_$var;
401            SSize_t extend_size =
402                /* The weird way this is written is because g++ is dumb
403                 * enough to warn "comparison is always false" on something
404                 * like:
405                 *
406                 * sizeof(a) > sizeof(b) && a > B_t_MAX
407                 *
408                 * (where the LH condition is false)
409                 */
410                (size_$var > (sizeof(size_$var) > sizeof(SSize_t)
411                              ? SSize_t_MAX : size_$var))
412                ? -1 : (SSize_t)size_$var;
413	    EXTEND(SP, extend_size);
414	    for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
415		ST(ix_$var) = sv_newmortal();
416	DO_ARRAY_ELEM
417	    }
418        }
419T_STDIO
420	{
421	    GV *gv = (GV *)sv_newmortal();
422	    PerlIO *fp = PerlIO_importFILE($var,0);
423	    gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0);
424	    if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) ) {
425		SV *rv = newRV_inc((SV*)gv);
426		rv = sv_bless(rv, GvSTASH(gv));
427		${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);"
428		    : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"}
429	    }${"$var" ne "RETVAL" ? \"
430	    else
431		sv_setsv($arg, &PL_sv_undef);\n" : \""}
432	}
433T_IN
434	{
435	    GV *gv = (GV *)sv_newmortal();
436	    gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0);
437	    if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) ) {
438		SV *rv = newRV_inc((SV*)gv);
439		rv = sv_bless(rv, GvSTASH(gv));
440		${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);"
441		    : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"}
442	    }${"$var" ne "RETVAL" ? \"
443	    else
444		sv_setsv($arg, &PL_sv_undef);\n" : \""}
445	}
446T_INOUT
447	{
448	    GV *gv = (GV *)sv_newmortal();
449	    gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0);
450	    if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) ) {
451		SV *rv = newRV_inc((SV*)gv);
452		rv = sv_bless(rv, GvSTASH(gv));
453		${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);"
454		    : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"}
455	    }${"$var" ne "RETVAL" ? \"
456	    else
457		sv_setsv($arg, &PL_sv_undef);\n" : \""}
458	}
459T_OUT
460	{
461	    GV *gv = (GV *)sv_newmortal();
462	    gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0);
463	    if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) ) {
464		SV *rv = newRV_inc((SV*)gv);
465		rv = sv_bless(rv, GvSTASH(gv));
466		${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);"
467		    : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"}
468	    }${"$var" ne "RETVAL" ? \"
469	    else
470		sv_setsv($arg, &PL_sv_undef);\n" : \""}
471	}
472