46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
# Copyright 2014 Google Inc. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""A clone of the default copy.deepcopy that doesn't handle cyclic
|
|
structures or complex types except for dicts and lists. This is
|
|
because gyp copies so large structure that small copy overhead ends up
|
|
taking seconds in a project the size of Chromium."""
|
|
|
|
class Error(Exception):
|
|
pass
|
|
|
|
__all__ = ["Error", "deepcopy"]
|
|
|
|
def deepcopy(x):
|
|
"""Deep copy operation on gyp objects such as strings, ints, dicts
|
|
and lists. More than twice as fast as copy.deepcopy but much less
|
|
generic."""
|
|
|
|
try:
|
|
return _deepcopy_dispatch[type(x)](x)
|
|
except KeyError:
|
|
raise Error('Unsupported type %s for deepcopy. Use copy.deepcopy ' +
|
|
'or expand simple_copy support.' % type(x))
|
|
|
|
_deepcopy_dispatch = d = {}
|
|
|
|
def _deepcopy_atomic(x):
|
|
return x
|
|
|
|
for x in (type(None), int, long, float,
|
|
bool, str, unicode, type):
|
|
d[x] = _deepcopy_atomic
|
|
|
|
def _deepcopy_list(x):
|
|
return [deepcopy(a) for a in x]
|
|
d[list] = _deepcopy_list
|
|
|
|
def _deepcopy_dict(x):
|
|
y = {}
|
|
for key, value in x.iteritems():
|
|
y[deepcopy(key)] = deepcopy(value)
|
|
return y
|
|
d[dict] = _deepcopy_dict
|
|
|
|
del d
|