2007-02-02 17:28:04 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright ( c ) 2002 - 2006 IBM Corporation .
* All rights reserved . This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1 . 0
* which accompanies this distribution , and is available at
* http : //www.eclipse.org/legal/epl-v10.html
*
* Contributors :
* IBM Corporation - initial API and implementation
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
package com.ibm.wala.cast.js.test ;
2007-07-11 21:08:26 +00:00
import java.io.IOException ;
2010-11-05 00:36:44 +00:00
import java.util.Iterator ;
2012-01-06 21:21:26 +00:00
import java.util.List ;
2010-11-05 00:36:44 +00:00
import java.util.Set ;
2007-02-02 17:28:04 +00:00
2012-01-06 21:21:26 +00:00
import junit.framework.Assert ;
2009-07-27 23:21:22 +00:00
import org.junit.Test ;
2012-03-01 02:45:51 +00:00
import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder ;
import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil ;
2010-11-05 00:36:44 +00:00
import com.ibm.wala.ipa.callgraph.CGNode ;
2007-07-11 21:08:26 +00:00
import com.ibm.wala.ipa.callgraph.CallGraph ;
2010-11-05 00:36:44 +00:00
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.callgraph.propagation.PointerKey ;
2007-07-11 21:08:26 +00:00
import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder ;
2010-11-05 00:36:44 +00:00
import com.ibm.wala.ssa.SSAInstruction ;
2009-06-22 15:06:12 +00:00
import com.ibm.wala.util.CancelException ;
2010-11-05 00:36:44 +00:00
import com.ibm.wala.util.collections.HashSetFactory ;
import com.ibm.wala.util.collections.IVector ;
2012-01-06 21:21:26 +00:00
import com.ibm.wala.util.collections.Iterator2Collection ;
2010-11-05 00:36:44 +00:00
import com.ibm.wala.util.collections.Pair ;
import com.ibm.wala.util.collections.SparseVector ;
import com.ibm.wala.util.intset.IntSetAction ;
import com.ibm.wala.util.intset.OrdinalSet ;
2007-02-02 17:28:04 +00:00
2009-07-27 23:21:22 +00:00
public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape {
2007-02-02 17:28:04 +00:00
public static void main ( String [ ] args ) {
justThisTest ( TestSimpleCallGraphShape . class ) ;
}
2012-01-27 20:15:33 +00:00
protected static final Object [ ] [ ] assertionsForArgs = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/args.js " } } ,
new Object [ ] {
" tests/args.js " ,
new String [ ] { " tests/args.js/a " } } ,
new Object [ ] { " tests/args.js/a " , new String [ ] { " tests/args.js/x " , " tests/args.js/y " } } } ;
@Test public void testArgs ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:24:32 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " args.js " ) ;
2012-01-27 20:15:33 +00:00
verifyGraphAssertions ( CG , assertionsForArgs ) ;
}
2007-02-02 17:28:04 +00:00
protected static final Object [ ] [ ] assertionsForSimple = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/simple.js " } } ,
new Object [ ] {
" tests/simple.js " ,
new String [ ] { " tests/simple.js/bad " , " tests/simple.js/silly " , " tests/simple.js/fib " , " tests/simple.js/stranger " ,
" tests/simple.js/trivial " , " tests/simple.js/rubbish " , " tests/simple.js/weirder " } } ,
new Object [ ] { " tests/simple.js/trivial " , new String [ ] { " tests/simple.js/trivial/inc " } } ,
new Object [ ] { " tests/simple.js/rubbish " ,
new String [ ] { " tests/simple.js/weirder " , " tests/simple.js/stranger " , " tests/simple.js/rubbish " } } ,
new Object [ ] { " tests/simple.js/fib " , new String [ ] { " tests/simple.js/fib " } } ,
new Object [ ] { " tests/simple.js/weirder " , new String [ ] { " prologue.js/abs " } } } ;
2007-02-02 17:28:04 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testSimple ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " simple.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForSimple ) ;
}
private static final Object [ ] [ ] assertionsForObjects = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/objects.js " } } ,
new Object [ ] { " tests/objects.js " ,
new String [ ] { " tests/objects.js/objects_are_fun " , " tests/objects.js/other " , " tests/objects.js/something " } } ,
new Object [ ] { " tests/objects.js/other " ,
new String [ ] { " tests/objects.js/something " , " tests/objects.js/objects_are_fun/nothing " } } ,
new Object [ ] { " tests/objects.js/objects_are_fun " , new String [ ] { " tests/objects.js/other " , " tests/objects.js/whatever " } } } ;
2012-01-06 21:21:26 +00:00
@Test
public void testObjects ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " objects.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForObjects ) ;
}
private static final Object [ ] [ ] assertionsForInherit = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/inherit.js " } } ,
new Object [ ] {
" tests/inherit.js " ,
new String [ ] { " tests/inherit.js/objectMasquerading " , " tests/inherit.js/objectMasquerading/Rectangle/area " ,
" tests/inherit.js/Polygon/shape " , " tests/inherit.js/sharedClassObject " ,
" tests/inherit.js/sharedClassObject/Rectangle/area " } } ,
/ *
* new Object [ ] { " tests/inherit.js/objectMasquerading " , new
2012-01-06 21:21:26 +00:00
* String [ ] { " ctor:tests/inherit.js/objectMasquerading/Rectangle " } } , new
* Object [ ] { " tests/inherit.js/sharedClassObject " , new
* String [ ] { " ctor:tests/inherit.js/sharedClassObject/Rectangle " } } ,
2008-02-13 22:34:36 +00:00
* /
2007-02-02 17:28:04 +00:00
} ;
2012-01-06 21:21:26 +00:00
@Test
public void testInherit ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " inherit.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForInherit ) ;
}
2012-01-06 21:21:26 +00:00
private static final Object [ ] [ ] assertionsForNewfn = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/newfn.js " } } ,
new Object [ ] { " tests/newfn.js " ,
new String [ ] { " suffix:ctor$1/_fromctor " , " suffix:ctor$2/_fromctor " , " suffix:ctor$3/_fromctor " } } } ;
2007-02-02 17:28:04 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testNewfn ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " newfn.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForNewfn ) ;
}
private static final Object [ ] [ ] assertionsForControlflow = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/control-flow.js " } } ,
new Object [ ] {
" tests/control-flow.js " ,
new String [ ] { " tests/control-flow.js/testSwitch " , " tests/control-flow.js/testDoWhile " ,
" tests/control-flow.js/testWhile " , " tests/control-flow.js/testFor " , " tests/control-flow.js/testReturn " } } } ;
2012-01-06 21:21:26 +00:00
@Test
public void testControlflow ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " control-flow.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForControlflow ) ;
}
private static final Object [ ] [ ] assertionsForMoreControlflow = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/more-control-flow.js " } } ,
new Object [ ] {
" tests/more-control-flow.js " ,
new String [ ] { " tests/more-control-flow.js/testSwitch " , " tests/more-control-flow.js/testIfConvertedSwitch " ,
" tests/more-control-flow.js/testDoWhile " , " tests/more-control-flow.js/testWhile " ,
" tests/more-control-flow.js/testFor " , " tests/more-control-flow.js/testReturn " } } } ;
2012-01-06 21:21:26 +00:00
@Test
public void testMoreControlflow ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " more-control-flow.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForMoreControlflow ) ;
}
2008-02-13 22:34:36 +00:00
private static final Object [ ] [ ] assertionsForForin = new Object [ ] [ ] { new Object [ ] { ROOT , new String [ ] { " tests/forin.js " } } ,
new Object [ ] { " tests/forin.js " , new String [ ] { " tests/forin.js/testForIn " } } ,
new Object [ ] { " tests/forin.js/testForIn " , new String [ ] { " tests/forin.js/testForIn1 " , " tests/forin.js/testForIn2 " } } } ;
2012-01-06 21:21:26 +00:00
@Test
public void testForin ( ) throws IOException , IllegalArgumentException , CancelException {
2012-03-01 02:45:51 +00:00
JSCFABuilder B = JSCallGraphBuilderUtil . makeScriptCGBuilder ( " tests " , " forin.js " ) ;
CallGraph CG = B . makeCallGraph ( B . getOptions ( ) ) ;
2012-07-03 22:55:02 +00:00
// JSCallGraphUtil.AVOID_DUMP = false;
2012-03-01 02:45:51 +00:00
JSCallGraphUtil . dumpCG ( B . getPointerAnalysis ( ) , CG ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForForin ) ;
}
private static final Object [ ] [ ] assertionsForSimpleLexical = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/simple-lexical.js " } } ,
new Object [ ] { " tests/simple-lexical.js " , new String [ ] { " tests/simple-lexical.js/outer " } } ,
new Object [ ] {
" tests/simple-lexical.js/outer " ,
new String [ ] { " tests/simple-lexical.js/outer/indirect " , " tests/simple-lexical.js/outer/inner " ,
" tests/simple-lexical.js/outer/inner2 " , " tests/simple-lexical.js/outer/inner3 " } } ,
new Object [ ] { " tests/simple-lexical.js/outer/inner2 " ,
2011-04-27 13:58:56 +00:00
new String [ ] { " tests/simple-lexical.js/outer/inner " , " tests/simple-lexical.js/outer/inner3 " } } ,
new Object [ ] { " tests/simple-lexical.js/outer/indirect " ,
2008-02-13 22:34:36 +00:00
new String [ ] { " tests/simple-lexical.js/outer/inner " , " tests/simple-lexical.js/outer/inner3 " } } } ;
2012-01-06 21:21:26 +00:00
@Test
public void testSimpleLexical ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " simple-lexical.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForSimpleLexical ) ;
}
2012-01-06 21:36:10 +00:00
@Test
public void testRecursiveLexical ( ) throws IOException , IllegalArgumentException , CancelException {
// just checking that we have a sufficient bailout to ensure termination
2012-02-17 20:21:59 +00:00
JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " recursive_lexical.js " ) ;
2012-01-06 21:36:10 +00:00
}
2012-01-06 21:43:58 +00:00
private static final Object [ ] [ ] assertionsForLexicalMultiple = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/lexical_multiple_calls.js " } } ,
new Object [ ] { " suffix:lexical_multiple_calls.js " , new String [ ] { " suffix:reachable1 " } } ,
new Object [ ] { " suffix:lexical_multiple_calls.js " , new String [ ] { " suffix:reachable2 " } } } ;
@Test
public void testLexicalMultiple ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " lexical_multiple_calls.js " ) ;
2012-01-06 21:43:58 +00:00
verifyGraphAssertions ( CG , assertionsForLexicalMultiple ) ;
}
2012-01-06 21:36:10 +00:00
2012-01-06 21:43:58 +00:00
2007-02-02 17:28:04 +00:00
private static final Object [ ] [ ] assertionsForTry = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/try.js " } } ,
new Object [ ] { " tests/try.js " ,
new String [ ] { " tests/try.js/tryCatch " , " tests/try.js/tryFinally " , " tests/try.js/tryCatchFinally " } } ,
new Object [ ] { " tests/try.js/tryCatch " ,
new String [ ] { " tests/try.js/targetOne " , " tests/try.js/targetTwo " , " tests/try.js/two " } } ,
new Object [ ] { " tests/try.js/tryFinally " ,
new String [ ] { " tests/try.js/targetOne " , " tests/try.js/targetTwo " , " tests/try.js/two " } } ,
new Object [ ] { " tests/try.js/tryCatchFinally " ,
new String [ ] { " tests/try.js/targetOne " , " tests/try.js/targetTwo " , " tests/try.js/three " , " tests/try.js/two " } } } ;
2012-01-06 21:21:26 +00:00
@Test
public void testTry ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:22:14 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " try.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForTry ) ;
}
private static final Object [ ] [ ] assertionsForStringOp = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/string-op.js " } } ,
new Object [ ] { " tests/string-op.js " , new String [ ] { " tests/string-op.js/getOp " , " tests/string-op.js/plusNum " } } } ;
2007-02-02 17:28:04 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testStringOp ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
PropagationCallGraphBuilder B = JSCallGraphBuilderUtil . makeScriptCGBuilder ( " tests " , " string-op.js " ) ;
2008-02-13 22:34:36 +00:00
B . getOptions ( ) . setTraceStringConstants ( true ) ;
CallGraph CG = B . makeCallGraph ( B . getOptions ( ) ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForStringOp ) ;
}
private static final Object [ ] [ ] assertionsForUpward = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/upward.js " } } ,
new Object [ ] {
" tests/upward.js " ,
2012-01-06 21:21:26 +00:00
new String [ ] { " tests/upward.js/Obj/setit " , " tests/upward.js/Obj/getit " , " tests/upward.js/tester1 " ,
" tests/upward.js/tester2 " } } } ;
2008-02-13 22:34:36 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testUpward ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " upward.js " ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForUpward ) ;
}
private static final Object [ ] [ ] assertionsForStringPrims = new Object [ ] [ ] {
2008-02-13 22:34:36 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/string-prims.js " } } ,
new Object [ ] { " tests/string-prims.js " , new String [ ] { " prologue.js/stringSplit " , " prologue.js/toUpperCase " } } } ;
2007-02-02 17:28:04 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testStringPrims ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
PropagationCallGraphBuilder B = JSCallGraphBuilderUtil . makeScriptCGBuilder ( " tests " , " string-prims.js " ) ;
2008-02-13 22:34:36 +00:00
B . getOptions ( ) . setTraceStringConstants ( true ) ;
CallGraph CG = B . makeCallGraph ( B . getOptions ( ) ) ;
2012-07-03 22:55:02 +00:00
// JSCallGraphUtil.AVOID_DUMP = false;
2012-03-01 02:45:51 +00:00
JSCallGraphUtil . dumpCG ( B . getPointerAnalysis ( ) , CG ) ;
2007-02-02 17:28:04 +00:00
verifyGraphAssertions ( CG , assertionsForStringPrims ) ;
}
2012-01-06 21:21:26 +00:00
private static final Object [ ] [ ] assertionsForNested = new Object [ ] [ ] { new Object [ ] { ROOT , new String [ ] { " tests/nested.js " } } ,
new Object [ ] { " tests/nested.js " , new String [ ] { " tests/nested.js/f " , " tests/nested.js/f/ff " , " tests/nested.js/f/ff/fff " } } } ;
@Test
public void testNested ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
PropagationCallGraphBuilder B = JSCallGraphBuilderUtil . makeScriptCGBuilder ( " tests " , " nested.js " ) ;
2008-12-02 14:09:49 +00:00
CallGraph CG = B . makeCallGraph ( B . getOptions ( ) ) ;
verifyGraphAssertions ( CG , assertionsForNested ) ;
}
2008-12-16 14:54:09 +00:00
2012-01-06 21:21:26 +00:00
private static final Object [ ] [ ] assertionsForInstanceof = new Object [ ] [ ] { new Object [ ] { ROOT ,
new String [ ] { " tests/instanceof.js " } } } ;
@Test
public void testInstanceof ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
PropagationCallGraphBuilder B = JSCallGraphBuilderUtil . makeScriptCGBuilder ( " tests " , " instanceof.js " ) ;
2008-12-16 14:54:09 +00:00
CallGraph CG = B . makeCallGraph ( B . getOptions ( ) ) ;
verifyGraphAssertions ( CG , assertionsForInstanceof ) ;
}
2009-01-30 16:33:22 +00:00
/ *
2012-01-06 21:21:26 +00:00
* private static final Object [ ] [ ] assertionsForWith = new Object [ ] [ ] { new
* Object [ ] { ROOT , new String [ ] { " tests/with.js " } } } ;
*
* @Test public void testWith ( ) throws IOException , IllegalArgumentException ,
* CancelException { PropagationCallGraphBuilder B =
* Util . makeScriptCGBuilder ( " tests " , " with.js " ) ; CallGraph CG =
* B . makeCallGraph ( B . getOptions ( ) ) ; verifyGraphAssertions ( CG ,
* assertionsForWith ) ; }
* /
@Test
public void testCrash1 ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " crash1.js " ) ;
2009-01-19 15:12:39 +00:00
verifyGraphAssertions ( CG , null ) ;
}
2012-01-06 21:21:26 +00:00
@Test
public void testCrash2 ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " crash2.js " ) ;
2009-01-30 16:33:22 +00:00
verifyGraphAssertions ( CG , null ) ;
}
2012-01-06 21:21:26 +00:00
@Test
public void testLexicalCtor ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " lexical-ctor.js " ) ;
2011-05-05 03:52:26 +00:00
verifyGraphAssertions ( CG , null ) ;
}
2009-01-30 16:33:22 +00:00
2009-02-02 20:46:51 +00:00
private static final Object [ ] [ ] assertionsForMultivar = new Object [ ] [ ] {
2012-01-06 21:21:26 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/multivar.js " } } ,
new Object [ ] { " tests/multivar.js " , new String [ ] { " tests/multivar.js/a " , " tests/multivar.js/bf " , " tests/multivar.js/c " } } } ;
2009-02-02 20:46:51 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testMultivar ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " multivar.js " ) ;
2009-02-02 20:46:51 +00:00
verifyGraphAssertions ( CG , assertionsForMultivar ) ;
}
2010-10-02 19:30:03 +00:00
private static final Object [ ] [ ] assertionsForPrototypeContamination = new Object [ ] [ ] {
2012-01-06 21:21:26 +00:00
new Object [ ] { ROOT , new String [ ] { " tests/prototype_contamination_bug.js " } } ,
new Object [ ] { " suffix:test1 " , new String [ ] { " suffix:foo_of_A " } } ,
new Object [ ] { " suffix:test2 " , new String [ ] { " suffix:foo_of_B " } } } ;
2010-10-02 19:30:03 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testProtoypeContamination ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " prototype_contamination_bug.js " ) ;
2010-10-02 19:30:03 +00:00
verifyGraphAssertions ( CG , assertionsForPrototypeContamination ) ;
verifyNoEdges ( CG , " suffix:test1 " , " suffix:foo_of_B " ) ;
verifyNoEdges ( CG , " suffix:test2 " , " suffix:foo_of_A " ) ;
}
2012-01-06 21:21:26 +00:00
@Test
public void testStackOverflowOnSsaConversionBug ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " stack_overflow_on_ssa_conversion.js " ) ;
2010-10-02 20:27:17 +00:00
// all we need is for it to finish building CG successfully.
}
2010-11-05 00:36:44 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testExtJSSwitch ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " extjs_switch.js " ) ;
2011-07-04 21:21:29 +00:00
// all we need is for it to finish building CG successfully.
}
2012-01-06 21:21:26 +00:00
@Test
public void testFunctionDotCall ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph cg = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " function_call.js " ) ;
2012-01-06 21:21:26 +00:00
for ( CGNode n : cg ) {
if ( n . getMethod ( ) . getName ( ) . toString ( ) . equals ( " call4 " ) ) {
Assert . assertEquals ( 2 , cg . getSuccNodeCount ( n ) ) ;
// ugh
List < CGNode > succs = Iterator2Collection . toList ( cg . getSuccNodes ( n ) ) ;
Assert
. assertEquals (
" [Node: <Code body of function Ltests/function_call.js/foo> Context: Everywhere, Node: <Code body of function Ltests/function_call.js/bar> Context: Everywhere] " ,
succs . toString ( ) ) ;
}
}
2011-07-05 02:32:10 +00:00
}
2012-01-06 21:26:01 +00:00
private static final Object [ ] [ ] assertionsForFunctionApply = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/function_apply.js " } } ,
2012-01-06 21:26:23 +00:00
new Object [ ] { " suffix:function_apply.js " , new String [ ] { " suffix:theOne " } } ,
new Object [ ] { " suffix:function_apply.js " , new String [ ] { " suffix:theTwo " } } } ;
2012-01-06 21:26:01 +00:00
2012-01-06 21:21:26 +00:00
@Test
public void testFunctionDotApply ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " function_apply.js " ) ;
2012-01-06 21:26:01 +00:00
verifyGraphAssertions ( CG , assertionsForFunctionApply ) ;
2012-01-06 21:19:36 +00:00
}
2012-01-06 21:27:21 +00:00
private static final Object [ ] [ ] assertionsForFunctionApply2 = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/function_apply2.js " } } ,
new Object [ ] { " suffix:function_apply2.js " , new String [ ] { " suffix:theThree " } } } ;
@Test
public void testFunctionDotApply2 ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " function_apply2.js " ) ;
2012-01-06 21:27:21 +00:00
verifyGraphAssertions ( CG , assertionsForFunctionApply2 ) ;
}
2012-01-06 21:34:04 +00:00
private static final Object [ ] [ ] assertionsForWrap1 = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/wrap1.js " } } ,
new Object [ ] { " suffix:wrap1.js " , new String [ ] { " suffix:i_am_reachable " } } } ;
@Test
public void testWrap1 ( ) throws IllegalArgumentException , IOException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " wrap1.js " ) ;
2012-01-06 21:34:04 +00:00
verifyGraphAssertions ( CG , assertionsForWrap1 ) ;
}
private static final Object [ ] [ ] assertionsForWrap2 = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/wrap2.js " } } ,
new Object [ ] { " suffix:wrap2.js " , new String [ ] { " suffix:i_am_reachable " } } } ;
@Test
public void testWrap2 ( ) throws IllegalArgumentException , IOException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " wrap2.js " ) ;
2012-01-06 21:34:04 +00:00
verifyGraphAssertions ( CG , assertionsForWrap2 ) ;
}
2012-01-06 21:27:21 +00:00
2012-01-06 21:36:59 +00:00
private static final Object [ ] [ ] assertionsForWrap3 = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/wrap3.js " } } ,
new Object [ ] { " suffix:wrap3.js " , new String [ ] { " suffix:i_am_reachable " } } } ;
@Test
public void testWrap3 ( ) throws IllegalArgumentException , IOException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " wrap3.js " ) ;
2012-01-06 21:36:59 +00:00
verifyGraphAssertions ( CG , assertionsForWrap3 ) ;
}
2012-01-06 21:22:27 +00:00
private static final Object [ ] [ ] assertionsForComplexCall = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/complex_call.js " } } ,
new Object [ ] { " suffix:call.js " , new String [ ] { " suffix:f3 " } } } ;
@Test
public void testComplexCall ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " complex_call.js " ) ;
2012-01-06 21:34:04 +00:00
for ( CGNode nd : CG )
System . out . println ( nd ) ;
2012-01-06 21:22:27 +00:00
verifyGraphAssertions ( CG , assertionsForComplexCall ) ;
}
2012-01-06 21:23:56 +00:00
private static final Object [ ] [ ] assertionsForGlobalObj = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/global_object.js " } } ,
new Object [ ] { " suffix:global_object.js " , new String [ ] { " suffix:biz " } } } ;
@Test
public void testGlobalObjPassing ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " global_object.js " ) ;
2012-01-06 21:28:46 +00:00
verifyGraphAssertions ( CG , assertionsForGlobalObj ) ;
2012-01-06 21:23:56 +00:00
}
2012-01-06 21:41:57 +00:00
private static final Object [ ] [ ] assertionsForGlobalObj2 = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/global_object2.js " } } ,
new Object [ ] { " suffix:global_object2.js " , new String [ ] { " suffix:foo " } } } ;
@Test
public void testGlobalObj2 ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " global_object2.js " ) ;
2012-01-06 21:41:57 +00:00
verifyGraphAssertions ( CG , assertionsForGlobalObj2 ) ;
}
2012-01-06 21:43:58 +00:00
2012-01-06 21:41:57 +00:00
private static final Object [ ] [ ] assertionsForReturnThis = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/return_this.js " } } ,
new Object [ ] { " suffix:return_this.js " , new String [ ] { " suffix:foo " } } ,
new Object [ ] { " suffix:return_this.js " , new String [ ] { " suffix:bar " } } } ;
2012-01-06 21:28:46 +00:00
2012-01-06 21:41:57 +00:00
@Test
public void testReturnThis ( ) throws IOException , IllegalArgumentException , CancelException {
2012-03-01 02:45:51 +00:00
PropagationCallGraphBuilder B = JSCallGraphBuilderUtil . makeScriptCGBuilder ( " tests " , " return_this.js " ) ;
CallGraph CG = B . makeCallGraph ( B . getOptions ( ) ) ;
2012-07-03 22:55:02 +00:00
// JSCallGraphUtil.AVOID_DUMP = false;
2012-03-01 02:45:51 +00:00
JSCallGraphUtil . dumpCG ( B . getPointerAnalysis ( ) , CG ) ;
2012-01-06 21:41:57 +00:00
verifyGraphAssertions ( CG , assertionsForReturnThis ) ;
}
private static final Object [ ] [ ] assertionsForReturnThis2 = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/return_this2.js " } } ,
new Object [ ] { " suffix:return_this2.js " , new String [ ] { " suffix:A " } } ,
new Object [ ] { " suffix:return_this2.js " , new String [ ] { " suffix:foo " } } ,
new Object [ ] { " suffix:return_this2.js " , new String [ ] { " suffix:test1 " } } ,
new Object [ ] { " suffix:return_this2.js " , new String [ ] { " suffix:test2 " } } ,
new Object [ ] { " suffix:test1 " , new String [ ] { " suffix:bar1 " } } ,
new Object [ ] { " suffix:test2 " , new String [ ] { " suffix:bar2 " } }
} ;
// when using the ObjectSensitivityContextSelector, we additionally know that test1 does not call bar2,
// and test2 does not call bar1
@Test
public void testReturnThis2 ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " return_this2.js " ) ;
2012-01-06 21:41:57 +00:00
verifyGraphAssertions ( CG , assertionsForReturnThis2 ) ;
}
2012-01-06 21:43:37 +00:00
private static final Object [ ] [ ] assertionsForArguments = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/arguments.js " } } ,
new Object [ ] { " suffix:arguments.js " , new String [ ] { " suffix:f " } } ,
2012-02-17 20:18:32 +00:00
new Object [ ] { " suffix:f " , new String [ ] { " !suffix:g1 " , " !suffix:g2 " , " suffix:g3 " , } }
2012-01-06 21:43:37 +00:00
} ;
@Test
public void testArguments ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " arguments.js " ) ;
2012-01-06 21:43:37 +00:00
verifyGraphAssertions ( CG , assertionsForArguments ) ;
}
2012-01-06 21:41:57 +00:00
private static final Object [ ] [ ] assertionsForFunctionIsAFunction = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/Function_is_a_function.js " } } ,
new Object [ ] { " suffix:Function_is_a_function.js " , new String [ ] { " suffix:functionCall " } } } ;
@Test
public void testFunctionIsAFunction ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " Function_is_a_function.js " ) ;
2012-01-06 21:41:57 +00:00
verifyGraphAssertions ( CG , assertionsForFunctionIsAFunction ) ;
}
2012-01-06 21:50:52 +00:00
private static final Object [ ] [ ] assertionsForLexicalBroken = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/lexical_broken.js " } } ,
new Object [ ] { " suffix:lexical_broken.js " , new String [ ] { " suffix:f " } } ,
new Object [ ] { " suffix:f " , new String [ ] { " suffix:g " } }
} ;
@Test
public void testLexicalBroken ( ) throws IOException , IllegalArgumentException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " lexical_broken.js " ) ;
2012-01-06 21:50:52 +00:00
verifyGraphAssertions ( CG , assertionsForLexicalBroken ) ;
}
2012-01-06 21:51:26 +00:00
@Test
public void testDeadPhi ( ) throws IllegalArgumentException , IOException , CancelException {
2012-02-17 20:21:59 +00:00
JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " dead_phi.js " ) ;
2012-01-06 21:51:26 +00:00
}
2012-02-17 20:15:57 +00:00
private static final Object [ ] [ ] assertionsForScopingOverwriteFunction = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/scoping_test.js " } } ,
new Object [ ] { " suffix:scoping_test.js " , new String [ ] { " suffix:i_am_reachable " } }
} ;
2012-02-17 20:13:39 +00:00
@Test
2012-02-17 20:15:57 +00:00
public void testScopingOverwriteFunction ( ) throws IllegalArgumentException , IOException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " scoping_test.js " ) ;
2012-02-17 20:15:57 +00:00
verifyGraphAssertions ( CG , assertionsForScopingOverwriteFunction ) ;
2012-02-17 20:13:39 +00:00
}
2012-02-17 20:14:26 +00:00
2012-02-17 20:14:36 +00:00
private static final Object [ ] [ ] assertionsForNestedParamAssign = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/nested_assign_to_param.js " } } ,
new Object [ ] { " suffix:nested_assign_to_param.js " , new String [ ] { " suffix:i_am_reachable " } }
} ;
2012-02-17 20:14:26 +00:00
@Test
public void testNestedAssignToParam ( ) throws IllegalArgumentException , IOException , CancelException {
2012-02-17 20:21:59 +00:00
CallGraph CG = JSCallGraphBuilderUtil . makeScriptCG ( " tests " , " nested_assign_to_param.js " ) ;
2012-02-17 20:14:36 +00:00
verifyGraphAssertions ( CG , assertionsForNestedParamAssign ) ;
2012-02-17 20:14:26 +00:00
}
2012-03-01 02:45:51 +00:00
private static final Object [ ] [ ] assertionsForDispatch = new Object [ ] [ ] {
new Object [ ] { ROOT , new String [ ] { " tests/dispatch.js " } } ,
new Object [ ] { " tests/dispatch.js " , new String [ ] { " tests/dispatch.js/left_outer " , " tests/dispatch.js/right_outer " } } ,
new Object [ ] { " tests/dispatch.js/left_outer " , new String [ ] { " tests/dispatch.js/left_inner " } } ,
new Object [ ] { " tests/dispatch.js/right_outer " , new String [ ] { " tests/dispatch.js/right_inner " } }
} ;
@Test
public void testDispatch ( ) throws IOException , IllegalArgumentException , CancelException {
PropagationCallGraphBuilder B = JSCallGraphBuilderUtil . makeScriptCGBuilder ( " tests " , " dispatch.js " ) ;
CallGraph CG = B . makeCallGraph ( B . getOptions ( ) ) ;
2012-07-03 22:55:02 +00:00
// JSCallGraphUtil.AVOID_DUMP = false;
2012-03-01 02:45:51 +00:00
JSCallGraphUtil . dumpCG ( B . getPointerAnalysis ( ) , CG ) ;
verifyGraphAssertions ( CG , assertionsForDispatch ) ;
}
2011-04-13 16:27:15 +00:00
protected IVector < Set < Pair < CGNode , Integer > > > computeIkIdToVns ( PointerAnalysis pa ) {
2010-11-05 00:36:44 +00:00
// Created by reversing the points to mapping for local pointer keys.
// Instead of mapping (local) pointer keys to instance keys (with id), we
// map instance keys to VnInContext (which carry the same information as
// local pointer keys)
final IVector < Set < Pair < CGNode , Integer > > > ret = new SparseVector < Set < Pair < CGNode , Integer > > > ( ) ;
for ( PointerKey pk : pa . getPointerKeys ( ) ) {
if ( pk instanceof LocalPointerKey ) {
final LocalPointerKey lpk = ( LocalPointerKey ) pk ;
// we filter out local pointer keys that have no uses.
// NOTE: do to some weird behavior, we get pointer keys with vns that
// don't exist, so we have to filter those before asking about uses.
if ( lpk . getNode ( ) . getDU ( ) . getDef ( lpk . getValueNumber ( ) ) ! = null ) {
Iterator < SSAInstruction > uses = lpk . getNode ( ) . getDU ( ) . getUses ( lpk . getValueNumber ( ) ) ;
if ( uses . hasNext ( ) ) {
OrdinalSet < InstanceKey > pointsToSet = pa . getPointsToSet ( pk ) ;
if ( pointsToSet = = null | | pointsToSet . getBackingSet ( ) = = null )
continue ;
pointsToSet . getBackingSet ( ) . foreach ( new IntSetAction ( ) {
public void act ( int ikId ) {
Set < Pair < CGNode , Integer > > s = ret . get ( ikId ) ;
if ( s = = null ) {
s = HashSetFactory . make ( ) ;
ret . set ( ikId , s ) ;
}
s . add ( Pair . make ( lpk . getNode ( ) , lpk . getValueNumber ( ) ) ) ;
}
} ) ;
} else {
int i = 0 ;
i + + ;
}
} else {
int i = 0 ;
i + + ;
}
}
}
return ret ;
}
2007-02-02 17:28:04 +00:00
}