mirrorspeed()
{
+ # first result is to be ignored, but we use it to check status
+ git ls-remote "$1" refs/heads/master >/dev/null 2>&1 || return 1
+ # if we can't time, we only check availability
if ! { time -p true; } >/dev/null 2>&1; then
echo 0
return
fi
- # first result is to be ignored, but we use it to check status
- git ls-remote "$1" refs/heads/master >/dev/null 2>&1 || return 1
# now actually time it
(
set +x
bestcount=
bestmirror_benchmark()
{
- if [ -z "$2" ]; then
+ bmb_curloc=$1
+ bmb_proto=$2
+ bmb_loc=$3
+ bmb_url=$4
+ bmb_fudge=$5
+
+ if [ -z "$bmb_loc" ]; then
# empty location is not allowed
return
fi
*" "*)
# no protocol requested? all match
;;
- *" $1 "*)
+ *" $bmb_proto "*)
;;
*)
return
# prefer location match
case " $newlocation " in
- *" $2 "*)
+ *" $bmb_loc "*)
+ # bmb_curloc is true in first run, false in second
+ # so first run gets all matching locations
+ # so second run gets all non-matching locations
+ if ! $bmb_curloc; then
+ return
+ fi
;;
*)
+ if $bmb_curloc; then
+ return
+ fi
case " $newlocation " in
*" $bestlocation "*)
# worse
esac
case " $newlocation " in
- *" $2 "*)
+ *" $bmb_loc "*)
# see below
;;
*)
esac
;;
esac
- msg "Testing speed of $3..."
+ msg "Testing speed of $bmb_url..."
# only working mirrors
- if ! thistime=`mirrorspeed "$3$testrepo"`; then
+ if ! thistime=`mirrorspeed "$bmb_url$testrepo"`; then
msg "-> FAILED"
return
fi
- thistime=$(($thistime $4))
+ thistime=$(($thistime $bmb_fudge))
msg "-> $thistime"
# anything is better than nothing
if [ -z "$besttime" ]; then
- besturl=$3
- bestlocation=$2
+ besturl=$bmb_url
+ bestlocation=$bmb_loc
besttime=$thistime
bestcount=1
return
# prefer location match
case " $newlocation " in
- *" $2 "*)
+ *" $bmb_loc "*)
case " $newlocation " in
*" $bestlocation "*)
# equality
;;
*)
# better
- besturl=$3
- bestlocation=$2
+ besturl=$bmb_url
+ bestlocation=$bmb_loc
besttime=$thistime
bestcount=1
return
if [ $thistime -gt $besttime ]; then
return
elif [ $thistime -lt $besttime ]; then
- besturl=$3
+ besturl=$bmb_url
+ bestlocation=$bmb_loc
besttime=$thistime
bestcount=1
return
# both location and time match. Random decision.
bestcount=$(($bestcount + 1))
if [ $((($RANDOM + 0) % $bestcount)) -eq 0 ]; then
- besturl=$3
+ besturl=$bmb_url
+ bestlocation=$bmb_loc
fi
}
- allmirrors bestmirror_benchmark
+ allmirrors bestmirror_benchmark true
+ allmirrors bestmirror_benchmark false
echo "$besturl"
}
{
for(values %{$highlight->{$ip}})
{
- for(@$_)
+ for(sort keys %$_)
{
print PRE_MARK_STATEMENT;
printf INSTRUCTION_FORMAT, '', '<!>', '.WARN';
# COMPILER BUG of FTEQCC: AND and OR may take uninitialized as second argument (logicops)
if($return_hack <= 2 and ($op ne 'OR' && $op ne 'AND' || $_ ne 'b'))
{
- push @{$warned{$ip}{$_}}, "Use of uninitialized value";
+ ++$warned{$ip}{$_}{"Use of uninitialized value"};
}
}
elsif($valid->[0] < 0)
# COMPILER BUG of FTEQCC: AND and OR may take uninitialized as second argument (logicops)
if($return_hack <= 2 and ($op ne 'OR' && $op ne 'AND' || $_ ne 'b'))
{
- push @{$warned{$ip}{$_}}, "Use of temporary across CALL";
+ ++$warned{$ip}{$_}{"Use of temporary across CALL"};
}
}
else
$write->($ofs+1);
$write->($ofs+2);
}
+ elsif($type eq 'ipoffset')
+ {
+ ++$warned{$ip}{$_}{"Endless loop"}
+ if $ofs == 0;
+ ++$warned{$ip}{$_}{"No-operation jump"}
+ if $ofs == 1;
+ }
}
if($c->{iscall})
{
if(!$isread)
{
- push @{$warned{$ip}{$operand}}, "Value is never used";
+ ++$warned{$ip}{$operand}{"Value is never used"};
}
}
}
die "Out of range file in function $_"
if $f->{s_file} < 0 || $f->{s_file} >= length $p{strings};
my $file = $p{getstring}->($f->{s_file});
- die "Out of range first_statement in function $_ (name: \"$name\", file: \"$file\")"
+ die "Out of range first_statement in function $_ (name: \"$name\", file: \"$file\", first statement: $f->{first_statement})"
if $f->{first_statement} >= @{$p{statements}};
- die "Out of range parm_start in function $_ (name: \"$name\", file: \"$file\")"
+ die "Out of range parm_start in function $_ (name: \"$name\", file: \"$file\", first statement: $f->{first_statement})"
if $f->{parm_start} < 0 || $f->{parm_start} >= @{$p{globals}};
- die "Out of range locals in function $_ (name: \"$name\", file: \"$file\")"
+ die "Out of range locals in function $_ (name: \"$name\", file: \"$file\", first statement: $f->{first_statement})"
if $f->{locals} < 0 || $f->{parm_start} + $f->{locals} >= @{$p{globals}};
- die "Out of range numparms in function $_ (name: \"$name\", file: \"$file\")"
- if $f->{numparms} < 0 || $f->{numparms} > 8;
- my $totalparms = 0;
- for(0..($f->{numparms}-1))
+ if($f->{first_statement} >= 0)
{
- die "Out of range parm_size[$_] in function $_ (name: \"$name\", file: \"$file\")"
- unless { 0 => 1, 1 => 1, 3 => 1 }->{$f->{parm_size}[$_]};
- $totalparms += $f->{parm_size}[$_];
+ die "Out of range numparms $f->{numparms} in function $_ (name: \"$name\", file: \"$file\", first statement: $f->{first_statement})"
+ if $f->{numparms} < 0 || $f->{numparms} > 8;
+ my $totalparms = 0;
+ for(0..($f->{numparms}-1))
+ {
+ die "Out of range parm_size[$_] in function $_ (name: \"$name\", file: \"$file\", first statement: $f->{first_statement})"
+ unless { 0 => 1, 1 => 1, 3 => 1 }->{$f->{parm_size}[$_]};
+ $totalparms += $f->{parm_size}[$_];
+ }
+ die "Out of range parms in function $_ (name: \"$name\", file: \"$file\", first statement: $f->{first_statement})"
+ if $f->{locals} < 0 || $f->{parm_start} + $totalparms >= @{$p{globals}};
}
- die "Out of range parms in function $_ (name: \"$name\", file: \"$file\")"
- if $f->{locals} < 0 || $f->{parm_start} + $totalparms >= @{$p{globals}};
}
print STDERR "Range checking statements...\n";