|
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(); |