class_docstr: Gathers inter-procedural effects on function arguments.
class_docstr_tok: ["Gathers","inter-procedural","effects","on","function","arguments","."]
code: def run(self, node):
      result = super(ArgumentEffects, self).run(node)
      candidates = set(result)
      while candidates:
          function = candidates.pop()
          for ue in enumerate(function.update_effects):
              update_effect_idx, update_effect = ue
              if not update_effect:
                  continue
              for pred in result.successors(function):
                  edge = result.edges[function, pred]
                  for fp in enumerate(edge["formal_parameters"]):
                      i, formal_parameter_idx = fp
                      # propagate the impurity backward if needed.
                      # Afterward we may need another graph iteration
                      ith_effectiv = edge["effective_parameters"][i]
                      if (
                          formal_parameter_idx == update_effect_idx
                          and not pred.update_effects[ith_effectiv]
                      ):
                          pred.update_effects[ith_effectiv] = True
                          candidates.add(pred)
      self.result = {f.func: f.update_effects for f in result}
      return self.result
  
imports: from pythran.analyses.aliases import Aliases
  from pythran.analyses.intrinsics import Intrinsics
  from pythran.analyses.global_declarations import GlobalDeclarations
  from pythran.passmanager import ModuleAnalysis
  from pythran.tables import MODULES
  from pythran.graph import DiGraph
  from pythran import intrinsic
  import gast
  from functools import reduce
label_desc: Use image node_id 3 for calling the ArgumentEffects obj's underlying member method code with example usage: obj.run(node) and returns: self