UNSTABLE_DOLLARAT => ( "$]" < 5.013002 ) ? 1 : 0,
- DBICTEST => $INC{"DBICTest/Util.pm"} ? 1 : 0,
-
- # During 5.13 dev cycle HELEMs started to leak on copy
- # add an escape for these perls ON SMOKERS - a user will still get death
- PEEPEENESS => ( eval { DBICTest::RunMode->is_smoker } && ( "$]" >= 5.013005 and "$]" <= 5.013006) ),
-
( map
#
# the "DBIC_" prefix below is crucial - this is what makes CI pick up
refdesc refcount hrefaddr
scope_guard detected_reinvoked_destructor
is_exception dbic_internal_try
- quote_sub qsub perlstring serialize deep_clone
+ quote_sub qsub perlstring serialize deep_clone dump_value
+ parent_dir mkdir_p
UNRESOLVABLE_CONDITION
);
nfreeze($_[0]);
}
+my $dd_obj;
+sub dump_value ($) {
+ local $Data::Dumper::Indent = 1
+ unless defined $Data::Dumper::Indent;
+
+ my $dump_str = (
+ $dd_obj
+ ||=
+ do {
+ require Data::Dumper;
+ my $d = Data::Dumper->new([])
+ ->Purity(0)
+ ->Pad('')
+ ->Useqq(1)
+ ->Terse(1)
+ ->Freezer('')
+ ->Quotekeys(0)
+ ->Bless('bless')
+ ->Pair(' => ')
+ ->Sortkeys(1)
+ ->Deparse(1)
+ ;
+
+ $d->Sparseseen(1) if modver_gt_or_eq (
+ 'Data::Dumper', '2.136'
+ );
+
+ $d;
+ }
+ )->Values([$_[0]])->Dump;
+
+ $dd_obj->Reset->Values([]);
+
+ $dump_str;
+}
+
sub scope_guard (&) {
croak 'Calling scope_guard() in void context makes no sense'
if ! defined wantarray;
eval {
$_[0]->[0]->();
1;
- } or do {
- Carp::cluck "Execution of scope guard $_[0] resulted in the non-trappable exception:\n\n$@";
- };
+ }
+ or
+ Carp::cluck(
+ "Execution of scope guard $_[0] resulted in the non-trappable exception:\n\n$@"
+ );
}
}
my ($not_blank, $suberror);
{
+ local $SIG{__DIE__} if $SIG{__DIE__};
local $@;
eval {
# The ne() here is deliberate - a plain length($e), or worse "$e" ne
unless $callstack_state->{in_internal_try};
# always unset - someone may have snuck it in
- local $SIG{__DIE__}
- if $SIG{__DIE__};
-
+ local $SIG{__DIE__} if $SIG{__DIE__};
if( $wantarray ) {
@ret = $try_cref->();
{ defined $_ ? ( refaddr($_) => $_ ) : () }
values %$destruction_registry
};
+
+ # Dummy NEXTSTATE ensuring the all temporaries on the stack are garbage
+ # collected before leaving this scope. Depending on the code above, this
+ # may very well be just a preventive measure guarding future modifications
+ undef;
}
# This is almost invariably invoked from within DESTROY
local $SIG{__WARN__} = sigwarn_silencer( qr/\Qisn't numeric in subroutine entry/ )
if SPURIOUS_VERSION_CHECK_WARNINGS;
+ local $SIG{__DIE__} if $SIG{__DIE__};
local $@;
- local $SIG{__DIE__};
eval { $mod->VERSION($ver) } ? 1 : 0;
};
) ? 1 : 0;
}
+
+#
+# Why not just use some higher-level module or at least File::Spec here?
+# Because:
+# 1) This is a *very* rarely used function, and the deptree is large
+# enough already as it is
+#
+# 2) (more importantly) Our tooling is utter shit in this area. There
+# is no comprehensive support for UNC paths in PathTools and there
+# are also various small bugs in representation across different
+# path-manipulation CPAN offerings.
+#
+# Since this routine is strictly used for logical path processing (it
+# *must* be able to work with not-yet-existing paths), use this seemingly
+# simple but I *think* complete implementation to feed to other consumers
+#
+# If bugs are ever uncovered in this routine, *YOU ARE URGED TO RESIST*
+# the impulse to bring in an external dependency. During runtime there
+# is exactly one spot that could potentially maybe once in a blue moon
+# use this function. Keep it lean.
+#
+sub parent_dir ($) {
+ ( $_[0] =~ m{ [\/\\] ( \.{0,2} ) ( [\/\\]* ) \z }x )
+ ? (
+ $_[0]
+ .
+ ( ( length($1) and ! length($2) ) ? '/' : '' )
+ .
+ '../'
+ )
+ : (
+ require File::Spec
+ and
+ File::Spec->catpath (
+ ( File::Spec->splitpath( "$_[0]" ) )[0,1],
+ '/',
+ )
+ )
+ ;
+}
+
+sub mkdir_p ($) {
+ require File::Path;
+ # do not ask for a recent version, use 1.x API calls
+ File::Path::mkpath([ "$_[0]" ]); # File::Path does not like objects
+}
+
+
{
my $list_ctx_ok_stack_marker;