13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
23fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Redistribution and use in source and binary forms, with or without
33fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// modification, are permitted provided that the following conditions are
43fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// met:
53fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//
63fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//     * Redistributions of source code must retain the above copyright
73fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       notice, this list of conditions and the following disclaimer.
83fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//     * Redistributions in binary form must reproduce the above
93fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       copyright notice, this list of conditions and the following
103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       disclaimer in the documentation and/or other materials provided
113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       with the distribution.
123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       contributors may be used to endorse or promote products derived
143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//       from this software without specific prior written permission.
153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch//
163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --expose-debug-as debug --expose-gc --allow-natives-syntax --inline-construct
293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Get the Debug object exposed from the debug context global object.
303fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochDebug = debug.Debug
313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar listenerComplete = false;
333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar exception = false;
343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar testingConstructCall = false;
363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar expected = [
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  { locals: {a0: 1, b0: 2}, args: { names: ["i", "x0", "y0"], values: [0, 3, 4] } },
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  { locals: {a1: 3, b1: 4}, args: { names: ["i", "x1", "y1"], values: [1, 5, 6] } },
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  { locals: {a2: 5, b2: 6}, args: { names: ["i"], values: [2] } },
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  { locals: {a3: 7, b3: 8}, args: { names: ["i", "x3", "y3", "z3"], values: [3, 9, 10, undefined] } },
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  { locals: {a4: 9, b4: 10}, args: { names: ["i", "x4", "y4"], values: [4, 11, 12] } }
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch];
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction arraySum(arr) {
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return arr.reduce(function (a, b) { return a + b; }, 0);
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction listener(event, exec_state, event_data, data) {
503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  try {
513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (event == Debug.DebugEvent.Break)
523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    {
533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      assertEquals(6, exec_state.frameCount());
543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      for (var i = 0; i < exec_state.frameCount(); i++) {
563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        var frame = exec_state.frame(i);
573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        if (i < exec_state.frameCount() - 1) {
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          var expected_args = expected[i].args;
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          var expected_locals = expected[i].locals;
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          // All frames except the bottom one have expected locals.
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          var locals = {};
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          for (var j = 0; j < frame.localCount(); j++) {
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            locals[frame.localName(j)] = frame.localValue(j).value();
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          }
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          assertPropertiesEqual(expected_locals, locals);
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          // All frames except the bottom one have expected arguments.
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          for (var j = 0; j < expected_args.names.length; j++) {
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(expected_args.names[j], frame.argumentName(j));
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(expected_args.values[j], frame.argumentValue(j).value());
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          }
733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          // All frames except the bottom one have two scopes.
753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          assertEquals(2, frame.scopeCount());
763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          assertEquals(debug.ScopeType.Local, frame.scope(0).scopeType());
773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          assertEquals(debug.ScopeType.Global, frame.scope(1).scopeType());
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          Object.keys(expected_locals).forEach(function (name) {
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(expected_locals[name], frame.scope(0).scopeObject().value()[name]);
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          });
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          for (var j = 0; j < expected_args.names.length; j++) {
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            var arg_name = expected_args.names[j];
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            var arg_value = expected_args.values[j];
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(arg_value, frame.scope(0).scopeObject().value()[arg_name]);
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          }
883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          // Evaluate in the inlined frame.
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          Object.keys(expected_locals).forEach(function (name) {
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(expected_locals[name], frame.evaluate(name).value());
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          });
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          for (var j = 0; j < expected_args.names.length; j++) {
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            var arg_name = expected_args.names[j];
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            var arg_value = expected_args.values[j];
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(arg_value, frame.evaluate(arg_name).value());
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(arg_value, frame.evaluate('arguments['+j+']').value());
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          }
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          var expected_args_sum = arraySum(expected_args.values);
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          var expected_locals_sum =
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              arraySum(Object.keys(expected_locals).
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                       map(function (k) { return expected_locals[k]; }));
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          assertEquals(expected_locals_sum + expected_args_sum,
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                       frame.evaluate(Object.keys(expected_locals).join('+') + ' + ' +
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                      expected_args.names.join('+')).value());
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          var arguments_sum = expected_args.names.map(function(_, idx) {
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            return "arguments[" + idx + "]";
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          }).join('+');
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          assertEquals(expected_args_sum,
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                       frame.evaluate(arguments_sum).value());
1153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        } else {
1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          // The bottom frame only have the global scope.
1173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          assertEquals(1, frame.scopeCount());
1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          assertEquals(debug.ScopeType.Global, frame.scope(0).scopeType());
1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        }
1203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        // Check the frame function.
1223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        switch (i) {
1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          case 0: assertEquals(h, frame.func().value()); break;
1243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          case 1: assertEquals(g3, frame.func().value()); break;
1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          case 2: assertEquals(g2, frame.func().value()); break;
1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          case 3: assertEquals(g1, frame.func().value()); break;
1273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          case 4: assertEquals(f, frame.func().value()); break;
1283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          case 5: break;
1293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          default: assertUnreachable();
1303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        }
1313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        // Check for construct call.
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if (i == 4) {
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          assertEquals(testingConstructCall, frame.isConstructCall());
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        } else if (i == 2) {
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          assertTrue(frame.isConstructCall());
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        } else {
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          assertFalse(frame.isConstructCall());
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        }
1403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        // When function f is optimized (1 means YES, see runtime.cc) we
1423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        // expect an optimized frame for f with g1, g2 and g3 inlined.
1433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        if (%GetOptimizationStatus(f) == 1) {
1443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          if (i == 1 || i == 2 || i == 3) {
1453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            assertTrue(frame.isOptimizedFrame());
1463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            assertTrue(frame.isInlinedFrame());
1473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            assertEquals(4 - i, frame.inlinedFrameIndex());
1483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          } else if (i == 4) {
1493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            assertTrue(frame.isOptimizedFrame());
1503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            assertFalse(frame.isInlinedFrame());
1513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          } else {
1523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            assertFalse(frame.isOptimizedFrame());
1533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            assertFalse(frame.isInlinedFrame());
1543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          }
1553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        }
1563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      }
1573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      // Indicate that all was processed.
1593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      listenerComplete = true;
1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
1613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } catch (e) {
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    exception = e.toString() + e.stack;
1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  };
1643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
1653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfor (var i = 0; i < 4; i++) f(expected.length - 1, 11, 12);
1673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch%OptimizeFunctionOnNextCall(f);
1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf(expected.length - 1, 11, 12);
1693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Add the debug event listener.
1713fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochDebug.setListener(listener);
1723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction h(i, x0, y0) {
1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var a0 = expected[i].locals.a0;
1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var b0 = expected[i].locals.b0;
1763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  debugger;  // Breakpoint.
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction g3(i, x1, y1) {
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var a1 = expected[i].locals.a1;
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var b1 = expected[i].locals.b1;
1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  h(i - 1, a1, b1);
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction g2(i) {
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var a2 = expected[i].locals.a2;
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var b2 = expected[i].locals.b2;
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  g3(i - 1, a2, b2);
1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction g1(i, x3, y3, z3) {
1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var a3 = expected[i].locals.a3;
1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var b3 = expected[i].locals.b3;
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  new g2(i - 1, a3, b3);
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f(i, x4, y4) {
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var a4 = expected[i].locals.a4;
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var b4 = expected[i].locals.b4;
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  g1(i - 1, a4, b4);
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Test calling f normally and as a constructor.
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf(expected.length - 1, 11, 12);
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf(expected.length - 1, 11, 12, 0);
2063fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochtestingConstructCall = true;
2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnew f(expected.length - 1, 11, 12);
2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnew f(expected.length - 1, 11, 12, 0);
2093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Make sure that the debug event listener was invoked.
2113fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertFalse(exception, "exception in listener " + exception)
2123fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertTrue(listenerComplete);
2133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Throw away type information for next run.
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochgc();
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2173fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochDebug.setListener(null);
218