From fe12b77d85d99f695923ea785dd59c44fdaa2aea Mon Sep 17 00:00:00 2001 From: dolby-oss Date: Mon, 18 Feb 2008 15:18:00 +0000 Subject: [PATCH] committed patch from Evan Battaglia to support outer.new inner() form. Thanks! git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@2592 f5eafffb-2e1d-0410-98e4-8ec43c5233c4 --- .../META-INF/MANIFEST.MF | 2 +- .../ibm/wala/cast/java/test/JavaIRTests.java | 92 +++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF index 706cf6ff2..7b6342ca8 100644 --- a/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.cast.java.test/META-INF/MANIFEST.MF @@ -10,6 +10,6 @@ Require-Bundle: com.ibm.wala.core.tests, com.ibm.wala.cast, com.ibm.wala.core, org.eclipse.core.runtime, - org.junit + org.junit4 Eclipse-LazyStart: true Export-Package: com.ibm.wala.cast.java.test diff --git a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java index 691baf7dd..2a9652fb9 100644 --- a/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java +++ b/com.ibm.wala.cast.java.test/src/com/ibm/wala/cast/java/test/JavaIRTests.java @@ -14,6 +14,7 @@ package com.ibm.wala.cast.java.test; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; @@ -25,6 +26,7 @@ import junit.framework.Assert; import com.ibm.wala.cast.java.client.JavaSourceAnalysisEngine; import com.ibm.wala.cast.java.ipa.slicer.AstJavaSlicer; import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl; +import com.ibm.wala.cast.java.ssa.EnclosingObjectReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil; import com.ibm.wala.core.tests.slicer.SlicerTest; @@ -35,6 +37,8 @@ import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.Entrypoint; import com.ibm.wala.ipa.callgraph.impl.Util; +import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.LocalPointerKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ipa.slicer.SDG; @@ -374,6 +378,94 @@ public class JavaIRTests extends IRTests { }), true); } + public void testInnerClassA() { + Pair x = runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), new ArrayList(), true); + + // can't do an IRAssertion() -- we need the pointer analysis + + CallGraph cg = (CallGraph) x.fst; + PointerAnalysis pa = (PointerAnalysis) x.snd; + + Iterator iter = cg.iterator(); + while ( iter.hasNext() ) { + CGNode n = iter.next(); + + // assume in the test we have one enclosing instruction for each of the methods here. + String methodSigs[] = { "InnerClassA$AB.getA_X_from_AB()I", + "InnerClassA$AB.getA_X_thru_AB()I", + "InnerClassA$AB$ABSubA.getA_X()I", + "InnerClassA$AB$ABA$ABAA.getABA_X()I", + "InnerClassA$AB$ABA$ABAA.getA_X()I", + "InnerClassA$AB$ABA$ABAB.getABA_X()I", + "InnerClassA$AB$ABSubA$ABSubAA.getABA_X()I", + "InnerClassA$AB$ABSubA$ABSubAA.getA_X()I", }; + + // each type suffixed by "," + String ikConcreteTypeStrings[ ]= { + "LInnerClassA,", + "LInnerClassA,", + "LInnerClassA,", + "LInnerClassA$AB$ABSubA,LInnerClassA$AB$ABA,", + "LInnerClassA,", + "LInnerClassA$AB$ABA,", + "LInnerClassA$AB$ABSubA,", + "LInnerClassA,", + }; + + Assert.assertTrue ( "Buggy test", methodSigs.length == ikConcreteTypeStrings.length ); + for ( int i = 0; i < methodSigs.length; i++ ) { + if ( n.getMethod().getSignature().equals(methodSigs[i]) ) { + // find enclosing instruction + for ( SSAInstruction instr: n.getIR().getInstructions() ) { + if ( instr instanceof EnclosingObjectReference ) { + String allIks = ""; + for (InstanceKey ik: pa.getPointsToSet(new LocalPointerKey(n,instr.getDef()))) + allIks += ik.getConcreteType().getName() +","; + // System.out.printf("in method %s, got ik %s\n", methodSigs[i], allIks); + + Assert.assertTrue("assertion failed: expecting ik " + ikConcreteTypeStrings[i] + " in method " + methodSigs[i] + ", got " + allIks + "\n", + allIks.equals(ikConcreteTypeStrings[i])); + + break; + } + } + } + } + } + + + } + + public void testInnerClassSuper() { + Pair x = runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), new ArrayList(), true); + + // can't do an IRAssertion() -- we need the pointer analysis + + CallGraph cg = (CallGraph) x.fst; + PointerAnalysis pa = (PointerAnalysis) x.snd; + + Iterator iter = cg.iterator(); + while ( iter.hasNext() ) { + CGNode n = iter.next(); + if ( n.getMethod().getSignature().equals("LInnerClassSuper$SuperOuter.test()V") ) { + // find enclosing instruction + for ( SSAInstruction instr: n.getIR().getInstructions() ) { + if ( instr instanceof EnclosingObjectReference ) { + String allIks = ""; + for (InstanceKey ik: pa.getPointsToSet(new LocalPointerKey(n,instr.getDef()))) + allIks += ik.getConcreteType().getName() +","; + Assert.assertTrue("assertion failed: expecting ik \"LSub,\" in method, got \"" + allIks + "\"\n", + allIks.equals("LSub,")); + + break; + } + } + } + } + + + } + public void testLocalClass() { runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), Arrays.asList(