diff --git a/base/string.jl b/base/string.jl index a10857dca76f18..99556e1d489f50 100644 --- a/base/string.jl +++ b/base/string.jl @@ -1551,7 +1551,8 @@ function tryparse_internal{T<:Integer}(::Type{T}, s::AbstractString, base::Int, end base = convert(T,base) - m::T = div(typemax(T)-base+1,base) + #m::T = div(typemax(T)-base+1,base) + m::T = ((T===UInt128 || T===Int128) && (Base.WORD_SIZE < 64)) ? typemax(T) : div(typemax(T)-base+1,base) n::T = 0 while n <= m d::T = '0' <= c <= '9' ? c-'0' : @@ -1581,13 +1582,25 @@ function tryparse_internal{T<:Integer}(::Type{T}, s::AbstractString, base::Int, end (T <: Signed) && (d *= sgn) - safe_n = safe_mul(n, base) - safe_n.isnull || (safe_n = safe_add(safe_n.value, d)) - if safe_n.isnull - raise && throw(OverflowError()) - return _n + if (T===UInt128 || T===Int128) && (Base.WORD_SIZE < 64) + if raise + n = checked_add(checked_mul(n,base),d) + else + try + n = checked_add(checked_mul(n,base),d) + catch + return _n + end + end + else + safe_n = safe_mul(n, base) + safe_n.isnull || (safe_n = safe_add(safe_n.value, d)) + if safe_n.isnull + raise && throw(OverflowError()) + return _n + end + n = safe_n.value end - n = safe_n.value done(s,i) && return Nullable{T}(n) c, i = next(s,i) end