1d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// Copyright 2011 the V8 project authors. All rights reserved.
2d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// Redistribution and use in source and binary forms, with or without
3d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// modification, are permitted provided that the following conditions are
4d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// met:
5d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
6d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//     * Redistributions of source code must retain the above copyright
7d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//       notice, this list of conditions and the following disclaimer.
8d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//     * Redistributions in binary form must reproduce the above
9d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//       copyright notice, this list of conditions and the following
10d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//       disclaimer in the documentation and/or other materials provided
11d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//       with the distribution.
12d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//     * Neither the name of Google Inc. nor the names of its
13d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//       contributors may be used to endorse or promote products derived
14d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//       from this software without specific prior written permission.
15d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
16d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
28e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org// Test that we can handle function calls with up to 32766 arguments, and
29e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org// that function calls with more arguments throw an exception.  Apply a
30e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org// similar limit to the number of function parameters.
31d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
32e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org// See http://code.google.com/p/v8/issues/detail?id=1122 and
33e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org// http://code.google.com/p/v8/issues/detail?id=1413.
34d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
35e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgfunction function_with_n_params_and_m_args(n, m) {
36d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  test_prefix = 'prefix ';
37d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  test_suffix = ' suffix';
38d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  var source = 'test_prefix + (function f(';
39d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  for (var arg = 0; arg < n ; arg++) {
40d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com    if (arg != 0) source += ',';
41d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com    source += 'arg' + arg;
42d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  }
43d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  source += ') { return arg' + (n - n % 2) / 2 + '; })(';
44e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  for (var arg = 0; arg < m ; arg++) {
45d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com    if (arg != 0) source += ',';
46d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com    source += arg;
47d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  }
48d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  source += ') + test_suffix';
49d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  return eval(source);
50d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com}
51d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
52e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgassertEquals('prefix 4000 suffix',
53e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org             function_with_n_params_and_m_args(8000, 8000));
54e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgassertEquals('prefix 3000 suffix',
55e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org             function_with_n_params_and_m_args(6000, 8000));
56e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgassertEquals('prefix 5000 suffix',
57e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org             function_with_n_params_and_m_args(10000, 8000));
58e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgassertEquals('prefix 9000 suffix',
59e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org             function_with_n_params_and_m_args(18000, 18000));
60e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgassertEquals('prefix 16000 suffix',
61e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org             function_with_n_params_and_m_args(32000, 32000));
62e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgassertEquals('prefix undefined suffix',
63e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org             function_with_n_params_and_m_args(32000, 10000));
64d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
654c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgassertThrows("function_with_n_params_and_m_args(66000, 30000)");
664c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgassertThrows("function_with_n_params_and_m_args(30000, 66000)");
67