| # Copyright 2020 The IREE Authors |
| # |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| def _is_dict(x): |
| return type(x) == type({}) |
| |
| def _is_list(x): |
| return type(x) == type([]) |
| |
| # Starlark doesn't support recursion, so we 'simulate' it by copying and pasting. |
| def _deep_copy_recursion_depth_3(x): |
| """Helper method for deep_copy().""" |
| if _is_dict(x) or _is_list(x): |
| fail("Cannot make a deep copy of containers nested too deeply") |
| return x |
| |
| def _deep_copy_recursion_depth_2(x): |
| """Helper method for deep_copy().""" |
| if _is_dict(x): |
| return {key: _deep_copy_recursion_depth_3(value) for key, value in x.items()} |
| if _is_list(x): |
| return [_deep_copy_recursion_depth_3(value) for value in x] |
| return x |
| |
| def _deep_copy_recursion_depth_1(x): |
| """Helper method for deep_copy().""" |
| if _is_dict(x): |
| return {key: _deep_copy_recursion_depth_2(value) for key, value in x.items()} |
| if _is_list(x): |
| return [_deep_copy_recursion_depth_2(value) for value in x] |
| return x |
| |
| def deep_copy(x): |
| """Returns a copy of the argument, making a deep copy if it is a container. |
| |
| Args: |
| x: (object) value to copy. If it is a container with nested containers as |
| elements, the maximum nesting depth is restricted to three (e.g., |
| [[[3]]] is okay, but not [[[[4]]]]). If it is a struct, it is treated |
| as a value type, i.e., only a shallow copy is made. |
| Returns: |
| A copy of the argument. |
| """ |
| if _is_dict(x): |
| return {key: _deep_copy_recursion_depth_1(value) for key, value in x.items()} |
| if _is_list(x): |
| return [_deep_copy_recursion_depth_1(value) for value in x] |
| return x |