def _buildInplaceAssignSliceNode(lookup_source, lower, upper, tmp_variable1, tmp_variable2, tmp_variable3, operator, expression, source_ref): # Due to the 3 inputs, which we need to also put into temporary variables, # there are too many variables here, but they are needed. # pylint: disable=R0914 # First assign the target value, lower and upper to temporary variables. copy_to_tmp = StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable1, source_ref = source_ref ), source = lookup_source, source_ref = source_ref ) final_statements = [ StatementReleaseVariable( variable = tmp_variable1, tolerant = False, source_ref = source_ref ) ] statements = [] if lower is not None: statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable2, source_ref = source_ref ), source = lower, source_ref = source_ref ) ) final_statements.append( StatementReleaseVariable( variable = tmp_variable2, tolerant = True, source_ref = source_ref ) ) lower_ref1 = ExpressionTempVariableRef( variable = tmp_variable2, source_ref = source_ref ) lower_ref2 = ExpressionTempVariableRef( variable = tmp_variable2, source_ref = source_ref ) else: assert tmp_variable2 is None lower_ref1 = lower_ref2 = None if upper is not None: statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable3, source_ref = source_ref ), source = upper, source_ref = source_ref ) ) final_statements.append( StatementReleaseVariable( variable = tmp_variable3, tolerant = True, source_ref = source_ref ) ) upper_ref1 = ExpressionTempVariableRef( variable = tmp_variable3, source_ref = source_ref ) upper_ref2 = ExpressionTempVariableRef( variable = tmp_variable3, source_ref = source_ref ) else: assert tmp_variable3 is None upper_ref1 = upper_ref2 = None use_sliceobj = Utils.python_version >= 300 # Second assign the in-place result over the original value. if use_sliceobj: statements.append( StatementAssignmentSubscript( expression = ExpressionTempVariableRef( variable = tmp_variable1, source_ref = source_ref ), subscript = ExpressionSliceObject( lower = lower_ref1, upper = upper_ref1, step = None, source_ref = source_ref ), source = ExpressionOperationBinaryInplace( operator = operator, left = ExpressionSubscriptLookup( subscribed = ExpressionTempVariableRef( variable = tmp_variable1, source_ref = source_ref ), subscript = ExpressionSliceObject( lower = lower_ref2, upper = upper_ref2, step = None, source_ref = source_ref ), source_ref = source_ref ), right = expression, source_ref = source_ref ), source_ref = source_ref ) ) else: statements.append( StatementAssignmentSlice( expression = ExpressionTempVariableRef( variable = tmp_variable1, source_ref = source_ref ), lower = lower_ref1, upper = upper_ref1, source = ExpressionOperationBinaryInplace( operator = operator, left = ExpressionSliceLookup( expression = ExpressionTempVariableRef( variable = tmp_variable1, source_ref = source_ref ), lower = lower_ref2, upper = upper_ref2, source_ref = source_ref ), right = expression, source_ref = source_ref ), source_ref = source_ref ) ) return ( copy_to_tmp, makeTryFinallyStatement( tried = statements, final = final_statements, source_ref = source_ref ) )
def buildAssignmentStatementsFromDecoded(provider, kind, detail, source, source_ref): # This is using many variable names on purpose, so as to give names to the # unpacked detail values, and has many branches due to the many cases # dealt with, pylint: disable=R0912,R0914 if kind == "Name": variable_ref = detail return StatementAssignmentVariable( variable_ref = variable_ref, source = source, source_ref = source_ref ) elif kind == "Attribute": lookup_source, attribute_name = detail return StatementAssignmentAttribute( expression = lookup_source, attribute_name = attribute_name, source = source, source_ref = source_ref ) elif kind == "Subscript": subscribed, subscript = detail return StatementAssignmentSubscript( expression = subscribed, subscript = subscript, source = source, source_ref = source_ref ) elif kind == "Slice": lookup_source, lower, upper = detail # For Python3 there is no slicing operation, this is always done # with subscript using a slice object. For Python2, it is only done # if no "step" is provided. use_sliceobj = Utils.python_version >= 300 if use_sliceobj: return StatementAssignmentSubscript( expression = lookup_source, source = source, subscript = ExpressionSliceObject( lower = lower, upper = upper, step = None, source_ref = source_ref ), source_ref = source_ref ) else: return StatementAssignmentSlice( expression = lookup_source, lower = lower, upper = upper, source = source, source_ref = source_ref ) elif kind == "Tuple": temp_scope = provider.allocateTempScope("tuple_unpack") source_iter_var = provider.allocateTempVariable( temp_scope = temp_scope, name = "source_iter" ) statements = [ StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = source_iter_var, source_ref = source_ref ), source = ExpressionBuiltinIter1( value = source, source_ref = source_ref ), source_ref = source_ref ) ] element_vars = [ provider.allocateTempVariable( temp_scope = temp_scope, name = "element_%d" % ( element_index + 1 ) ) for element_index in range(len(detail)) ] starred = False for element_index, element in enumerate(detail): element_var = element_vars[element_index] if element[0] != "Starred": statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = element_var, source_ref = source_ref ), source = ExpressionSpecialUnpack( value = ExpressionTempVariableRef( variable = source_iter_var, source_ref = source_ref ), count = element_index + 1, source_ref = source_ref ), source_ref = source_ref ) ) else: starred = True statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = element_var, source_ref = source_ref ), source = ExpressionBuiltinList( value = ExpressionTempVariableRef( variable = source_iter_var, source_ref = source_ref ), source_ref = source_ref ), source_ref = source_ref ) ) if not starred: statements.append( StatementSpecialUnpackCheck( iterator = ExpressionTempVariableRef( variable = source_iter_var, source_ref = source_ref ), count = len(detail), source_ref = source_ref ) ) for element_index, element in enumerate(detail): if element[0] == "Starred": element = element[1] element_var = element_vars[element_index] statements.append( buildAssignmentStatementsFromDecoded( provider = provider, kind = element[0], detail = element[1], source = ExpressionTempVariableRef( variable = element_var, source_ref = source_ref ), source_ref = source_ref ) ) final_statements = [] final_statements.append( StatementReleaseVariable( variable = source_iter_var, tolerant = True, source_ref = source_ref ) ) # TODO: In that order, or reversed. for element_var in element_vars: final_statements.append( StatementReleaseVariable( variable = element_var, tolerant = True, source_ref = source_ref ) ) return makeTryFinallyStatement( tried = statements, final = final_statements, source_ref = source_ref ) else: assert False, (kind, source_ref, detail)
def _buildInplaceAssignSliceNode(provider, lookup_source, lower, upper, tmp_variable1, tmp_variable2, tmp_variable3, operator, expression, source_ref): # First assign the target value, lower and upper to temporary variables. copy_to_tmp = StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable1.makeReference(provider), source_ref = source_ref ), source = lookup_source, source_ref = source_ref ) final_statements = [ StatementDelVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable1.makeReference(provider), source_ref = source_ref ), tolerant = False, source_ref = source_ref ) ] statements = [] if lower is not None: statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable2.makeReference(provider), source_ref = source_ref ), source = lower, source_ref = source_ref ) ) final_statements.append( StatementDelVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable2.makeReference(provider), source_ref = source_ref ), tolerant = True, source_ref = source_ref ) ) lower_ref1 = ExpressionTempVariableRef( variable = tmp_variable2.makeReference(provider), source_ref = source_ref ) lower_ref2 = ExpressionTempVariableRef( variable = tmp_variable2.makeReference(provider), source_ref = source_ref ) else: assert tmp_variable2 is None lower_ref1 = lower_ref2 = None if upper is not None: statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable3.makeReference( provider ), source_ref = source_ref ), source = upper, source_ref = source_ref ) ) final_statements.append( StatementDelVariable( variable_ref = ExpressionTargetTempVariableRef( variable = tmp_variable3.makeReference(provider), source_ref = source_ref ), tolerant = True, source_ref = source_ref ) ) upper_ref1 = ExpressionTempVariableRef( variable = tmp_variable3.makeReference( provider ), source_ref = source_ref ) upper_ref2 = ExpressionTempVariableRef( variable = tmp_variable3.makeReference(provider), source_ref = source_ref ) else: assert tmp_variable3 is None upper_ref1 = upper_ref2 = None # Second assign the inplace result over the original value. statements.append( StatementAssignmentSlice( expression = ExpressionTempVariableRef( variable = tmp_variable1.makeReference(provider), source_ref = source_ref ), lower = lower_ref1, upper = upper_ref1, source = ExpressionOperationBinaryInplace( operator = operator, left = ExpressionSliceLookup( expression = ExpressionTempVariableRef( variable = tmp_variable1.makeReference(provider), source_ref = source_ref ), lower = lower_ref2, upper = upper_ref2, source_ref = source_ref ), right = expression, source_ref = source_ref ), source_ref = source_ref ) ) return ( copy_to_tmp, makeTryFinallyStatement( tried = statements, final = final_statements, source_ref = source_ref ) )
def buildAssignmentStatementsFromDecoded(provider, kind, detail, source, source_ref): # This is using many variable names on purpose, so as to give names to the # unpacked detail values, pylint: disable=R0914 if kind == "Name": variable_ref = detail return StatementAssignmentVariable( variable_ref = variable_ref, source = source, source_ref = source_ref ) elif kind == "Attribute": lookup_source, attribute_name = detail return StatementAssignmentAttribute( expression = lookup_source, attribute_name = attribute_name, source = source, source_ref = source_ref ) elif kind == "Subscript": subscribed, subscript = detail return StatementAssignmentSubscript( expression = subscribed, subscript = subscript, source = source, source_ref = source_ref ) elif kind == "Slice": lookup_source, lower, upper = detail return StatementAssignmentSlice( expression = lookup_source, lower = lower, upper = upper, source = source, source_ref = source_ref ) elif kind == "Tuple": temp_scope = provider.allocateTempScope("tuple_unpack") source_iter_var = provider.allocateTempVariable( temp_scope = temp_scope, name = "source_iter" ) statements = [ StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = source_iter_var.makeReference(provider), source_ref = source_ref ), source = ExpressionBuiltinIter1( value = source, source_ref = source_ref ), source_ref = source_ref ) ] element_vars = [ provider.allocateTempVariable( temp_scope = temp_scope, name = "element_%d" % ( element_index + 1 ) ) for element_index in range(len(detail)) ] starred = False for element_index, element in enumerate(detail): element_var = element_vars[element_index] if element[0] != "Starred": statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = element_var.makeReference(provider), source_ref = source_ref ), source = ExpressionSpecialUnpack( value = ExpressionTempVariableRef( variable = source_iter_var.makeReference( provider ), source_ref = source_ref ), count = element_index + 1, source_ref = source_ref ), source_ref = source_ref ) ) else: starred = True statements.append( StatementAssignmentVariable( variable_ref = ExpressionTargetTempVariableRef( variable = element_var.makeReference(provider), source_ref = source_ref ), source = ExpressionBuiltinList( value = ExpressionTempVariableRef( variable = source_iter_var.makeReference( provider ), source_ref = source_ref ), source_ref = source_ref ), source_ref = source_ref ) ) if not starred: statements.append( StatementSpecialUnpackCheck( iterator = ExpressionTempVariableRef( variable = source_iter_var.makeReference(provider), source_ref = source_ref ), count = len(detail), source_ref = source_ref ) ) for element_index, element in enumerate(detail): if element[0] == "Starred": element = element[1] element_var = element_vars[element_index] statements.append( buildAssignmentStatementsFromDecoded( provider = provider, kind = element[0], detail = element[1], source = ExpressionTempVariableRef( variable = element_var.makeReference(provider), source_ref = source_ref ), source_ref = source_ref ) ) final_statements = [] final_statements.append( StatementDelVariable( variable_ref = ExpressionTargetTempVariableRef( variable = source_iter_var.makeReference(provider), source_ref = source_ref ), tolerant = True, source_ref = source_ref ) ) # TODO: In that order, or reversed. for element_var in element_vars: final_statements.append( StatementDelVariable( variable_ref = ExpressionTargetTempVariableRef( variable = element_var.makeReference(provider), source_ref = source_ref ), tolerant = True, source_ref = source_ref ) ) return makeTryFinallyStatement( tried = statements, final = final_statements, source_ref = source_ref ) else: assert False, ( kind, source_ref, detail )
def buildAssignmentStatementsFromDecoded(provider, kind, detail, source, source_ref): # This is using many variable names on purpose, so as to give names to the unpacked # detail values, pylint: disable=R0914 if kind == "Name": variable_ref = detail return StatementAssignmentVariable(variable_ref=variable_ref, source=source, source_ref=source_ref) elif kind == "Attribute": lookup_source, attribute_name = detail return StatementAssignmentAttribute(expression=lookup_source, attribute_name=attribute_name, source=source, source_ref=source_ref) elif kind == "Subscript": subscribed, subscript = detail return StatementAssignmentSubscript(expression=subscribed, subscript=subscript, source=source, source_ref=source_ref) elif kind == "Slice": lookup_source, lower, upper = detail return StatementAssignmentSlice(expression=lookup_source, lower=lower, upper=upper, source=source, source_ref=source_ref) elif kind == "Tuple": result = StatementTempBlock(source_ref=source_ref) source_iter_var = result.getTempVariable("source_iter") statements = [ StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=source_iter_var.makeReference(result), source_ref=source_ref), source=ExpressionBuiltinIter1(value=source, source_ref=source_ref), source_ref=source_ref) ] element_vars = [ result.getTempVariable("element_%d" % (element_index + 1)) for element_index in range(len(detail)) ] starred = False for element_index, element in enumerate(detail): if element[0] != "Starred": statements.append( StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=element_vars[element_index].makeReference( result), source_ref=source_ref), source=ExpressionSpecialUnpack( value=ExpressionTempVariableRef( variable=source_iter_var.makeReference(result), source_ref=source_ref), count=element_index + 1, source_ref=source_ref), source_ref=source_ref)) else: starred = True statements.append( StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=element_vars[element_index].makeReference( result), source_ref=source_ref), source=ExpressionBuiltinList( value=ExpressionTempVariableRef( variable=source_iter_var.makeReference(result), source_ref=source_ref), source_ref=source_ref), source_ref=source_ref)) if not starred: statements.append( StatementSpecialUnpackCheck(iterator=ExpressionTempVariableRef( variable=source_iter_var.makeReference(result), source_ref=source_ref), count=len(detail), source_ref=source_ref)) for element_index, element in enumerate(detail): if element[0] == "Starred": element = element[1] statements.append( buildAssignmentStatementsFromDecoded( provider=provider, kind=element[0], detail=element[1], source=ExpressionTempVariableRef( variable=element_vars[element_index].makeReference( result), source_ref=source_ref), source_ref=source_ref)) result.setBody( StatementsSequence(statements=statements, source_ref=source_ref)) return result else: assert False, (kind, source_ref, detail) return result
def _buildInplaceAssignSliceNode(result, lookup_source, lower, upper, tmp_variable1, tmp_variable2, tmp_variable3, operator, expression, source_ref): # First assign the target value, lower and upper to temporary variables. statements = [ StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable1.makeReference(result), source_ref=source_ref), source=lookup_source, source_ref=source_ref) ] if lower is not None: statements.append( StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable2.makeReference(result), source_ref=source_ref), source=lower, source_ref=source_ref)) lower_ref1 = ExpressionTempVariableRef( variable=tmp_variable2.makeReference(result), source_ref=source_ref) lower_ref2 = ExpressionTempVariableRef( variable=tmp_variable2.makeReference(result), source_ref=source_ref) else: assert tmp_variable2 is None lower_ref1 = lower_ref2 = None if upper is not None: statements.append( StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable3.makeReference(result), source_ref=source_ref), source=upper, source_ref=source_ref)) upper_ref1 = ExpressionTempVariableRef( variable=tmp_variable3.makeReference(result), source_ref=source_ref) upper_ref2 = ExpressionTempVariableRef( variable=tmp_variable3.makeReference(result), source_ref=source_ref) else: assert tmp_variable3 is None upper_ref1 = upper_ref2 = None # Second assign the inplace result over the original value. statements.append( StatementAssignmentSlice( expression=ExpressionTempVariableRef( variable=tmp_variable1.makeReference(result), source_ref=source_ref), lower=lower_ref1, upper=upper_ref1, source=ExpressionOperationBinaryInplace( operator=operator, left=ExpressionSliceLookup( expression=ExpressionTempVariableRef( variable=tmp_variable1.makeReference(result), source_ref=source_ref), lower=lower_ref2, upper=upper_ref2, source_ref=source_ref), right=expression, source_ref=source_ref), source_ref=source_ref)) return statements