Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Consistify interface of substr
Fixes R#1717 #1717

- When Range is given, coerce the endpoints to Int
- When Callable is given, coerce its return value to Int
- When (Non-Int, Callable) are used, fix crash due to attempt to
    numerically compare Callable with Inf
  • Loading branch information
zoffixznet committed Apr 9, 2018
1 parent 404f302 commit f0c8512
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions src/core/Str.pm6
Expand Up @@ -2722,23 +2722,23 @@ my class Str does Stringy { # declared in BOOTSTRAP
|| nqp::isgt_i($from,nqp::chars($!value)),
Rakudo::Internals.SUBSTR-START-OOR($from,nqp::chars($!value)),
nqp::if(
nqp::islt_i((my int $chars = (want)(nqp::chars($!value) - $from)),0),
nqp::islt_i((my int $chars = (want)(nqp::chars($!value) - $from).Int),0),
Rakudo::Internals.SUBSTR-CHARS-OOR($chars),
nqp::substr($!value,$from,$chars)
)
)
}
multi method substr(Str:D: Callable:D \start) {
nqp::if(
nqp::islt_i((my int $from = (start)(nqp::chars($!value))),0)
nqp::islt_i((my int $from = (start)(nqp::chars($!value)).Int),0)
|| nqp::isgt_i($from,nqp::chars($!value)),
Rakudo::Internals.SUBSTR-START-OOR($from,nqp::chars($!value)),
nqp::substr($!value,$from)
)
}
multi method substr(Str:D: Callable:D \start, Int:D \want) {
nqp::if(
nqp::islt_i((my int $from = (start)(nqp::chars($!value))),0)
nqp::islt_i((my int $from = (start)(nqp::chars($!value)).Int),0)
|| nqp::isgt_i($from,nqp::chars($!value)),
Rakudo::Internals.SUBSTR-START-OOR($from,nqp::chars($!value)),
nqp::if(
Expand All @@ -2750,25 +2750,25 @@ my class Str does Stringy { # declared in BOOTSTRAP
}
multi method substr(Str:D: Callable:D \start, Callable:D \want) {
nqp::if(
nqp::islt_i((my int $from = (start)(nqp::chars($!value))),0)
nqp::islt_i((my int $from = (start)(nqp::chars($!value)).Int),0)
|| nqp::isgt_i($from,nqp::chars($!value)),
Rakudo::Internals.SUBSTR-START-OOR($from,nqp::chars($!value)),
nqp::if(
nqp::islt_i((my int $chars = (want)(nqp::chars($!value) - $from)),0),
nqp::islt_i((my int $chars = (want)(nqp::chars($!value) - $from).Int),0),
Rakudo::Internals.SUBSTR-CHARS-OOR($chars),
nqp::substr($!value,$from,$chars)
)
)
}
multi method substr(Str:D: Range:D \start) {
nqp::if(
nqp::islt_i((my int $from = start.min + start.excludes-min),0)
nqp::islt_i((my int $from = (start.min + start.excludes-min).Int),0)
|| nqp::isgt_i($from,nqp::chars($!value)),
Rakudo::Internals.SUBSTR-START-OOR($from,nqp::chars($!value)),
nqp::if(
start.max == Inf,
nqp::substr($!value,$from),
nqp::substr($!value,$from,start.max - start.excludes-max - $from + 1)
nqp::substr($!value,$from,(start.max - start.excludes-max - $from + 1).Int)
)
)
}
Expand All @@ -2778,10 +2778,12 @@ my class Str does Stringy { # declared in BOOTSTRAP
multi method substr(Str:D: \start) {
self.substr(start.Int)
}
multi method substr(Str:D: \start, \want) {
nqp::istype(want,Whatever) || want == Inf
?? self.substr(start)
!! self.substr(start.Int,want.Int)
multi method substr(Str:D: \from, \want) {
nqp::istype(want,Whatever)
|| (! nqp::istype(want, Callable) && want == Inf)
?? self.substr(from)
!! self.substr(nqp::istype(from, Callable) ?? from !! from.Int,
nqp::istype(want, Callable) ?? want !! want.Int)
}

multi method substr-rw(Str:D \SELF: \start, $want = Inf) is rw {
Expand Down

0 comments on commit f0c8512

Please sign in to comment.