From beda967dc54e046e122ea993d86c2fe92601c484 Mon Sep 17 00:00:00 2001 From: jjenista Date: Fri, 30 Nov 2007 00:00:25 +0000 Subject: [PATCH] Fixed a bug where OwnershipGraph.writeGraph() visits heap roots that have already been visited by checking if the node is in the visited set at the top of the traverseHeapNodes() instead of before visiting children. Also added more interesting examples in the testing directory. --- .../OwnershipAnalysis/OwnershipAnalysis.java | 10 +- .../OwnershipAnalysis/OwnershipGraph.java | 8 +- .../OwnershipAnalysisTest/test01/makefile | 4 + .../OwnershipAnalysisTest/test01/test01.java | 95 +++++++++++++------ 4 files changed, 81 insertions(+), 36 deletions(-) diff --git a/Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java b/Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java index 8cfaf953..e2c2c520 100644 --- a/Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java +++ b/Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java @@ -122,7 +122,7 @@ public class OwnershipAnalysis { case FKind.FlatOpNode: FlatOpNode fon = (FlatOpNode) fn; - if(fon.getOp().getOp()==Operation.ASSIGN) { + if( fon.getOp().getOp() == Operation.ASSIGN ) { src = fon.getLeft(); dst = fon.getDest(); og.assignTempToTemp( src, dst ); @@ -136,9 +136,11 @@ public class OwnershipAnalysis { src = ffn.getSrc(); dst = ffn.getDst(); fld = ffn.getField(); - og.assignTempToField( src, dst, fld ); - nodeDescription = "Field"; - writeGraph = true; + if( !fld.getType().isPrimitive() ) { + og.assignTempToField( src, dst, fld ); + nodeDescription = "Field"; + writeGraph = true; + } break; case FKind.FlatSetFieldNode: diff --git a/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java b/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java index 3109b66f..db37c679 100644 --- a/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java +++ b/Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java @@ -490,6 +490,10 @@ public class OwnershipGraph { TempDescriptor td, HashSet visited ) throws java.io.IOException { + + if( visited.contains( ohrn ) ) { + return; + } visited.add( ohrn ); switch( mode ) { @@ -534,9 +538,7 @@ public class OwnershipGraph { break; } - if( !visited.contains( ohrnChild ) ) { - traverseHeapNodes( mode, ohrnChild, bw, td, visited ); - } + traverseHeapNodes( mode, ohrnChild, bw, td, visited ); } } } diff --git a/Robust/src/Tests/OwnershipAnalysisTest/test01/makefile b/Robust/src/Tests/OwnershipAnalysisTest/test01/makefile index 2ff00ccb..b312633c 100644 --- a/Robust/src/Tests/OwnershipAnalysisTest/test01/makefile +++ b/Robust/src/Tests/OwnershipAnalysisTest/test01/makefile @@ -14,6 +14,10 @@ view: PNGs PNGs: DOTs rm -f *Startup*.dot + #rm -f *FN*Method*.dot + rm -f *FN*Op*.dot + rm -f *FN*Field*.dot + rm -f *FN*SetField*.dot d2p *.dot DOTs: $(PROGRAM).bin diff --git a/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java b/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java index 5e3bd7d5..dccb3223 100644 --- a/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java +++ b/Robust/src/Tests/OwnershipAnalysisTest/test01/test01.java @@ -1,39 +1,76 @@ -public class Thing { int z; public Thing(){} } +public class Parameter { + flag w; + int a, b; + Parameter f, g; + public Parameter() { + a = 0; b = 0; f = null; g = null; + } +} -public class P1 { - public P1(){} - flag a; - int x; - Thing m; +task Startup( StartupObject s{ initialstate } ) { + Parameter p1 = new Parameter(){!w}; + Parameter p2 = new Parameter(){!w}; + taskexit( s{ !initialstate } ); } -public class P2 { - public P2(){} - flag b; - int y; - Thing n; +task aliasFromObjectAssignment + ( Parameter p1{!w}, Parameter p2{!w} ) { + + p1.f = p2.g; + + taskexit( p1{w}, p2{w} ); } -public class P3 { - public P2(){} - flag b; - int y; - Thing n; +task noAliasFromPrimitiveAssignment + ( Parameter p1{!w}, Parameter p2{!w} ) { + + p1.a = p2.b; + + taskexit( p1{w}, p2{w} ); } -task Startup( StartupObject s{ initialstate } ) { - P1 p1f = new P1(){!a}; - P2 p2f = new P2(){!b}; - P1 p1t = new P1(){ a}; - P2 p2t = new P2(){ b}; - taskexit( s{ !initialstate } ); +task aliasWithTwoLinks + ( Parameter p1{!w}, Parameter p2{!w} ) { + + Parameter j = p1.f; + p2.f = j; + + taskexit( p1{w}, p2{w} ); } -task A( P1 p1f{!a}, - P2 p2f{!b} ) -{ - p1f.m = p2f.n; +task aliasWithThreeLinks + ( Parameter p1{!w}, Parameter p2{!w} ) { + + Parameter j = p1.f; + Parameter k = j; + p2.f = k; - taskexit( p1f{ a}, - p2f{ b} ); -} \ No newline at end of file + taskexit( p1{w}, p2{w} ); +} + +task noAliasBreakLinks + ( Parameter p1{!w}, Parameter p2{!w} ) { + + Parameter j = p1.f; + Parameter k = j; + k = p2.f; + p2.f = k; + + taskexit( p1{w}, p2{w} ); +} + +task possibleAliasConditional + ( Parameter p1{!w}, Parameter p2{!w} ) { + + Parameter y; + + if( p1.a == 0 ) { + y = p1.f; + } else { + y = p2.f; + } + + p2.g = y; + + taskexit( p1{w}, p2{w} ); +} -- 2.34.1