blob: b0edb9eefa6f5b919912bb8b9aa7d8420b724ae1 [file] [log] [blame]
// Copyright 2009 Google Inc. All Rights Reserved.
package com.google.gwt.dev.jjs.impl;
import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.dev.jjs.ast.JProgram;
/**
* Test for SameParameterValueOptimizer.
*/
public class SameParameterValueOptimizerTest extends OptimizerTestBase {
public void testDifferentParameter() throws Exception {
addSnippetClassDecl("static void foo(int i) { int j = i; }");
optimizeMethod("foo", "void",
"foo(1); foo(2);").intoString(
"int j = i;");
}
public void testDifferentParameter_Null() throws Exception {
addSnippetClassDecl("static void foo(String s) { String j = s; }");
optimizeMethod("foo", "void",
"foo(null); foo(\"\");").intoString(
"String j = s;");
}
public void testNonConstParameter() throws Exception {
addSnippetClassDecl("static int foo(int i) { return i; }");
optimizeMethod("foo", "void", "foo(foo(1));").intoString(
"return i;");
}
public void testNumericCast() throws Exception {
addSnippetClassDecl("static void foo(long i) { long j = i; }");
optimizeMethod("foo", "void",
"foo(1); foo(1);").intoString(
"long j = 1L;");
}
public void testOneParameterValue() throws Exception {
addSnippetClassDecl("static void foo(int i) { int j = i; }");
optimizeMethod("foo", "void",
"foo(1);").intoString(
"int j = 1;");
}
public void testSameParameter() throws Exception {
addSnippetClassDecl("static void foo(int i) { int j = i; }");
optimizeMethod("foo", "void",
"foo(1); foo(1);").intoString(
"int j = 1;");
}
public void testSameParameter_Null() throws Exception {
addSnippetClassDecl("static void foo(String s) { String j = s; }");
optimizeMethod("foo", "void",
"foo(null); foo(null);").intoString(
"String j = (String) null;");
}
public void testDontKillParameterValue_Binop() throws Exception {
addSnippetClassDecl("static void foo(int i) { if (i == 2) {} int j = i; }");
optimizeMethod("foo", "void",
"foo(1); ").intoString(
"if (1 == 2) {",
"}",
"int j = 1;");
}
public void testDontKillParameterValue_LocalPrefix() throws Exception {
addSnippetClassDecl("static void foo(int i) { int j = i; ++j; }");
optimizeMethod("foo", "void",
"foo(1); ").intoString(
"int j = 1;",
"++j;");
}
public void testDontKillParameterValue_LocalPostfix() throws Exception {
addSnippetClassDecl("static void foo(int i) { int j = i; j++; }");
optimizeMethod("foo", "void",
"foo(1); ").intoString(
"int j = 1;",
"j++;");
}
public void testKillParameterValue_Prefix() throws Exception {
addSnippetClassDecl("static void foo(int i) { ++i; int j = i; }");
optimizeMethod("foo", "void",
"foo(1); ").intoString(
"++i;",
"int j = i;");
}
public void testKillParameterValue_Assign() throws Exception {
addSnippetClassDecl("static void foo(int i) { i = 2; int j = i; }");
optimizeMethod("foo", "void",
"foo(1); ").intoString(
"i = 2;",
"int j = i;");
}
public void testKillParameterValue_Postfix() throws Exception {
addSnippetClassDecl("static void foo(int i) { i++; int j = i; }");
optimizeMethod("foo", "void",
"foo(1); ").intoString(
"i++;",
"int j = i;");
}
public void testJsniReferenceSaveMethod() throws Exception {
addSnippetClassDecl(
"public static native void someStaticMethod() /*-{" +
" var foo = @test.EntryPoint::foo(Ljava/lang/String;)" +
"}-*/");
addSnippetClassDecl("static void foo(String s) { String p = s; }");
optimizeMethod(
"foo",
"void",
"foo(\"\"); foo(\"\");").intoString(
"String p = s;");
}
public void testInstanceMethod_Poly() throws Exception {
addSnippetClassDecl("void foo(int i) { int j = i; }");
optimizeMethod("foo", "void", "new EntryPoint().foo(1);").intoString(
"int j = i;");
}
public void testInstanceMethod_Final() throws Exception {
addSnippetClassDecl("final void foo(int i) { int j = i; }");
optimizeMethod("$foo", "void", "new EntryPoint().foo(1);").intoString(
"int j = i;");
}
public void testOverrides() throws Exception {
addSnippetClassDecl("void foo(int i) { int j = i; }");
addSnippetClassDecl(
"static class Override extends EntryPoint {",
" void foo(int i) { int j = i; }", // overrides
"}");
optimizeMethod("foo", "void", "new EntryPoint().foo(1);").intoString(
"int j = i;");
}
@Override
protected boolean optimizeMethod(JProgram program, JMethod method) {
MakeCallsStatic.exec(program);
return SameParameterValueOptimizer.exec(program).didChange();
}
}