#!./perl
{
my
(
$y
,
$z
);
{
my
$x
=
"foo"
;
$y
= \
$x
;
$z
= \
$x
;
}
ok(
ref
(
$y
) and
ref
(
$z
));
weaken(
$y
);
ok(
ref
(
$y
) and
ref
(
$z
));
undef
(
$z
);
ok(not(
defined
(
$y
) and
defined
(
$z
)));
undef
(
$y
);
ok(not(
defined
(
$y
) and
defined
(
$z
)));
}
{
my
$y
;
{
my
$x
=
"foo"
;
$y
= \
$x
;
}
ok(
ref
(
$y
));
weaken(
$y
);
ok(not
defined
$y
);
}
my
$flag
;
{
$flag
= 0;
{
my
$y
=
bless
{},
'Dest'
;
$y
->{Self} =
$y
;
$y
->{Flag} = \
$flag
;
weaken(
$y
->{Self});
ok(
ref
(
$y
) );
}
ok(
$flag
== 1 );
undef
$flag
;
}
{
$flag
= 0;
{
my
$y
=
bless
{},
'Dest'
;
my
$x
=
bless
{},
'Dest'
;
$x
->{Ref} =
$y
;
$y
->{Ref} =
$x
;
$x
->{Flag} = \
$flag
;
$y
->{Flag} = \
$flag
;
weaken(
$x
->{Ref});
}
ok(
$flag
== 2 );
}
{
my
(
$y
,
$z
);
{
my
$x
=
"foo"
;
$y
= \
$x
;
$z
= \
$x
;
}
weaken(
$y
);
undef
(
$y
);
ok(not
defined
$y
);
ok(
ref
(
$z
) );
}
{
$a
= 5;
ok(!isweak(
$a
));
$b
= \
$a
;
ok(!isweak(
$b
));
weaken(
$b
);
ok(isweak(
$b
));
$b
= \
$a
;
ok(!isweak(
$b
));
my
$x
= {};
weaken(
$x
->{Y} = \
$a
);
ok(isweak(
$x
->{Y}));
ok(!isweak(
$x
->{Z}));
}
{
my
(
$y
,
$z
);
{
my
$x
=
"foo"
;
$y
= \
$x
;
$z
= \
$x
;
}
weaken(
$y
);
ok(isweak(
$y
),
'$y is weak after weaken()'
);
is(
$$y
,
"foo"
,
'$y points at \"foo" after weaken()'
);
unweaken(
$y
);
is(
ref
$y
,
"SCALAR"
,
'$y is still a SCALAR ref after unweaken()'
);
ok(!isweak(
$y
),
'$y is not weak after unweaken()'
);
is(
$$y
,
"foo"
,
'$y points at \"foo" after unweaken()'
);
undef
$z
;
ok(
defined
$y
,
'$y still defined after undef $z'
);
}
SKIP: {
skip(
"Test does not work with perl < 5.8.3"
, 5)
if
$] < 5.008003;
skip(
"Test does not work with MAD"
, 5)
if
exists
$Config
{mad};
$a
=
eval
'\"hello"'
;
ok(
ref
(
$a
)) or
print
"# didn't get a ref from eval\n"
;
$b
=
$a
;
eval
{ weaken(
$b
) };
is($@,
""
);
ok(isweak(
$b
));
is(
$$b
,
"hello"
);
$a
=
""
;
ok(not
$b
) or diag(
"b did not go away"
);
}
sub
DESTROY {
${
$_
[0]{Flag}} ++;
}