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