Skip to content

Commit

Permalink
make singleton objects more inferable and remove invalid @generated f…
Browse files Browse the repository at this point in the history
…unctions from irrationals
  • Loading branch information
vtjnash committed Sep 26, 2016
1 parent 48e43a6 commit 82fe21c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 14 deletions.
8 changes: 8 additions & 0 deletions base/inference.jl
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,18 @@ typealias VarTable Array{Any,1}
type VarState
typ
undef::Bool
function VarState(typ::ANY, undef::Bool)
if isa(typ, DataType) && isdefined(typ, :instance)
# replace singleton types with their equivalent Const object
typ = Const(typ.instance)
end
return new(typ, undef)
end
end

immutable Const
val
Const(v::ANY) = new(v)
end

type InferenceState
Expand Down
45 changes: 31 additions & 14 deletions base/irrationals.jl
Original file line number Diff line number Diff line change
Expand Up @@ -57,27 +57,44 @@ end
x < big(y)
end

<=(x::Irrational,y::AbstractFloat) = x < y
<=(x::AbstractFloat,y::Irrational) = x < y
<=(x::Irrational, y::AbstractFloat) = x < y
<=(x::AbstractFloat, y::Irrational) = x < y

# Irrational vs Rational
@generated function <{T}(x::Irrational, y::Rational{T})
bx = big(x())
bx < 0 && T <: Unsigned && return true
rx = rationalize(T,bx,tol=0)
rx < bx ? :($rx < y) : :($rx <= y)
@pure function rationalize{T<:Integer}(::Type{T}, x::Irrational; tol::Real=0)
return rationalize(T, big(x), tol=tol)
end
@generated function <{T}(x::Rational{T}, y::Irrational)
by = big(y())
by < 0 && T <: Unsigned && return false
ry = rationalize(T,by,tol=0)
ry < by ? :(x <= $ry) : :(x < $ry)
@pure function rationalize{T<:Integer}(::Type{T}, x::Irrational)
return rationalize(T, big(x), tol=0)
end
@pure function lessrational{T<:Integer}(rx::Rational{T}, x::Irrational)
# an @pure version of `<` for determining if the rationalization of
# an irrational number required rounding up or down
return rx < big(x)
end
function <{T}(x::Irrational, y::Rational{T})
T <: Unsigned && x < 0.0 && return true
rx = rationalize(T, x)
if lessrational(rx, x)
return rx < y
else
return rx <= y
end
end
function <{T}(x::Rational{T}, y::Irrational)
T <: Unsigned && y < 0.0 && return false
ry = rationalize(T, y)
if lessrational(ry, y)
return x <= ry
else
return x < ry
end
end
<(x::Irrational, y::Rational{BigInt}) = big(x) < y
<(x::Rational{BigInt}, y::Irrational) = x < big(y)

<=(x::Irrational,y::Rational) = x < y
<=(x::Rational,y::Irrational) = x < y
<=(x::Irrational, y::Rational) = x < y
<=(x::Rational, y::Irrational) = x < y

isfinite(::Irrational) = true

Expand Down

0 comments on commit 82fe21c

Please sign in to comment.