summaryrefslogtreecommitdiff
path: root/ext/Devel/PPPort/parts/inc/shared_pv
blob: 8fbf4c8dbf8ebc24d0d623a5edeb6b535aac3655 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
################################################################################
##
##  $Revision: 1 $
##  $Author: mhx $
##  $Date: 2007/08/19 19:38:17 +0200 $
##
################################################################################
##
##  Version 3.x, Copyright (C) 2004-2007, Marcus Holland-Moritz.
##  Version 2.x, Copyright (C) 2001, Paul Marquess.
##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
##
##  This program is free software; you can redistribute it and/or
##  modify it under the same terms as Perl itself.
##
################################################################################

=provides

newSVpvn_share
__UNDEFINED__

=implementation

#ifndef newSVpvn_share

#if { NEED newSVpvn_share }

SV *
newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
{
  SV *sv;
  if (len < 0)
    len = -len;
  if (!hash)
    PERL_HASH(hash, src, len);
  sv = newSVpvn((char *) src, len);
  sv_upgrade(sv, SVt_PVIV);
  SvIVX(sv) = hash;
  SvREADONLY_on(sv);
  SvPOK_on(sv);
  return sv;
}

#endif

#endif

__UNDEFINED__ SvSHARED_HASH(sv) (0 + SvUVX(sv))

=xsinit

#define NEED_newSVpvn_share

=xsubs

int
newSVpvn_share()
	PREINIT:
		const char *s;
		SV *sv;
		STRLEN len;
		U32 hash;
	CODE:
		RETVAL = 0;
		s = "mhx";
		len = 3;
		PERL_HASH(hash, s, len);
		sv = newSVpvn_share(s, len, 0);
		s = 0;
		RETVAL += strEQ(SvPV_nolen_const(sv), "mhx");
		RETVAL += SvCUR(sv) == len;
		RETVAL += SvSHARED_HASH(sv) == hash;
		SvREFCNT_dec(sv);
		s = "foobar";
		len = 6;
		PERL_HASH(hash, s, len);
		sv = newSVpvn_share(s, -len, hash);
		s = 0;
		RETVAL += strEQ(SvPV_nolen_const(sv), "foobar");
		RETVAL += SvCUR(sv) == len;
		RETVAL += SvSHARED_HASH(sv) == hash;
		SvREFCNT_dec(sv);
	OUTPUT:
		RETVAL


=tests plan => 1

ok(&Devel::PPPort::newSVpvn_share(), 6);