Skip to content

Commit

Permalink
Improved the handling of renamed variables declared within anonymous …
Browse files Browse the repository at this point in the history
…class declarations present in mapped statements.

This is a fix for case 521|1-2 found in project JRuby-1.4.0 (CloneDR results)
org.jruby.compiler.ASTCompiler.compileMultipleAsgnAssignment(Node,BodyCompiler,boolean):void  lines 2784-2792
org.jruby.compiler.ASTCompiler19.compileMultipleAsgn19Assignment(Node,BodyCompiler,boolean):void  lines 304-312
  • Loading branch information
tsantalis committed Aug 2, 2016
1 parent 0631698 commit e7c57bc
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,11 @@ public Set<MethodObject> getIndirectlyAccessedLocalMethodsG2() {
public Map<VariableBindingKeyPair, ArrayList<VariableDeclaration>> getDeclaredLocalVariablesInMappedNodes() {
return preconditionExaminer.getDeclaredLocalVariablesInMappedNodes();
}


public Set<VariableBindingKeyPair> getDeclaredLocalVariablesInMappedNodesWithinAnonymousClass() {
return preconditionExaminer.getDeclaredLocalVariablesInMappedNodesWithinAnonymousClass();
}

public Set<VariableDeclaration> getDeclaredLocalVariablesInAdditionallyMatchedNodesG1() {
return preconditionExaminer.getDeclaredLocalVariablesInAdditionallyMatchedNodesG1();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ public class PreconditionExaminer {
private TreeSet<PDGNode> nonMappedNodesG2;
private Map<VariableBindingKeyPair, ArrayList<AbstractVariable>> commonPassedParameters;
private Map<VariableBindingKeyPair, ArrayList<AbstractVariable>> declaredLocalVariablesInMappedNodes;
private Map<VariableBindingKeyPair, ArrayList<AbstractVariable>> declaredLocalVariablesInMappedNodesWithinAnonymousClass;
//includes used and modified fields
private Set<AbstractVariable> directlyAccessedLocalFieldsG1;
private Set<AbstractVariable> directlyAccessedLocalFieldsG2;
Expand Down Expand Up @@ -169,6 +170,7 @@ public PreconditionExaminer(PDG pdg1, PDG pdg2,
this.nonMappedNodesG2 = new TreeSet<PDGNode>();
this.commonPassedParameters = new LinkedHashMap<VariableBindingKeyPair, ArrayList<AbstractVariable>>();
this.declaredLocalVariablesInMappedNodes = new LinkedHashMap<VariableBindingKeyPair, ArrayList<AbstractVariable>>();
this.declaredLocalVariablesInMappedNodesWithinAnonymousClass = new LinkedHashMap<VariableBindingKeyPair, ArrayList<AbstractVariable>>();
this.directlyAccessedLocalFieldsG1 = new LinkedHashSet<AbstractVariable>();
this.directlyAccessedLocalFieldsG2 = new LinkedHashSet<AbstractVariable>();
this.indirectlyAccessedLocalFieldsG1 = new LinkedHashSet<AbstractVariable>();
Expand Down Expand Up @@ -526,6 +528,7 @@ private void findPassedParameters() {
PDGNode nodeG1 = nodeMapping.getNodeG1();
PDGNode nodeG2 = nodeMapping.getNodeG2();
List<AbstractVariable> nonAnonymousDeclaredVariablesG1 = new ArrayList<AbstractVariable>();
List<AbstractVariable> anonymousDeclaredVariablesG1 = new ArrayList<AbstractVariable>();
Iterator<AbstractVariable> declaredVariableIteratorG1 = nodeG1.getDeclaredVariableIterator();
while(declaredVariableIteratorG1.hasNext()) {
AbstractVariable declaredVariableG1 = declaredVariableIteratorG1.next();
Expand All @@ -536,10 +539,14 @@ private void findPassedParameters() {
if(!declaredVariableBinding.getDeclaringMethod().getDeclaringClass().isAnonymous()) {
nonAnonymousDeclaredVariablesG1.add(declaredVariableG1);
}
else {
anonymousDeclaredVariablesG1.add(declaredVariableG1);
}
}
}
}
List<AbstractVariable> nonAnonymousDeclaredVariablesG2 = new ArrayList<AbstractVariable>();
List<AbstractVariable> anonymousDeclaredVariablesG2 = new ArrayList<AbstractVariable>();
Iterator<AbstractVariable> declaredVariableIteratorG2 = nodeG2.getDeclaredVariableIterator();
while(declaredVariableIteratorG2.hasNext()) {
AbstractVariable declaredVariableG2 = declaredVariableIteratorG2.next();
Expand All @@ -550,6 +557,9 @@ private void findPassedParameters() {
if(!declaredVariableBinding.getDeclaringMethod().getDeclaringClass().isAnonymous()) {
nonAnonymousDeclaredVariablesG2.add(declaredVariableG2);
}
else {
anonymousDeclaredVariablesG2.add(declaredVariableG2);
}
}
}
}
Expand All @@ -564,6 +574,17 @@ private void findPassedParameters() {
declaredVariableG2.getVariableBindingKey());
declaredLocalVariablesInMappedNodes.put(keyPair, declaredVariables);
}
int min2 = Math.min(anonymousDeclaredVariablesG1.size(), anonymousDeclaredVariablesG2.size());
for(int i=0; i<min2; i++) {
AbstractVariable declaredVariableG1 = anonymousDeclaredVariablesG1.get(i);
AbstractVariable declaredVariableG2 = anonymousDeclaredVariablesG2.get(i);
ArrayList<AbstractVariable> declaredVariables = new ArrayList<AbstractVariable>();
declaredVariables.add(declaredVariableG1);
declaredVariables.add(declaredVariableG2);
VariableBindingKeyPair keyPair = new VariableBindingKeyPair(declaredVariableG1.getVariableBindingKey(),
declaredVariableG2.getVariableBindingKey());
declaredLocalVariablesInMappedNodesWithinAnonymousClass.put(keyPair, declaredVariables);
}
Set<AbstractVariable> dataDependences1 = nodeG1.incomingDataDependencesFromNodesDeclaringOrDefiningVariables();
Set<AbstractVariable> dataDependences2 = nodeG2.incomingDataDependencesFromNodesDeclaringOrDefiningVariables();
dataDependences1.retainAll(passedParametersG1);
Expand Down Expand Up @@ -1348,7 +1369,11 @@ public Map<VariableBindingKeyPair, ArrayList<VariableDeclaration>> getDeclaredLo
}
return declaredVariables;
}


public Set<VariableBindingKeyPair> getDeclaredLocalVariablesInMappedNodesWithinAnonymousClass() {
return declaredLocalVariablesInMappedNodesWithinAnonymousClass.keySet();
}

public Set<VariableDeclaration> getDeclaredLocalVariablesInAdditionallyMatchedNodesG1() {
Set<VariableDeclaration> declaredVariables = new LinkedHashSet<VariableDeclaration>();
Set<VariableDeclaration> variableDeclarationsAndAccessedFieldsInMethod1 = pdg1.getVariableDeclarationsAndAccessedFieldsInMethod();
Expand Down Expand Up @@ -1465,8 +1490,8 @@ private void findRenamedVariables(Set<BindingSignaturePair> renamedVariables, Se
IMethodBinding declaringMethod2 = variableBinding2.getDeclaringMethod();
IMethodBinding method1 = pdg1.getMethod().getMethodDeclaration().resolveBinding();
IMethodBinding method2 = pdg2.getMethod().getMethodDeclaration().resolveBinding();
if(declaringMethod1 != null && declaringMethod1.isEqualTo(method1) &&
declaringMethod2 != null && declaringMethod2.isEqualTo(method2) &&
if(/*declaringMethod1 != null && declaringMethod1.isEqualTo(method1) &&
declaringMethod2 != null && declaringMethod2.isEqualTo(method2) &&*/
!alreadyContainsOneOfTheKeys(variableNameMismatches, nodeDifference.getBindingSignaturePair())) {
variableNameMismatches.add(nodeDifference.getBindingSignaturePair());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1832,7 +1832,7 @@ private Set<VariableDeclaration> getFieldsAccessedInMethod(Set<VariableDeclarati
for(Expression expression : simpleNames) {
SimpleName simpleName = (SimpleName)expression;
IBinding binding = simpleName.resolveBinding();
if(binding.getKind() == IBinding.VARIABLE) {
if(binding != null && binding.getKind() == IBinding.VARIABLE) {
for(VariableDeclaration variableDeclaration : indirectlyAccessedLocalFields) {
if(variableDeclaration.resolveBinding().isEqualTo(binding)) {
fieldsAccessedInMethod.add(variableDeclaration);
Expand Down Expand Up @@ -3304,6 +3304,7 @@ private ASTNode processASTNodeWithDifferences(AST ast, ASTRewrite sourceRewriter
else {
Set<VariableBindingKeyPair> parameterBindingKeys = originalPassedParameters.keySet();
Set<VariableBindingKeyPair> commonPassedParameterBindingKeys = mapper.getCommonPassedParameters().keySet();
Set<VariableBindingKeyPair> declaredLocalVariableBindingKeysWithinAnonymousClass = mapper.getDeclaredLocalVariablesInMappedNodesWithinAnonymousClass();
Set<VariableBindingKeyPair> declaredLocalVariableBindingKeys = mapper.getDeclaredLocalVariablesInMappedNodes().keySet();
Set<VariableBindingKeyPair> localVariableBindingKeysReturnedByBlockGaps = mapper.getLocalVariablesReturnedByBlockGaps();
Set<String> declaredLocalVariableBindingKeysInAdditionallyMatchedNodes1 = mapper.getDeclaredLocalVariableBindingKeysInAdditionallyMatchedNodesG1();
Expand Down Expand Up @@ -3333,7 +3334,7 @@ private ASTNode processASTNodeWithDifferences(AST ast, ASTRewrite sourceRewriter
IBinding binding2 = oldSimpleName2.resolveBinding();
VariableBindingKeyPair keyPair = new VariableBindingKeyPair(binding.getKey(), binding2.getKey());
if(parameterBindingKeys.contains(keyPair) || commonPassedParameterBindingKeys.contains(keyPair) ||
declaredLocalVariableBindingKeys.contains(keyPair) ||
declaredLocalVariableBindingKeys.contains(keyPair) || declaredLocalVariableBindingKeysWithinAnonymousClass.contains(keyPair) ||
localVariableBindingKeysReturnedByBlockGaps.contains(keyPair) ||
declaredLocalVariableBindingKeysInAdditionallyMatchedNodes1.contains(binding.getKey()) ||
declaredLocalVariableBindingKeysInAdditionallyMatchedNodes2.contains(binding2.getKey()))
Expand All @@ -3348,7 +3349,7 @@ else if(oldExpression instanceof QualifiedName && oldExpression2 instanceof Qual
IBinding binding2 = oldSimpleName2.resolveBinding();
VariableBindingKeyPair keyPair = new VariableBindingKeyPair(binding.getKey(), binding2.getKey());
if(parameterBindingKeys.contains(keyPair) || commonPassedParameterBindingKeys.contains(keyPair) ||
declaredLocalVariableBindingKeys.contains(keyPair) ||
declaredLocalVariableBindingKeys.contains(keyPair) || declaredLocalVariableBindingKeysWithinAnonymousClass.contains(keyPair) ||
localVariableBindingKeysReturnedByBlockGaps.contains(keyPair) ||
declaredLocalVariableBindingKeysInAdditionallyMatchedNodes1.contains(binding.getKey()) ||
declaredLocalVariableBindingKeysInAdditionallyMatchedNodes2.contains(binding2.getKey()))
Expand All @@ -3362,7 +3363,7 @@ else if(oldExpression instanceof QualifiedName && oldExpression2 instanceof Qual
binding2 = oldSimpleName2.resolveBinding();
keyPair = new VariableBindingKeyPair(binding.getKey(), binding2.getKey());
if(parameterBindingKeys.contains(keyPair) || commonPassedParameterBindingKeys.contains(keyPair) ||
declaredLocalVariableBindingKeys.contains(keyPair) ||
declaredLocalVariableBindingKeys.contains(keyPair) || declaredLocalVariableBindingKeysWithinAnonymousClass.contains(keyPair) ||
declaredLocalVariableBindingKeysInAdditionallyMatchedNodes1.contains(binding.getKey()) ||
declaredLocalVariableBindingKeysInAdditionallyMatchedNodes2.contains(binding2.getKey()))
isCommonParameter = true;
Expand Down

0 comments on commit e7c57bc

Please sign in to comment.