def optimizeLocalsDictsHandles(): # Lots of cases, pylint: disable=too-many-branches changed = False locals_scopes = getLocalsDictHandles() for locals_scope_name, locals_scope in locals_scopes.items(): # Limit to Python2 classes for now: if type(locals_scope) is not LocalsDictHandle: continue if locals_scope.isMarkedForPropagation(): locals_scope.finalize() del locals_scopes[locals_scope_name] assert locals_scope not in locals_scopes continue propagate = True for variable in locals_scope.variables.values(): for variable_trace in variable.traces: if variable_trace.isAssignTrace(): # For assign traces we want the value to not have a side effect, # then we can push it down the line. TODO: Once temporary # variables and dictionary building allows for unset values # remove this if ( variable_trace.getAssignNode() .getAssignSource() .mayHaveSideEffects() ): propagate = False break elif variable_trace.isUninitTrace(): if variable_trace.previous is not None: propagate = False break elif variable_trace.isMergeTrace(): propagate = False break elif variable_trace.isUnknownTrace(): propagate = False break else: assert False, (variable, variable_trace) if propagate: locals_scope.markForLocalsDictPropagation() return changed
def optimizeLocalsDictsHandles(): # Lots of cases, pylint: disable=too-many-branches changed = False locals_scopes = getLocalsDictHandles() for locals_scope_name, locals_scope in locals_scopes.items(): # Limit to Python2 classes for now: if type(locals_scope) is not LocalsDictHandle: continue if locals_scope.isMarkedForPropagation(): locals_scope.finalize() del locals_scopes[locals_scope_name] assert locals_scope not in locals_scopes continue propagate = True for variable in locals_scope.variables.values(): for variable_trace in variable.traces: if variable_trace.isAssignTrace(): # For assign traces we want the value to not have a side effect, # then we can push it down the line. TODO: Once temporary # variables and dictionary building allows for unset values # remove this if ( variable_trace.getAssignNode().subnode_source.mayHaveSideEffects() ): propagate = False break elif variable_trace.isDeletedTrace(): propagate = False break elif variable_trace.isMergeTrace(): propagate = False break elif variable_trace.isUninitTrace(): pass elif variable_trace.isUnknownTrace(): propagate = False break else: assert False, (variable, variable_trace) if propagate: locals_scope.markForLocalsDictPropagation() return changed
def optimizeLocalsDictsHandles(): changed = False locals_scopes = getLocalsDictHandles() for locals_scope_name, locals_scope in locals_scopes.items(): # Limit to Python2 classes for now: if type(locals_scope) is not LocalsDictHandle: continue if locals_scope.isMarkedForPropagation(): locals_scope.finalize() del locals_scopes[locals_scope_name] assert locals_scope not in locals_scopes continue propagate = True for variable in locals_scope.variables.values(): for variable_trace in variable.traces: if variable_trace.isAssignTrace(): # For assign traces we want the value to not have a side effect, # then we can push it down the line. if variable_trace.getAssignNode().getAssignSource( ).mayHaveSideEffects(): propagate = False break elif variable_trace.isUninitTrace(): pass elif variable_trace.isMergeTrace(): propagate = False break elif variable_trace.isUnknownTrace(): propagate = False break else: assert False, (variable, variable_trace) if propagate: locals_scope.markForLocalsDictPropagation() return changed