@@ -1526,6 +1526,18 @@ def __init__(self, mapper, nested=False):
15261526 f"specialization. Value { v } was supplied for symbol "
15271527 f"{ k } , but is of type { type (v )} ." )
15281528
1529+ def visit_OrderedDict (self , o ):
1530+ return OrderedDict ((k , self ._visit (v )) for k , v in o .items ())
1531+
1532+ def visit_MetaCall (self , o ):
1533+ root = self ._visit (o .root )
1534+ return MetaCall (root = root , local = o .local )
1535+
1536+ def visit_Callable (self , o ):
1537+ body = self ._visit (o .body )
1538+ parameters = [i for i in o .parameters if i not in self .mapper ]
1539+ return o ._rebuild (body = body , parameters = parameters )
1540+
15291541 def visit_KernelLaunch (self , o ):
15301542 # Remove kernel args if they are to be hardcoded
15311543 arguments = [i for i in o .arguments if i not in self .mapper ]
@@ -1554,23 +1566,8 @@ def visit_Operator(self, o, **kwargs):
15541566 state = o .__getstate__ ()
15551567 state ['parameters' ] = parameters
15561568 state ['body' ] = body
1557-
1558- # TODO: Also rebuild the _func_table for the Operator
1559- # TODO: This is somewhat incongruent with the visitor and should be refactored
1560-
1561- func_table = OrderedDict ()
1562- for k , v in o ._func_table .items ():
1563- root = v .root
1564- local = v .local
1565-
1566- body = self ._visit (root .body )
1567- parameters = tuple (i for i in root .parameters if i not in self .mapper )
1568-
1569- new_root = root ._rebuild (body = body , parameters = parameters )
1570-
1571- func_table [k ] = MetaCall (root = new_root , local = local )
1572-
1573- state ['_func_table' ] = func_table
1569+ # Modify the _func_table to ensure callbacks are specialized
1570+ state ['_func_table' ] = self ._visit (o ._func_table )
15741571
15751572 try :
15761573 state .pop ('ccode' )
0 commit comments