Skip to content

Commit 5c93b3a

Browse files
authored
make sure parseint base can be any Integer type (#17335)
1 parent ab6a8db commit 5c93b3a

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

base/gmp.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ signed(x::BigInt) = x
7676

7777
convert(::Type{BigInt}, x::BigInt) = x
7878

79-
function tryparse_internal(::Type{BigInt}, s::AbstractString, startpos::Int, endpos::Int, base::Int, raise::Bool)
79+
function tryparse_internal(::Type{BigInt}, s::AbstractString, startpos::Int, endpos::Int, base_::Integer, raise::Bool)
8080
_n = Nullable{BigInt}()
8181

8282
# don't make a copy in the common case where we are parsing a whole String
8383
bstr = startpos == start(s) && endpos == endof(s) ? String(s) : String(SubString(s,startpos,endpos))
8484

85-
sgn, base, i = Base.parseint_preamble(true,base,bstr,start(bstr),endof(bstr))
85+
sgn, base, i = Base.parseint_preamble(true,Int(base_),bstr,start(bstr),endof(bstr))
8686
if !(2 <= base <= 62)
8787
raise && throw(ArgumentError("invalid base: base must be 2 ≤ base ≤ 62, got $base"))
8888
return _n

base/parse.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ safe_mul{T<:Integer}(n1::T, n2::T) = ((n2 > 0) ? ((n1 > div(typemax(T),n2)) ||
5959
(n2 < -1) ? ((n1 > div(typemin(T),n2)) || (n1 < div(typemax(T),n2))) :
6060
((n2 == -1) && n1 == typemin(T))) ? Nullable{T}() : Nullable{T}(n1 * n2)
6161

62-
function tryparse_internal{T<:Integer}(::Type{T}, s::AbstractString, startpos::Int, endpos::Int, base::Integer, raise::Bool)
62+
function tryparse_internal{T<:Integer}(::Type{T}, s::AbstractString, startpos::Int, endpos::Int, base_::Integer, raise::Bool)
6363
_n = Nullable{T}()
64-
sgn, base, i = parseint_preamble(T<:Signed, base, s, startpos, endpos)
64+
sgn, base, i = parseint_preamble(T<:Signed, Int(base_), s, startpos, endpos)
6565
if !(2 <= base <= 62)
6666
raise && throw(ArgumentError("invalid base: base must be 2 ≤ base ≤ 62, got $base"))
6767
return _n

test/parse.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,14 @@ end
512512
# to be removed post 0.5
513513
#@test_throws MethodError eval(parse("(Any=>Any)[x=>y for (x,y) in zip([1,2,3],[4,5,6])]"))
514514

515+
# make sure base can be any Integer
516+
for T in (Int, BigInt)
517+
let n = parse(T, "123", Int8(10))
518+
@test n == 123
519+
@test isa(n, T)
520+
end
521+
end
522+
515523
# issue #16720
516524
let err = try
517525
include_string("module A

0 commit comments

Comments
 (0)