xref: /aosp_15_r20/external/pytorch/torchgen/local.py (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Workerfrom __future__ import annotations
2*da0073e9SAndroid Build Coastguard Worker
3*da0073e9SAndroid Build Coastguard Workerimport threading
4*da0073e9SAndroid Build Coastguard Workerfrom contextlib import contextmanager
5*da0073e9SAndroid Build Coastguard Workerfrom typing import Iterator
6*da0073e9SAndroid Build Coastguard Worker
7*da0073e9SAndroid Build Coastguard Worker
8*da0073e9SAndroid Build Coastguard Worker# Simple dynamic scoping implementation.  The name "parametrize" comes
9*da0073e9SAndroid Build Coastguard Worker# from Racket.
10*da0073e9SAndroid Build Coastguard Worker#
11*da0073e9SAndroid Build Coastguard Worker# WARNING WARNING: LOOKING TO EDIT THIS FILE?  Think carefully about
12*da0073e9SAndroid Build Coastguard Worker# why you need to add a toggle to the global behavior of code
13*da0073e9SAndroid Build Coastguard Worker# generation.  The parameters here should really only be used
14*da0073e9SAndroid Build Coastguard Worker# for "temporary" situations, where we need to temporarily change
15*da0073e9SAndroid Build Coastguard Worker# the codegen in some cases because we cannot conveniently update
16*da0073e9SAndroid Build Coastguard Worker# all call sites, and are slated to be eliminated once all call
17*da0073e9SAndroid Build Coastguard Worker# sites are eliminated.  If you don't have a plan for how to get there,
18*da0073e9SAndroid Build Coastguard Worker# DON'T add a new entry here.
19*da0073e9SAndroid Build Coastguard Worker
20*da0073e9SAndroid Build Coastguard Worker
21*da0073e9SAndroid Build Coastguard Workerclass Locals(threading.local):
22*da0073e9SAndroid Build Coastguard Worker    use_const_ref_for_mutable_tensors: bool | None = None
23*da0073e9SAndroid Build Coastguard Worker    use_ilistref_for_tensor_lists: bool | None = None
24*da0073e9SAndroid Build Coastguard Worker
25*da0073e9SAndroid Build Coastguard Worker
26*da0073e9SAndroid Build Coastguard Worker_locals = Locals()
27*da0073e9SAndroid Build Coastguard Worker
28*da0073e9SAndroid Build Coastguard Worker
29*da0073e9SAndroid Build Coastguard Workerdef use_const_ref_for_mutable_tensors() -> bool:
30*da0073e9SAndroid Build Coastguard Worker    assert _locals.use_const_ref_for_mutable_tensors is not None, (
31*da0073e9SAndroid Build Coastguard Worker        "need to initialize local.use_const_ref_for_mutable_tensors with "
32*da0073e9SAndroid Build Coastguard Worker        "local.parametrize"
33*da0073e9SAndroid Build Coastguard Worker    )
34*da0073e9SAndroid Build Coastguard Worker    return _locals.use_const_ref_for_mutable_tensors
35*da0073e9SAndroid Build Coastguard Worker
36*da0073e9SAndroid Build Coastguard Worker
37*da0073e9SAndroid Build Coastguard Workerdef use_ilistref_for_tensor_lists() -> bool:
38*da0073e9SAndroid Build Coastguard Worker    assert _locals.use_ilistref_for_tensor_lists is not None, (
39*da0073e9SAndroid Build Coastguard Worker        "need to initialize local.use_ilistref_for_tensor_lists with "
40*da0073e9SAndroid Build Coastguard Worker        "local.parametrize"
41*da0073e9SAndroid Build Coastguard Worker    )
42*da0073e9SAndroid Build Coastguard Worker    return _locals.use_ilistref_for_tensor_lists
43*da0073e9SAndroid Build Coastguard Worker
44*da0073e9SAndroid Build Coastguard Worker
45*da0073e9SAndroid Build Coastguard Worker@contextmanager
46*da0073e9SAndroid Build Coastguard Workerdef parametrize(
47*da0073e9SAndroid Build Coastguard Worker    *, use_const_ref_for_mutable_tensors: bool, use_ilistref_for_tensor_lists: bool
48*da0073e9SAndroid Build Coastguard Worker) -> Iterator[None]:
49*da0073e9SAndroid Build Coastguard Worker    old_use_const_ref_for_mutable_tensors = _locals.use_const_ref_for_mutable_tensors
50*da0073e9SAndroid Build Coastguard Worker    old_use_ilistref_for_tensor_lists = _locals.use_ilistref_for_tensor_lists
51*da0073e9SAndroid Build Coastguard Worker    try:
52*da0073e9SAndroid Build Coastguard Worker        _locals.use_const_ref_for_mutable_tensors = use_const_ref_for_mutable_tensors
53*da0073e9SAndroid Build Coastguard Worker        _locals.use_ilistref_for_tensor_lists = use_ilistref_for_tensor_lists
54*da0073e9SAndroid Build Coastguard Worker        yield
55*da0073e9SAndroid Build Coastguard Worker    finally:
56*da0073e9SAndroid Build Coastguard Worker        _locals.use_const_ref_for_mutable_tensors = (
57*da0073e9SAndroid Build Coastguard Worker            old_use_const_ref_for_mutable_tensors
58*da0073e9SAndroid Build Coastguard Worker        )
59*da0073e9SAndroid Build Coastguard Worker        _locals.use_ilistref_for_tensor_lists = old_use_ilistref_for_tensor_lists
60