Adds test cases to cover some inlining potholes. These tests currently FAIL due to the JS AST inlining. Patch by: mmastrac Review by: scottb git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1499 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/test/com/google/gwt/dev/jjs/test/MethodCallTest.java b/user/test/com/google/gwt/dev/jjs/test/MethodCallTest.java index f4529f5..800589f 100644 --- a/user/test/com/google/gwt/dev/jjs/test/MethodCallTest.java +++ b/user/test/com/google/gwt/dev/jjs/test/MethodCallTest.java
@@ -58,59 +58,180 @@ int i242, int i243, int i244, int i245, int i246, int i247, int i248, int i249, int i250, int i251, int i252, int i253, int i254) { return i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12 - + i13 + i14 + i15 + i16 + i17 + i18 + i19 + i20 + i21 + i22 + i23 + i24 - + i25 + i26 + i27 + i28 + i29 + i30 + i31 + i32 + i33 + i34 + i35 + i36 - + i37 + i38 + i39 + i40 + i41 + i42 + i43 + i44 + i45 + i46 + i47 + i48 - + i49 + i50 + i51 + i52 + i53 + i54 + i55 + i56 + i57 + i58 + i59 + i60 - + i61 + i62 + i63 + i64 + i65 + i66 + i67 + i68 + i69 + i70 + i71 + i72 - + i73 + i74 + i75 + i76 + i77 + i78 + i79 + i80 + i81 + i82 + i83 + i84 - + i85 + i86 + i87 + i88 + i89 + i90 + i91 + i92 + i93 + i94 + i95 + i96 - + i97 + i98 + i99 + i100 + i101 + i102 + i103 + i104 + i105 + i106 + i107 - + i108 + i109 + i110 + i111 + i112 + i113 + i114 + i115 + i116 + i117 - + i118 + i119 + i120 + i121 + i122 + i123 + i124 + i125 + i126 + i127 - + i128 + i129 + i130 + i131 + i132 + i133 + i134 + i135 + i136 + i137 - + i138 + i139 + i140 + i141 + i142 + i143 + i144 + i145 + i146 + i147 - + i148 + i149 + i150 + i151 + i152 + i153 + i154 + i155 + i156 + i157 - + i158 + i159 + i160 + i161 + i162 + i163 + i164 + i165 + i166 + i167 - + i168 + i169 + i170 + i171 + i172 + i173 + i174 + i175 + i176 + i177 - + i178 + i179 + i180 + i181 + i182 + i183 + i184 + i185 + i186 + i187 - + i188 + i189 + i190 + i191 + i192 + i193 + i194 + i195 + i196 + i197 - + i198 + i199 + i200 + i201 + i202 + i203 + i204 + i205 + i206 + i207 - + i208 + i209 + i210 + i211 + i212 + i213 + i214 + i215 + i216 + i217 - + i218 + i219 + i220 + i221 + i222 + i223 + i224 + i225 + i226 + i227 - + i228 + i229 + i230 + i231 + i232 + i233 + i234 + i235 + i236 + i237 - + i238 + i239 + i240 + i241 + i242 + i243 + i244 + i245 + i246 + i247 - + i248 + i249 + i250 + i251 + i252 + i253 + i254; + + i13 + i14 + i15 + i16 + i17 + i18 + i19 + i20 + i21 + i22 + i23 + i24 + + i25 + i26 + i27 + i28 + i29 + i30 + i31 + i32 + i33 + i34 + i35 + i36 + + i37 + i38 + i39 + i40 + i41 + i42 + i43 + i44 + i45 + i46 + i47 + i48 + + i49 + i50 + i51 + i52 + i53 + i54 + i55 + i56 + i57 + i58 + i59 + i60 + + i61 + i62 + i63 + i64 + i65 + i66 + i67 + i68 + i69 + i70 + i71 + i72 + + i73 + i74 + i75 + i76 + i77 + i78 + i79 + i80 + i81 + i82 + i83 + i84 + + i85 + i86 + i87 + i88 + i89 + i90 + i91 + i92 + i93 + i94 + i95 + i96 + + i97 + i98 + i99 + i100 + i101 + i102 + i103 + i104 + i105 + i106 + + i107 + i108 + i109 + i110 + i111 + i112 + i113 + i114 + i115 + i116 + + i117 + i118 + i119 + i120 + i121 + i122 + i123 + i124 + i125 + i126 + + i127 + i128 + i129 + i130 + i131 + i132 + i133 + i134 + i135 + i136 + + i137 + i138 + i139 + i140 + i141 + i142 + i143 + i144 + i145 + i146 + + i147 + i148 + i149 + i150 + i151 + i152 + i153 + i154 + i155 + i156 + + i157 + i158 + i159 + i160 + i161 + i162 + i163 + i164 + i165 + i166 + + i167 + i168 + i169 + i170 + i171 + i172 + i173 + i174 + i175 + i176 + + i177 + i178 + i179 + i180 + i181 + i182 + i183 + i184 + i185 + i186 + + i187 + i188 + i189 + i190 + i191 + i192 + i193 + i194 + i195 + i196 + + i197 + i198 + i199 + i200 + i201 + i202 + i203 + i204 + i205 + i206 + + i207 + i208 + i209 + i210 + i211 + i212 + i213 + i214 + i215 + i216 + + i217 + i218 + i219 + i220 + i221 + i222 + i223 + i224 + i225 + i226 + + i227 + i228 + i229 + i230 + i231 + i232 + i233 + i234 + i235 + i236 + + i237 + i238 + i239 + i240 + i241 + i242 + i243 + i244 + i245 + i246 + + i247 + i248 + i249 + i250 + i251 + i252 + i253 + i254; } + private int value; + public String getModuleName() { return "com.google.gwt.dev.jjs.CompilerSuite"; } public void testManyArgs() { assertEquals(32385, manyArgs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254)); + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254)); } public void testRecursion() { assertEquals(20100, recursiveSum(200)); } + public void testSideEffectsAlwaysExecute() { + // Ensure that side-effects always execute + value = 1; + conditional(value++); + assertEquals(2, value); + + int localValue = 1; + conditional(localValue++); + assertEquals(2, localValue); + } + + public void testSideEffectsBeforeCallee() { + // Ensure that call-site side-effects happen before callee side-effects + value = 10; + int result = checkSideEffectBeforeCallee(value = 0); + assertEquals(0, result); + } + + public void testSideEffectsInFields() { + // Ensure that call-site side-effects happen before callee side-effects + value = 10; + int result = add(++value, ++value); + assertEquals(23, result); + } + + public void testSideEffectsInWrongOrder() { + // Ensure that side-effects are processed in the correct order + value = 10; + value = checkOrder(value, ++value); + assertEquals(11010, value); + + int localValue = 20; + localValue = checkOrder(localValue, ++localValue); + assertEquals(21020, localValue); + } + + public void testSideEffectsVersusExceptions1() { + // Ensure that side-effects always happen before the exception + int value = 10; + try { + // Use the return value so it doesn't get pruned + assertEquals(0, addCorrectOrder(++value, throwRuntimeException())); + fail(); + } catch (RuntimeException e) { + assertNotNull(e); + assertEquals(11, value); + } + + try { + // Use the return value so it doesn't get pruned + assertEquals(0, addReverseOrder(++value, throwRuntimeException())); + fail(); + } catch (RuntimeException e) { + assertNotNull(e); + assertEquals(12, value); + } + } + + public void testSideEffectsVersusExceptions2() { + // Ensure that the exception always happens before the side-effects + int value = 10; + + try { + // Use the return value so it doesn't get pruned + assertEquals(0, addCorrectOrder(throwRuntimeException(), ++value)); + fail(); + } catch (RuntimeException e) { + assertNotNull(e); + assertEquals(10, value); + } + + try { + // Use the return value so it doesn't get pruned + assertEquals(0, addReverseOrder(throwRuntimeException(), ++value)); + fail(); + } catch (RuntimeException e) { + assertNotNull(e); + assertEquals(10, value); + } + } + + public void testSideEffectsVersusExceptions3() { + // Ensure that the exception always happens before the side-effects + int value = 10; + + try { + // Use the return value so it doesn't get pruned + assertEquals(0, throwExceptionAndReturn(++value)); + fail(); + } catch (RuntimeException e) { + assertNotNull(e); + assertEquals(11, value); + } + } + + private int add(int i, int j) { + return (value = 0) + i + j; + } + + private int addCorrectOrder(int i, int j) { + return i + j; + } + + private int addReverseOrder(int i, int j) { + return j + i; + } + + private int checkOrder(int x, int y) { + return y * 1000 + x; + } + + private int checkSideEffectBeforeCallee(int i) { + return value + i; + } + + private int conditional(int i) { + return (this.value != Integer.MAX_VALUE) ? 0 : i; + } + private int recursiveSum(int x) { if (x == 0) { return 0; @@ -118,4 +239,12 @@ return x + recursiveSum(x - 1); } } + + private int throwExceptionAndReturn(int i) { + return throwRuntimeException() + i; + } + + private int throwRuntimeException() { + throw new RuntimeException(); + } }