Skip to content

Commit fc3e1cf

Browse files
committed
Replace primitive Array{...}(dims...) constructors with Array{...}(uninitialized, dims...).
1 parent ed9f8e5 commit fc3e1cf

File tree

4 files changed

+101
-23
lines changed

4 files changed

+101
-23
lines changed

base/boot.jl

+37-17
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export
123123
SimpleVector, AbstractArray, DenseArray, NamedTuple,
124124
# special objects
125125
Function, CodeInfo, Method, MethodTable, TypeMapEntry, TypeMapLevel,
126-
Module, Symbol, Task, Array, WeakRef, VecElement,
126+
Module, Symbol, Task, Array, Uninitialized, uninitialized, WeakRef, VecElement,
127127
# numeric types
128128
Number, Real, Integer, Bool, Ref, Ptr,
129129
AbstractFloat, Float16, Float32, Float64,
@@ -350,25 +350,45 @@ unsafe_convert(::Type{T}, x::T) where {T} = x
350350
const NTuple{N,T} = Tuple{Vararg{T,N}}
351351

352352

353-
# primitive array constructors
354-
Array{T,N}(d::NTuple{N,Int}) where {T,N} =
355-
ccall(:jl_new_array, Array{T,N}, (Any, Any), Array{T,N}, d)
356-
Array{T,1}(d::NTuple{1,Int}) where {T} = Array{T,1}(getfield(d,1))
357-
Array{T,2}(d::NTuple{2,Int}) where {T} = Array{T,2}(getfield(d,1), getfield(d,2))
358-
Array{T,3}(d::NTuple{3,Int}) where {T} = Array{T,3}(getfield(d,1), getfield(d,2), getfield(d,3))
359-
Array{T,N}(d::Vararg{Int,N}) where {T,N} = ccall(:jl_new_array, Array{T,N}, (Any, Any), Array{T,N}, d)
360-
Array{T,1}(m::Int) where {T} = ccall(:jl_alloc_array_1d, Array{T,1}, (Any, Int), Array{T,1}, m)
361-
Array{T,2}(m::Int, n::Int) where {T} =
353+
## primitive Array constructors
354+
struct Uninitialized end
355+
const uninitialized = Uninitialized()
356+
# type and dimensionality specified, accepting dims as series of Ints
357+
Array{T,1}(::Uninitialized, m::Int) where {T} =
358+
ccall(:jl_alloc_array_1d, Array{T,1}, (Any, Int), Array{T,1}, m)
359+
Array{T,2}(::Uninitialized, m::Int, n::Int) where {T} =
362360
ccall(:jl_alloc_array_2d, Array{T,2}, (Any, Int, Int), Array{T,2}, m, n)
363-
Array{T,3}(m::Int, n::Int, o::Int) where {T} =
361+
Array{T,3}(::Uninitialized, m::Int, n::Int, o::Int) where {T} =
364362
ccall(:jl_alloc_array_3d, Array{T,3}, (Any, Int, Int, Int), Array{T,3}, m, n, o)
363+
Array{T,N}(::Uninitialized, d::Vararg{Int,N}) where {T,N} =
364+
ccall(:jl_new_array, Array{T,N}, (Any, Any), Array{T,N}, d)
365+
# type and dimensionality specified, accepting dims as tuples of Ints
366+
Array{T,1}(::Uninitialized, d::NTuple{1,Int}) where {T} = Array{T,1}(uninitialized, getfield(d,1))
367+
Array{T,2}(::Uninitialized, d::NTuple{2,Int}) where {T} = Array{T,2}(uninitialized, getfield(d,1), getfield(d,2))
368+
Array{T,3}(::Uninitialized, d::NTuple{3,Int}) where {T} = Array{T,3}(uninitialized, getfield(d,1), getfield(d,2), getfield(d,3))
369+
Array{T,N}(::Uninitialized, d::NTuple{N,Int}) where {T,N} = ccall(:jl_new_array, Array{T,N}, (Any, Any), Array{T,N}, d)
370+
# type but not dimensionality specified
371+
Array{T}(::Uninitialized, m::Int) where {T} = Array{T,1}(uninitialized, m)
372+
Array{T}(::Uninitialized, m::Int, n::Int) where {T} = Array{T,2}(uninitialized, m, n)
373+
Array{T}(::Uninitialized, m::Int, n::Int, o::Int) where {T} = Array{T,3}(uninitialized, m, n, o)
374+
Array{T}(::Uninitialized, d::NTuple{N,Int}) where {T,N} = Array{T,N}(uninitialized, d)
375+
# empty vector constructor
376+
Array{T,1}() where {T} = Array{T,1}(uninitialized, 0)
377+
378+
## preexisting Array constructors, i.e. without uninitialized, to deprecate
379+
# type and dimensionality specified, accepting dims as series of Ints
380+
Array{T,1}(m::Int) where {T} = Array{T,1}(uninitialized, m)
381+
Array{T,2}(m::Int, n::Int) where {T} = Array{T,2}(uninitialized, m, n)
382+
Array{T,3}(m::Int, n::Int, o::Int) where {T} = Array{T,3}(uninitialized, m, n, o)
383+
Array{T,N}(d::Vararg{Int,N}) where {T,N} = Array{T,N}(uninitialized, d)
384+
# type and dimensionality specified, accepting dims as tuples of Ints
385+
Array{T,N}(d::NTuple{N,Int}) where {T,N} = Array{T,N}(uninitialized, d)
386+
# type but not dimensionality specified
387+
Array{T}(m::Int) where {T} = Array{T}(uninitialized, m)
388+
Array{T}(m::Int, n::Int) where {T} = Array{T}(uninitialized, m, n)
389+
Array{T}(m::Int, n::Int, o::Int) where {T} = Array{T}(uninitialized, m, n, o)
390+
Array{T}(d::NTuple{N,Int}) where {T,N} = Array{T}(uninitialized, d)
365391

366-
Array{T}(d::NTuple{N,Int}) where {T,N} = Array{T,N}(d)
367-
Array{T}(m::Int) where {T} = Array{T,1}(m)
368-
Array{T}(m::Int, n::Int) where {T} = Array{T,2}(m, n)
369-
Array{T}(m::Int, n::Int, o::Int) where {T} = Array{T,3}(m, n, o)
370-
371-
Array{T,1}() where {T} = Array{T,1}(0)
372392

373393
# primitive Symbol constructors
374394
function Symbol(s::String)

base/docs/basedocs.jl

+36
Original file line numberDiff line numberDiff line change
@@ -1297,6 +1297,42 @@ julia> B = Array{Float64}(2) # N determined by the input
12971297
"""
12981298
Array{T,N}(dims)
12991299

1300+
"""
1301+
Uninitialized
1302+
1303+
Singleton type used in array initialization, indicating the array-constructor-caller
1304+
would like an uninitialized array. See also [`uninitialized`](@ref),
1305+
an alias for `Uninitialized()`.
1306+
1307+
# Examples
1308+
```julia-repl
1309+
julia> Array{Float64,1}(Uninitialized(), 3)
1310+
3-element Array{Float64,1}:
1311+
2.2752528595e-314
1312+
2.202942107e-314
1313+
2.275252907e-314
1314+
```
1315+
"""
1316+
Uninitialized
1317+
1318+
"""
1319+
uninitialized
1320+
1321+
Alias for `Uninitialized()`, which constructs an instance of the singleton type
1322+
[`Uninitialized`](@ref), used in array initialization to indicate the
1323+
array-constructor-caller would like an uninitialized array.
1324+
1325+
# Examples
1326+
```julia-repl
1327+
julia> Array{Float64,1}(uninitialized, 3)
1328+
3-element Array{Float64,1}:
1329+
2.2752528595e-314
1330+
2.202942107e-314
1331+
2.275252907e-314
1332+
```
1333+
"""
1334+
uninitialized
1335+
13001336
"""
13011337
+(x, y...)
13021338

base/sysimg.jl

+26-6
Original file line numberDiff line numberDiff line change
@@ -130,17 +130,37 @@ include("abstractarray.jl")
130130
include("subarray.jl")
131131
include("reinterpretarray.jl")
132132

133-
# Array convenience converting constructors
133+
134+
# ## dims-type-converting Array constructors for convenience
135+
# type and dimensionality specified, accepting dims as series of Integers
136+
Vector{T}(::Uninitialized, m::Integer) where {T} = Vector{T}(uninitialized, Int(m))
137+
Matrix{T}(::Uninitialized, m::Integer, n::Integer) where {T} = Matrix{T}(uninitialized, Int(m), Int(n))
138+
# type but not dimensionality specified, accepting dims as series of Integers
139+
Array{T}(::Uninitialized, m::Integer) where {T} = Array{T,1}(uninitialized, Int(m))
140+
Array{T}(::Uninitialized, m::Integer, n::Integer) where {T} = Array{T,2}(uninitialized, Int(m), Int(n))
141+
Array{T}(::Uninitialized, m::Integer, n::Integer, o::Integer) where {T} = Array{T,3}(uninitialized, Int(m), Int(n), Int(o))
142+
Array{T}(::Uninitialized, d::Integer...) where {T} = Array{T}(uninitialized, convert(Tuple{Vararg{Int}}, d))
143+
# dimensionality but not type specified, accepting dims as series of Integers
144+
Vector(::Uninitialized, m::Integer) = Vector{Any}(uninitialized, Int(m))
145+
Matrix(::Uninitialized, m::Integer, n::Integer) = Matrix{Any}(uninitialized, Int(m), Int(n))
146+
# empty vector constructor
147+
Vector() = Vector{Any}(uninitialized, 0)
148+
149+
## preexisting dims-type-converting Array constructors for convenience, i.e. without uninitialized, to deprecate
150+
# type and dimensionality specified, accepting dims as series of Integers
151+
Vector{T}(m::Integer) where {T} = Vector{T}(Int(m))
152+
Matrix{T}(m::Integer, n::Integer) where {T} = Matrix{T}(Int(m), Int(n))
153+
# type but not dimensionality specified, accepting dims as series of Integers
134154
Array{T}(m::Integer) where {T} = Array{T,1}(Int(m))
135155
Array{T}(m::Integer, n::Integer) where {T} = Array{T,2}(Int(m), Int(n))
136156
Array{T}(m::Integer, n::Integer, o::Integer) where {T} = Array{T,3}(Int(m), Int(n), Int(o))
137157
Array{T}(d::Integer...) where {T} = Array{T}(convert(Tuple{Vararg{Int}}, d))
138-
139-
Vector() = Array{Any,1}(0)
140-
Vector{T}(m::Integer) where {T} = Array{T,1}(Int(m))
141-
Vector(m::Integer) = Array{Any,1}(Int(m))
142-
Matrix{T}(m::Integer, n::Integer) where {T} = Matrix{T}(Int(m), Int(n))
158+
# dimensionality but not type specified, accepting dims as series of Integers
159+
Vector(m::Integer) = Vector{Any}(Int(m))
143160
Matrix(m::Integer, n::Integer) = Matrix{Any}(Int(m), Int(n))
161+
# empty vector constructor
162+
Vector() = Vector{Any}(0)
163+
144164

145165
include("associative.jl")
146166

doc/src/stdlib/arrays.md

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Base.AbstractVector
88
Base.AbstractMatrix
99
Core.Array
1010
Core.Array(::Any)
11+
Core.Uninitialized
12+
Core.uninitialized
1113
Base.Vector
1214
Base.Vector(::Any)
1315
Base.Matrix

0 commit comments

Comments
 (0)