def _buildInplaceAssignAttributeNode(provider, lookup_source, attribute_name, tmp_variable1, tmp_variable2, operator, expression, source_ref): # First assign the target value to a temporary variable. preserve_to_tmp = StatementAssignmentVariable( variable=tmp_variable1, source=ExpressionAttributeLookup(source=lookup_source.makeClone(), attribute_name=attribute_name, source_ref=source_ref), source_ref=source_ref) # Second assign the in-place result to a temporary variable inplace_to_tmp = StatementAssignmentVariable( variable=tmp_variable2, source=makeExpressionOperationBinaryInplace( operator=operator, left=ExpressionTempVariableRef(variable=tmp_variable1, source_ref=source_ref), right=expression, source_ref=source_ref), source_ref=source_ref) # Third, copy it over, if the reference values change, i.e. IsNot is true. copy_back_from_tmp = StatementConditional( condition=ExpressionComparisonIsNOT( left=ExpressionTempVariableRef(variable=tmp_variable1, source_ref=source_ref), right=ExpressionTempVariableRef(variable=tmp_variable2, source_ref=source_ref), source_ref=source_ref), yes_branch=makeStatementsSequenceFromStatement( statement=StatementAssignmentAttribute( expression=lookup_source.makeClone(), attribute_name=attribute_name, source=ExpressionTempVariableRef(variable=tmp_variable2, source_ref=source_ref), source_ref=source_ref)), no_branch=None, source_ref=source_ref) copy_back_from_tmp = makeTryFinallyStatement( provider=provider, tried=copy_back_from_tmp, final=StatementReleaseVariable(variable=tmp_variable2, source_ref=source_ref), source_ref=source_ref) return ( preserve_to_tmp, # making sure the above temporary variable is deleted in any case. makeTryFinallyStatement(provider=provider, tried=( inplace_to_tmp, copy_back_from_tmp, ), final=StatementReleaseVariable( variable=tmp_variable1, source_ref=source_ref), source_ref=source_ref))
def _buildInplaceAssignVariableNode(variable_ref, tmp_variable1, tmp_variable2, operator, expression, source_ref): assert variable_ref.isExpressionTargetVariableRef(), variable_ref # First assign the target value to a temporary variable. preserve_to_tmp = StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef(variable=tmp_variable1, source_ref=source_ref), source=ExpressionVariableRef( variable_name=variable_ref.getVariableName(), source_ref=source_ref), source_ref=source_ref) # Second assign the inplace result to a temporary variable inplace_to_tmp = StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef(variable=tmp_variable2, source_ref=source_ref), source=ExpressionOperationBinaryInplace(operator=operator, left=ExpressionTempVariableRef( variable=tmp_variable1, source_ref=source_ref), right=expression, source_ref=source_ref), source_ref=source_ref) # Third, copy it over, if the reference values change, i.e. IsNot is true. copy_back_from_tmp = StatementConditional( condition=ExpressionComparisonIsNOT( left=ExpressionTempVariableRef(variable=tmp_variable1, source_ref=source_ref), right=ExpressionTempVariableRef(variable=tmp_variable2, source_ref=source_ref), source_ref=source_ref), yes_branch=makeStatementsSequenceFromStatement( statement=StatementAssignmentVariable( variable_ref=variable_ref.makeCloneAt(source_ref), source=ExpressionTempVariableRef(variable=tmp_variable2, source_ref=source_ref), source_ref=source_ref)), no_branch=None, source_ref=source_ref) return ( preserve_to_tmp, # making sure the above temporary variable is deleted in any case. makeTryFinallyStatement( tried=(inplace_to_tmp, copy_back_from_tmp), final=( StatementDelVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable1, source_ref=source_ref), tolerant=False, source_ref=source_ref), StatementDelVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable2, source_ref=source_ref), tolerant=True, source_ref=source_ref), ), source_ref=source_ref))
def _buildInplaceAssignAttributeNode(provider, lookup_source, attribute_name, tmp_variable1, tmp_variable2, operator, expression, source_ref): return ( # First assign the target value to a temporary variable. StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable1.makeReference(provider), source_ref=source_ref), source=ExpressionAttributeLookup( expression=lookup_source.makeCloneAt(source_ref), attribute_name=attribute_name, source_ref=source_ref), source_ref=source_ref), # Second assign the inplace result to a temporary variable. StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable2.makeReference(provider), source_ref=source_ref), source=ExpressionOperationBinaryInplace( operator=operator, left=ExpressionTempVariableRef( variable=tmp_variable1.makeReference(provider), source_ref=source_ref), right=expression, source_ref=source_ref), source_ref=source_ref), # Copy it over, if the reference values change, i.e. IsNot is true. StatementConditional( condition=ExpressionComparisonIsNOT( left=ExpressionTempVariableRef( variable=tmp_variable1.makeReference(provider), source_ref=source_ref), right=ExpressionTempVariableRef( variable=tmp_variable2.makeReference(provider), source_ref=source_ref), source_ref=source_ref), yes_branch=makeStatementsSequenceFromStatement( statement=StatementAssignmentAttribute( expression=lookup_source.makeCloneAt(source_ref), attribute_name=attribute_name, source=ExpressionTempVariableRef( variable=tmp_variable2.makeReference(provider), source_ref=source_ref), source_ref=source_ref)), no_branch=None, source_ref=source_ref))
def _buildInplaceAssignVariableNode(result, variable_ref, tmp_variable1, tmp_variable2, operator, expression, source_ref): assert variable_ref.isExpressionTargetVariableRef(), variable_ref return ( # First assign the target value to a temporary variable. StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable1.makeReference(result), source_ref=source_ref), source=ExpressionVariableRef( variable_name=variable_ref.getVariableName(), source_ref=source_ref), source_ref=source_ref), # Second assign the inplace result to a temporary variable. StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_variable2.makeReference(result), source_ref=source_ref), source=ExpressionOperationBinaryInplace( operator=operator, left=ExpressionTempVariableRef( variable=tmp_variable1.makeReference(result), source_ref=source_ref), right=expression, source_ref=source_ref), source_ref=source_ref), # Copy it over, if the reference values change, i.e. IsNot is true. StatementConditional( condition=ExpressionComparisonIsNOT( left=ExpressionTempVariableRef( variable=tmp_variable1.makeReference(result), source_ref=source_ref), right=ExpressionTempVariableRef( variable=tmp_variable2.makeReference(result), source_ref=source_ref), source_ref=source_ref), yes_branch=makeStatementsSequenceFromStatement( statement=StatementAssignmentVariable( variable_ref=variable_ref.makeCloneAt(source_ref), source=ExpressionTempVariableRef( variable=tmp_variable2.makeReference(result), source_ref=source_ref), source_ref=source_ref)), no_branch=None, source_ref=source_ref))
def buildLambdaNode(provider, node, source_ref): # Many details to deal with, pylint: disable=R0914 assert getKind(node) == "Lambda" function_kind, flags, _written_variables, _non_local_declarations, _global_declarations = \ detectFunctionBodyKind( nodes = (node.body,) ) outer_body, function_body, code_object = buildFunctionWithParsing( provider=provider, function_kind=function_kind, name="<lambda>", function_doc=None, flags=flags, node=node, source_ref=source_ref) if function_kind == "Function": code_body = function_body else: code_body = ExpressionGeneratorObjectBody(provider=function_body, name="<lambda>", flags=set(), source_ref=source_ref) if function_kind == "Generator": function_body.setBody( makeStatementsSequenceFromStatement(statement=StatementReturn( expression=ExpressionMakeGeneratorObject( generator_ref=ExpressionFunctionRef( function_body=code_body, source_ref=source_ref), code_object=code_object, source_ref=source_ref), source_ref=source_ref))) defaults = buildNodeList(provider, node.args.defaults, source_ref) kw_defaults = buildParameterKwDefaults(provider=provider, node=node, function_body=function_body, source_ref=source_ref) body = buildNode( provider=code_body, node=node.body, source_ref=source_ref, ) if function_kind == "Generator": if python_version < 270: tmp_return_value = code_body.allocateTempVariable( temp_scope=None, name="yield_return") statements = (StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_return_value, source_ref=source_ref, ), source=body, source_ref=source_ref), StatementConditional( condition=ExpressionComparisonIsNOT( left=ExpressionTempVariableRef( variable=tmp_return_value, source_ref=source_ref, ), right=ExpressionConstantRef( constant=None, source_ref=source_ref), source_ref=source_ref), yes_branch=makeStatementsSequenceFromStatement( statement=StatementExpressionOnly( expression=ExpressionYield( expression=ExpressionTempVariableRef( variable=tmp_return_value, source_ref=source_ref, ), source_ref=source_ref), source_ref=source_ref)), no_branch=None, source_ref=source_ref)) body = makeTryFinallyStatement(provider=provider, tried=statements, final=StatementReleaseVariable( variable=tmp_return_value, source_ref=source_ref), source_ref=source_ref) else: body = StatementExpressionOnly(expression=body, source_ref=source_ref) else: body = StatementReturn(expression=body, source_ref=source_ref) body = StatementsFrame( statements=mergeStatements((body, )), code_object=code_object, guard_mode="generator" if function_kind == "Generator" else "full", source_ref=body.getSourceReference()) body = makeStatementsSequenceFromStatement(statement=body, ) code_body.setBody(body) annotations = buildParameterAnnotations(provider, node, source_ref) return ExpressionFunctionCreation(function_ref=ExpressionFunctionRef( function_body=outer_body, source_ref=source_ref), code_object=code_object, defaults=defaults, kw_defaults=kw_defaults, annotations=annotations, source_ref=source_ref)
def buildLambdaNode(provider, node, source_ref): assert getKind(node) == "Lambda" parameters = buildParameterSpec(provider, "<lambda>", node, source_ref) function_body = ExpressionFunctionBody( provider=provider, name="<lambda>", doc=None, parameters=parameters, source_ref=source_ref, ) defaults = buildNodeList(provider, node.args.defaults, source_ref) kw_defaults = buildParameterKwDefaults(provider=provider, node=node, function_body=function_body, source_ref=source_ref) body = buildNode( provider=function_body, node=node.body, source_ref=source_ref, ) if function_body.isGenerator(): if Utils.python_version < 270: tmp_return_value = function_body.allocateTempVariable( temp_scope=None, name="yield_return") statements = (StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_return_value, source_ref=source_ref, ), source=body, source_ref=source_ref), StatementConditional( condition=ExpressionComparisonIsNOT( left=ExpressionTempVariableRef( variable=tmp_return_value, source_ref=source_ref, ), right=ExpressionConstantRef( constant=None, source_ref=source_ref), source_ref=source_ref), yes_branch=makeStatementsSequenceFromStatement( statement=StatementExpressionOnly( expression=ExpressionYield( expression=ExpressionTempVariableRef( variable=tmp_return_value, source_ref=source_ref, ), source_ref=source_ref), source_ref=source_ref)), no_branch=None, source_ref=source_ref)) body = makeTryFinallyStatement(tried=statements, final=StatementReleaseVariable( variable=tmp_return_value, tolerant=True, source_ref=source_ref), source_ref=source_ref) else: body = StatementExpressionOnly(expression=body, source_ref=source_ref) else: body = StatementReturn(expression=body, source_ref=source_ref) body = StatementsFrame( statements=mergeStatements((body, )), guard_mode="generator" if function_body.isGenerator() else "full", var_names=parameters.getCoArgNames(), arg_count=parameters.getArgumentCount(), kw_only_count=parameters.getKwOnlyParameterCount(), has_starlist=parameters.getStarListArgumentName() is not None, has_stardict=parameters.getStarDictArgumentName() is not None, code_name="<lambda>", source_ref=body.getSourceReference()) body = makeStatementsSequenceFromStatement(statement=body, ) function_body.setBody(body) annotations = buildParameterAnnotations(provider, node, source_ref) return ExpressionFunctionCreation(function_ref=ExpressionFunctionRef( function_body=function_body, source_ref=source_ref), defaults=defaults, kw_defaults=kw_defaults, annotations=annotations, source_ref=source_ref)
def buildLambdaNode(provider, node, source_ref): assert getKind(node) == "Lambda" function_body = ExpressionFunctionBody( provider=provider, name="<lambda>", doc=None, parameters=buildParameterSpec("<lambda>", node, source_ref), source_ref=source_ref, ) defaults = buildNodeList(provider, node.args.defaults, source_ref) kw_defaults = buildParameterKwDefaults(provider, node, function_body, source_ref) body = buildNode( provider=function_body, node=node.body, source_ref=source_ref, ) if function_body.isGenerator(): if Utils.python_version < 270: temp_block = StatementTempBlock(source_ref=source_ref, ) tmp_return_value = temp_block.getTempVariable("yield_return") statements = (StatementAssignmentVariable( variable_ref=ExpressionTargetTempVariableRef( variable=tmp_return_value.makeReference(temp_block), source_ref=source_ref, ), source=body, source_ref=source_ref), StatementConditional( condition=ExpressionComparisonIsNOT( left=ExpressionTempVariableRef( variable=tmp_return_value.makeReference( temp_block), source_ref=source_ref, ), right=ExpressionConstantRef( constant=None, source_ref=source_ref), source_ref=source_ref), yes_branch=makeStatementsSequenceFromStatement( statement=StatementExpressionOnly( expression=ExpressionYield( expression=ExpressionTempVariableRef( variable=tmp_return_value. makeReference(temp_block), source_ref=source_ref, ), source_ref=source_ref), source_ref=source_ref)), no_branch=None, source_ref=source_ref)) temp_block.setBody( StatementsSequence(statements=statements, source_ref=source_ref)) body = temp_block else: body = StatementExpressionOnly(expression=body, source_ref=source_ref) else: body = StatementReturn(expression=body, source_ref=source_ref) body = StatementsFrame( statements=(body, ), guard_mode="generator" if function_body.isGenerator() else "full", arg_names=function_body.getParameters().getCoArgNames(), kw_only_count=function_body.getParameters().getKwOnlyParameterCount(), code_name="<lambda>", source_ref=body.getSourceReference()) function_body.setBody(body) annotations = buildParameterAnnotations(provider, node, source_ref) return ExpressionFunctionCreation(function_ref=ExpressionFunctionRef( function_body=function_body, source_ref=source_ref), defaults=defaults, kw_defaults=kw_defaults, annotations=annotations, source_ref=source_ref)