Skip to content

Commit

Permalink
deepcopy: recurse through immutable objects with mutable fields.
Browse files Browse the repository at this point in the history
(cherry picked from commit 5807658)
ref PR #8560

deepcopy optimization: return bits types immediately.

(cherry picked from commit 8b0d0f6)

deepcopy: update NEWS.md and docs.

(cherry picked from commit 4837f35)

Conflicts:
	NEWS.md
  • Loading branch information
StefanKarpinski authored and tkelman committed Mar 11, 2015
1 parent 0d1e7bc commit b55539a
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 11 deletions.
8 changes: 8 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
Julia v0.3.7 Release Notes
==========================

Library improvements
--------------------

* `deepcopy` recurses through immutable types and makes copies of their mutable fields ([#8560]).

Julia v0.3.4 Release Notes
==========================

Expand Down
23 changes: 13 additions & 10 deletions base/deepcopy.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,23 @@ function deepcopy_internal(x, stackdict::ObjectIdDict)
end

function _deepcopy_t(x, T::DataType, stackdict::ObjectIdDict)
if T.names===() || !T.mutable
return x
end
ret = ccall(:jl_new_struct_uninit, Any, (Any,), T)
stackdict[x] = ret
for i in 1:length(T.names)
if isdefined(x,i)
ret.(i) = deepcopy_internal(x.(i), stackdict)
isbits(T) | isempty(T.names) && return x
if T.mutable
y = ccall(:jl_new_struct_uninit, Any, (Any,), T)
stackdict[x] = y
for i in 1:length(T.names)
if isdefined(x,i)
y.(i) = deepcopy_internal(x.(i), stackdict)
end
end
else
fields = Any[deepcopy_internal(x.(i), stackdict) for i in 1:length(T.names)]
y = ccall(:jl_new_structv, Any, (Any, Ptr{Void}, Uint32),
T, pointer(fields), length(fields))
end
return ret
return y::T
end


function deepcopy_internal(x::Array, stackdict::ObjectIdDict)
if haskey(stackdict, x)
return stackdict[x]
Expand Down
2 changes: 1 addition & 1 deletion doc/stdlib/base.rst
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ All Objects

.. function:: deepcopy(x)

Create a deep copy of ``x``: everything is copied recursively, resulting in a fully independent object. For example, deep-copying an array produces a new array whose elements are deep-copies of the original elements.
Create a deep copy of ``x``: everything is copied recursively, resulting in a fully independent object. For example, deep-copying an array produces a new array whose elements are deep copies of the original elements. Calling `deepcopy` on an object should generally have the same effect as serializing and then deserializing it.

As a special case, functions can only be actually deep-copied if they are anonymous, otherwise they are just copied. The difference is only relevant in the case of closures, i.e. functions which may contain hidden internal references.

Expand Down

0 comments on commit b55539a

Please sign in to comment.