bug1013922.js (1447B)
1 String.prototype.repeat = function(num) { 2 return new Array(num + 1).join(this); 3 } 4 5 function set_to_length(length, frag_size) 6 { 7 var fragment = "'" + "x".repeat(frag_size) + "' + "; 8 var frags = Math.floor((length - 1)/frag_size); 9 var code = "var x = " + fragment.repeat(frags) + "'" + 10 "x".repeat(length - frags * frag_size) + "';"; 11 12 try { 13 eval(code); 14 } 15 catch(err) { 16 if (err.message && err.message == "Out of memory") 17 return -1; 18 if (err == "out of memory") 19 return -1; 20 throw(err); /* Oops, broke something. */ 21 } 22 23 return code.length; 24 } 25 26 var first_fail; 27 var first_pass; 28 var frag_size; 29 var pass_code_length; 30 31 function search_up() 32 { 33 if (set_to_length(first_fail, frag_size) < 0) { 34 setTimeout(binary_search, 0); 35 return; 36 } 37 38 first_fail *= 2; 39 } 40 41 function binary_search() 42 { 43 if (first_fail - first_pass > 1) { 44 var length = (first_pass + first_fail) / 2; 45 var code_len = set_to_length(length, frag_size); 46 if (code_len > 0) { 47 first_pass = length; 48 pass_code_length = code_len; 49 } else 50 first_fail = length; 51 setTimeout(binary_search, 0); 52 return; 53 } 54 } 55 56 function run_find_limit() 57 { 58 frag_size = 64; 59 first_fail = 65536; /* A guess */ 60 first_pass = 0; 61 pass_code_length = 0; 62 63 for (var i=0; i<5; i++) 64 search_up(0); 65 } 66 67 run_find_limit();