| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 // Flags: --allow-natives-syntax | 28 // Flags: --allow-natives-syntax |
| 29 | 29 |
| 30 // Test for-in support in Crankshaft. For simplicity this tests assumes certain | 30 // Test for-in support in Crankshaft. For simplicity this tests assumes certain |
| 31 // fixed iteration order for properties and will have to be adjusted if V8 | 31 // fixed iteration order for properties and will have to be adjusted if V8 |
| 32 // stops following insertion order. | 32 // stops following insertion order. |
| 33 | 33 |
| 34 | 34 |
| 35 function a(t) { | 35 function a(t) { |
| 36 var result = []; | 36 var result = []; |
| 37 for (var i in t) { | 37 for (var i in t) { |
| 38 result.push(i + t[i]); | 38 result.push([i, t[i]]); |
| 39 } | 39 } |
| 40 return result.join(''); | 40 return result; |
| 41 } | 41 } |
| 42 | 42 |
| 43 // Check that we correctly deoptimize on map check. | 43 // Check that we correctly deoptimize on map check. |
| 44 function b(t) { | 44 function b(t) { |
| 45 var result = []; | 45 var result = []; |
| 46 for (var i in t) { | 46 for (var i in t) { |
| 47 result.push(i + t[i]); | 47 result.push([i, t[i]]); |
| 48 delete t[i]; | 48 delete t[i]; |
| 49 } | 49 } |
| 50 return result.join(''); | 50 return result; |
| 51 } | 51 } |
| 52 | 52 |
| 53 // Check that we correctly deoptimize during preparation step. | 53 // Check that we correctly deoptimize during preparation step. |
| 54 function c(t) { | 54 function c(t) { |
| 55 var result = []; | 55 var result = []; |
| 56 for (var i in t) { | 56 for (var i in t) { |
| 57 result.push(i + t[i]); | 57 result.push([i, t[i]]); |
| 58 } | 58 } |
| 59 return result.join(''); | 59 return result; |
| 60 } | 60 } |
| 61 | 61 |
| 62 // Check that we deoptimize to the place after side effect in the right state. | 62 // Check that we deoptimize to the place after side effect in the right state. |
| 63 function d(t) { | 63 function d(t) { |
| 64 var result = []; | 64 var result = []; |
| 65 var o; | 65 var o; |
| 66 for (var i in (o = t())) { | 66 for (var i in (o = t())) { |
| 67 result.push(i + o[i]); | 67 result.push([i, o[i]]); |
| 68 } | 68 } |
| 69 return result.join(''); | 69 return result; |
| 70 } | 70 } |
| 71 | 71 |
| 72 // Check that we correctly deoptimize on map check inserted for fused load. | 72 // Check that we correctly deoptimize on map check inserted for fused load. |
| 73 function e(t) { | 73 function e(t) { |
| 74 var result = []; | 74 var result = []; |
| 75 for (var i in t) { | 75 for (var i in t) { |
| 76 delete t[i]; | 76 delete t[i]; |
| 77 t[i] = i; | 77 t[i] = i; |
| 78 result.push(i + t[i]); | 78 result.push([i, t[i]]); |
| 79 } | 79 } |
| 80 return result.join(''); | 80 return result; |
| 81 } | 81 } |
| 82 | 82 |
| 83 // Nested for-in loops. | 83 // Nested for-in loops. |
| 84 function f(t) { | 84 function f(t) { |
| 85 var result = []; | 85 var result = []; |
| 86 for (var i in t) { | 86 for (var i in t) { |
| 87 for (var j in t) { | 87 for (var j in t) { |
| 88 result.push(i + j + t[i] + t[j]); | 88 result.push([i, j, t[i], t[j]]); |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 return result.join(''); | 91 return result; |
| 92 } | 92 } |
| 93 | 93 |
| 94 // Deoptimization from the inner for-in loop. | 94 // Deoptimization from the inner for-in loop. |
| 95 function g(t) { | 95 function g(t) { |
| 96 var result = []; | 96 var result = []; |
| 97 for (var i in t) { | 97 for (var i in t) { |
| 98 for (var j in t) { | 98 for (var j in t) { |
| 99 result.push(i + j + t[i] + t[j]); | 99 result.push([i, j, t[i], t[j]]); |
| 100 var v = t[i]; | 100 var v = t[i]; |
| 101 delete t[i]; | 101 delete t[i]; |
| 102 t[i] = v; | 102 t[i] = v; |
| 103 } | 103 } |
| 104 } | 104 } |
| 105 return result.join(''); | 105 return result; |
| 106 } | 106 } |
| 107 | 107 |
| 108 | 108 |
| 109 // Break from the inner for-in loop. | 109 // Break from the inner for-in loop. |
| 110 function h(t, deopt) { | 110 function h(t, deopt) { |
| 111 var result = []; | 111 var result = []; |
| 112 for (var i in t) { | 112 for (var i in t) { |
| 113 for (var j in t) { | 113 for (var j in t) { |
| 114 result.push(i + j + t[i] + t[j]); | 114 result.push([i, j, t[i], t[j]]); |
| 115 break; | 115 break; |
| 116 } | 116 } |
| 117 } | 117 } |
| 118 deopt.deopt; | 118 deopt.deopt; |
| 119 return result.join(''); | 119 return result; |
| 120 } | 120 } |
| 121 | 121 |
| 122 // Continue in the inner loop. | 122 // Continue in the inner loop. |
| 123 function j(t, deopt) { | 123 function j(t, deopt) { |
| 124 var result = []; | 124 var result = []; |
| 125 for (var i in t) { | 125 for (var i in t) { |
| 126 for (var j in t) { | 126 for (var j in t) { |
| 127 result.push(i + j + t[i] + t[j]); | 127 result.push([i, j, t[i], t[j]]); |
| 128 continue; | 128 continue; |
| 129 } | 129 } |
| 130 } | 130 } |
| 131 deopt.deopt; | 131 deopt.deopt; |
| 132 return result.join(''); | 132 return result; |
| 133 } | 133 } |
| 134 | 134 |
| 135 // Continue of the outer loop. | 135 // Continue of the outer loop. |
| 136 function k(t, deopt) { | 136 function k(t, deopt) { |
| 137 var result = []; | 137 var result = []; |
| 138 outer: for (var i in t) { | 138 outer: for (var i in t) { |
| 139 for (var j in t) { | 139 for (var j in t) { |
| 140 result.push(i + j + t[i] + t[j]); | 140 result.push([i, j, t[i], t[j]]); |
| 141 continue outer; | 141 continue outer; |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 deopt.deopt; | 144 deopt.deopt; |
| 145 return result.join(''); | 145 return result; |
| 146 } | 146 } |
| 147 | 147 |
| 148 // Break of the outer loop. | 148 // Break of the outer loop. |
| 149 function l(t, deopt) { | 149 function l(t, deopt) { |
| 150 var result = []; | 150 var result = []; |
| 151 outer: for (var i in t) { | 151 outer: for (var i in t) { |
| 152 for (var j in t) { | 152 for (var j in t) { |
| 153 result.push(i + j + t[i] + t[j]); | 153 result.push([i, j, t[i], t[j]]); |
| 154 break outer; | 154 break outer; |
| 155 } | 155 } |
| 156 } | 156 } |
| 157 deopt.deopt; | 157 deopt.deopt; |
| 158 return result.join(''); | 158 return result; |
| 159 } | 159 } |
| 160 | 160 |
| 161 // Test deoptimization from inlined frame (currently it is not inlined). | 161 // Test deoptimization from inlined frame (currently it is not inlined). |
| 162 function m0(t, deopt) { | 162 function m0(t, deopt) { |
| 163 for (var i in t) { | 163 for (var i in t) { |
| 164 for (var j in t) { | 164 for (var j in t) { |
| 165 deopt.deopt; | 165 deopt.deopt; |
| 166 return i + j + t[i] + t[j]; | 166 return [i, j, t[i], t[j]]; |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 } | 169 } |
| 170 | 170 |
| 171 function m(t, deopt) { | 171 function m(t, deopt) { |
| 172 return m0(t, deopt); | 172 return m0(t, deopt); |
| 173 } | 173 } |
| 174 | 174 |
| 175 | 175 |
| 176 function tryFunction(s, mkT, f) { | 176 function tryFunction(result, mkT, f) { |
| 177 var d = {deopt: false}; | 177 var d = {deopt: false}; |
| 178 assertEquals(s, f(mkT(), d)); | 178 assertEquals(result, f(mkT(), d)); |
| 179 assertEquals(s, f(mkT(), d)); | 179 assertEquals(result, f(mkT(), d)); |
| 180 assertEquals(s, f(mkT(), d)); | 180 assertEquals(result, f(mkT(), d)); |
| 181 %OptimizeFunctionOnNextCall(f); | 181 %OptimizeFunctionOnNextCall(f); |
| 182 assertEquals(s, f(mkT(), d)); | 182 assertEquals(result, f(mkT(), d)); |
| 183 assertEquals(s, f(mkT(), {})); | 183 assertEquals(result, f(mkT(), {})); |
| 184 } | 184 } |
| 185 | 185 |
| 186 var s = "a1b2c3d4"; | 186 var expectedResult = [["a","1"],["b","2"],["c","3"],["d","4"]]; |
| 187 function mkTable() { return { a: "1", b: "2", c: "3", d: "4" }; } | 187 function mkTable() { return { a: "1", b: "2", c: "3", d: "4" }; } |
| 188 | 188 |
| 189 | 189 |
| 190 tryFunction(s, mkTable, a); | 190 tryFunction(expectedResult, mkTable, a); |
| 191 tryFunction(s, mkTable, b); | 191 tryFunction(expectedResult, mkTable, b); |
| 192 tryFunction("0a1b2c3d", function () { return "abcd"; }, c); | 192 |
| 193 tryFunction("0a1b2c3d", function () { | 193 expectedResult = [["0","a"],["1","b"],["2","c"],["3","d"]]; |
| 194 tryFunction(expectedResult, function () { return "abcd"; }, c); |
| 195 tryFunction(expectedResult, function () { |
| 194 var cnt = false; | 196 var cnt = false; |
| 195 return function () { | 197 return function () { |
| 196 cnt = true; | 198 cnt = true; |
| 197 return "abcd"; | 199 return "abcd"; |
| 198 } | 200 } |
| 199 }, d); | 201 }, d); |
| 200 tryFunction("aabbccdd", mkTable, e); | 202 tryFunction([["a","a"],["b","b"],["c","c"],["d","d"]], mkTable, e); |
| 201 | 203 |
| 202 function mkSmallTable() { return { a: "1", b: "2" }; } | 204 function mkSmallTable() { return { a: "1", b: "2" }; } |
| 203 | 205 |
| 204 tryFunction("aa11ab12ba21bb22", mkSmallTable, f); | 206 tryFunction([ |
| 205 tryFunction("aa11ab12bb22ba21", mkSmallTable, g); | 207 ["a","a","1","1"],["a","b","1","2"], |
| 206 tryFunction("aa11ba21", mkSmallTable, h); | 208 ["b","a","2","1"],["b","b","2","2"]], |
| 207 tryFunction("aa11ab12ba21bb22", mkSmallTable, j); | 209 mkSmallTable, f); |
| 208 tryFunction("aa11ba21", mkSmallTable, h); | 210 tryFunction([ |
| 209 tryFunction("aa11ba21", mkSmallTable, k); | 211 ["a","a","1","1"],["a","b","1","2"], |
| 210 tryFunction("aa11", mkSmallTable, l); | 212 ["b","b","2","2"],["b","a","2","1"]], |
| 211 tryFunction("aa11", mkSmallTable, m); | 213 mkSmallTable, g); |
| 214 tryFunction([["a","a","1","1"],["b","a","2","1"]], mkSmallTable, h); |
| 215 tryFunction([ |
| 216 ["a","a","1","1"],["a","b","1","2"], |
| 217 ["b","a","2","1"],["b","b","2","2"]], |
| 218 mkSmallTable, j); |
| 219 tryFunction([["a","a","1","1"],["b","a","2","1"]], mkSmallTable, h); |
| 220 tryFunction([["a","a","1","1"],["b","a","2","1"]], mkSmallTable, k); |
| 221 tryFunction([["a","a","1","1"]], mkSmallTable, l); |
| 222 tryFunction(["a","a","1","1"], mkSmallTable, m); |
| 212 | 223 |
| 213 // Test handling of null. | 224 // Test handling of null. |
| 214 tryFunction("", function () { | 225 tryFunction("", function () { |
| 215 return function () { return null; } | 226 return function () { return null; } |
| 216 }, function (t) { | 227 }, function (t) { |
| 217 for (var i in t()) { return i; } | 228 for (var i in t()) { return i; } |
| 218 return ""; | 229 return ""; |
| 219 }); | 230 }); |
| 220 | 231 |
| 221 // Test smis. | 232 // Test smis. |
| 222 tryFunction("", function () { | 233 tryFunction("", function () { |
| 223 return function () { return 11; } | 234 return function () { return 11; } |
| 224 }, function (t) { | 235 }, function (t) { |
| 225 for (var i in t()) { return i; } | 236 for (var i in t()) { return i; } |
| 226 return ""; | 237 return ""; |
| 227 }); | 238 }); |
| 228 | 239 |
| 229 // Test LoadFieldByIndex for out of object properties. | 240 // Test LoadFieldByIndex for out of object properties. |
| 230 function O() { this.a = 1; } | 241 function O() { this.a = 1; } |
| 231 for (var i = 0; i < 10; i++) new O(); | 242 for (var i = 0; i < 10; i++) new O(); |
| 232 tryFunction("a1b2c3d4e5f6", function () { | 243 tryFunction([["a",1],["b",2],["c",3],["d",4],["e",5],["f",6]], function () { |
| 233 var o = new O(); | 244 var o = new O(); |
| 234 o.b = 2; | 245 o.b = 2; |
| 235 o.c = 3; | 246 o.c = 3; |
| 236 o.d = 4; | 247 o.d = 4; |
| 237 o.e = 5; | 248 o.e = 5; |
| 238 o.f = 6; | 249 o.f = 6; |
| 239 return o; | 250 return o; |
| 240 }, function (t) { | 251 }, function (t) { |
| 241 var r = []; | 252 var r = []; |
| 242 for (var i in t) r.push(i + t[i]); | 253 for (var i in t) r.push([i, t[i]]); |
| 243 return r.join(''); | 254 return r; |
| 244 }); | 255 }); |
| 245 | 256 |
| 246 // Test OSR inside for-in. | 257 // Test OSR inside for-in. |
| 247 function osr_inner(t, limit) { | 258 function osr_inner(t, limit) { |
| 248 var r = 1; | 259 var r = 1; |
| 249 for (var x in t) { | 260 for (var x in t) { |
| 250 if (t.hasOwnProperty(x)) { | 261 if (t.hasOwnProperty(x)) { |
| 251 for (var i = 0; i < t[x].length; i++) { | 262 for (var i = 0; i < t[x].length; i++) { |
| 252 r += t[x][i]; | 263 r += t[x][i]; |
| 253 if (i === limit) %OptimizeOsr(); | 264 if (i === limit) %OptimizeOsr(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 for (var i = 0; i < arr.length; i++) { | 296 for (var i = 0; i < arr.length; i++) { |
| 286 arr[i] = i + 1; | 297 arr[i] = i + 1; |
| 287 } | 298 } |
| 288 arr.push(":"); // Force deopt at the end of the loop. | 299 arr.push(":"); // Force deopt at the end of the loop. |
| 289 assertEquals("211:x1234567891011121314151617181920:y", osr_inner({x: arr, y: a
rr}, (arr.length / 2) | 0)); | 300 assertEquals("211:x1234567891011121314151617181920:y", osr_inner({x: arr, y: a
rr}, (arr.length / 2) | 0)); |
| 290 assertEquals("7x456y", osr_outer({x: [1,2,3], y: [4,5,6]}, "x")); | 301 assertEquals("7x456y", osr_outer({x: [1,2,3], y: [4,5,6]}, "x")); |
| 291 assertEquals("101234567", osr_outer_and_deopt([1,2,3,4,5,6,7,8], "5")); | 302 assertEquals("101234567", osr_outer_and_deopt([1,2,3,4,5,6,7,8], "5")); |
| 292 } | 303 } |
| 293 | 304 |
| 294 test_osr(); | 305 test_osr(); |
| OLD | NEW |