@@ -298,6 +298,8 @@ def __call__(self, *call_args):
298298 return call (self .emit (* call_args ), call_args )
299299
300300 def __getitem__ (self , item ):
301+ if not isinstance (item , tuple ):
302+ item = (item ,)
301303 if self .generics is None :
302304 raise RuntimeError (
303305 "using a generic call requires the func be generic (i.e., have type_params)"
@@ -322,22 +324,26 @@ def maybe_eval_type_data_closure_vals(unevaled_type_data: _Ptr[PyObject]):
322324 continue
323325 if k not in already_reified_type_params :
324326 raise RuntimeError (
325- f"typevar { k } not reified prior to evaluating dependent typevar { t } "
327+ f"typevar { k } not reified prior to evaluating dependent typevar { tvar } "
326328 )
327329 cvrs [k ] = already_reified_type_params [k ]
328330 unevaled_type_data = copy_func (unevaled_type_data , cvrs )
329331 return unevaled_type_data ()
330332
331- generics = copy .deepcopy (self .generics )
332- for i , t in enumerate (generics ):
333+ generics = copy_object (self .generics )
334+ for i , tvar in enumerate (generics ):
335+ if not isinstance (tvar , TypeVar ):
336+ raise RuntimeError (
337+ f"{ i } th generic has probably already been reified as { tvar } ; if you're using a global tvar for the generic, you should give it a unique name."
338+ )
333339 type_var_default = None
334340 if sys .version_info >= (3 , 12 ):
335- type_var = PyTypeVarObject .from_object (t )
341+ type_var = PyTypeVarObject .from_object (tvar )
336342 type_var_bound = type_var .bound
337- if sys .version_info >= (3 , 13 ) and t .has_default ():
343+ if sys .version_info >= (3 , 13 ) and tvar .has_default ():
338344 type_var_default = type_var .default_value
339345 else :
340- type_var_bound = t .__bound__
346+ type_var_bound = tvar .__bound__
341347
342348 if bool (type_var_bound ):
343349 # before 3.12 typevar was just a python class
@@ -346,7 +352,7 @@ def maybe_eval_type_data_closure_vals(unevaled_type_data: _Ptr[PyObject]):
346352 type_var_bound = maybe_eval_type_data_closure_vals (type_var_bound )
347353 elif not bool (type_var_default ):
348354 if i >= len (item ):
349- raise RuntimeError (f"generic { t } must have concrete val" )
355+ raise RuntimeError (f"generic { tvar = } must have concrete val" )
350356 if isinstance (item [i ], Type ):
351357 type_var_bound = "type"
352358 else :
@@ -358,29 +364,31 @@ def maybe_eval_type_data_closure_vals(unevaled_type_data: _Ptr[PyObject]):
358364 val = type_var_default
359365 else :
360366 if i >= len (item ):
361- raise RuntimeError (f"generic { t } must have concrete val" )
367+ raise RuntimeError (f"generic { tvar = } must have concrete val" )
362368 val = item [i ]
363369
364- r = ReifiedTypeParams (t .__name__ , val , type_var_bound )
370+ r = ReifiedTypeParams (tvar .__name__ , val , type_var_bound )
365371
366372 reified_type_params .append (r )
367373 already_reified_type_params [r .name ] = r .val
368374
369- if t .__name__ in body_builder .__globals__ :
370- body_builder .__globals__ [t .__name__ ] = r .val
375+ # replace the tvar in body_builder's global context with the reified val
376+ if tvar .__name__ in body_builder .__globals__ :
377+ body_builder .__globals__ [tvar .__name__ ] = r .val
378+ # replace the tvar in body_builder's closure with the reified val
371379 if r .name in body_builder .__code__ .co_freevars :
372380 free_i = body_builder .__code__ .co_freevars .index (r .name )
373381 assert (
374- body_builder .__closure__ [free_i ].cell_contents == t
382+ body_builder .__closure__ [free_i ].cell_contents == tvar
375383 ), "typevars don't match"
376384 body_builder .__closure__ [free_i ].cell_contents = r .val
377385
378386 name_mangled_generics = []
379387 for r in reified_type_params :
380- t , v = r .type , r .val
388+ tvar , v = r .type , r .val
381389 if callable (v ):
382390 v = v .__name__
383- name_mangled_generics .append (f"{ t } _{ v } " )
391+ name_mangled_generics .append (f"{ tvar } _{ v } " )
384392
385393 return FuncBase (
386394 body_builder ,
0 commit comments