| String.prototype.repeat = function(num) { |
| return new Array(num + 1).join(this); |
| } |
| |
| function set_to_length(length, frag_size) |
| { |
| var fragment = "'" + "x".repeat(frag_size) + "' + "; |
| var frags = Math.floor((length - 1)/frag_size); |
| var code = "var x = " + fragment.repeat(frags) + "'" + |
| "x".repeat(length - frags * frag_size) + "';"; |
| |
| try { |
| eval(code); |
| } |
| catch(err) { |
| if (err.message && err.message == "Out of memory") |
| return -1; |
| if (err == "out of memory") |
| return -1; |
| throw(err); /* Oops, broke something. */ |
| } |
| |
| return code.length; |
| } |
| |
| var first_fail; |
| var first_pass; |
| var frag_size; |
| var pass_code_length; |
| |
| function search_up() |
| { |
| if (set_to_length(first_fail, frag_size) < 0) { |
| setTimeout(binary_search, 0); |
| return; |
| } |
| |
| first_fail *= 2; |
| } |
| |
| function binary_search() |
| { |
| if (first_fail - first_pass > 1) { |
| var length = (first_pass + first_fail) / 2; |
| var code_len = set_to_length(length, frag_size); |
| if (code_len > 0) { |
| first_pass = length; |
| pass_code_length = code_len; |
| } else |
| first_fail = length; |
| setTimeout(binary_search, 0); |
| return; |
| } |
| } |
| |
| function run_find_limit() |
| { |
| frag_size = 64; |
| first_fail = 65536; /* A guess */ |
| first_pass = 0; |
| pass_code_length = 0; |
| |
| for (var i=0; i<5; i++) |
| search_up(0); |
| } |
| |
| run_find_limit(); |