13fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Copyright 2011 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
283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Flags: --expose-debug-as debug
293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Get the Debug object exposed from the debug context global object.
303fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochDebug = debug.Debug;
313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar test_name;
333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar listener_delegate;
343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar listener_called;
353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar exception;
363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar expected_receiver;
373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar begin_test_count = 0;
383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar end_test_count = 0;
393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvar break_count = 0;
403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Debug event listener which delegates. Exceptions have to be
423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// explictly caught here and checked later because exception in the
433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// listener are not propagated to the surrounding JavaScript code.
443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction listener(event, exec_state, event_data, data) {
453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  try {
463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (event == Debug.DebugEvent.Break) {
473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      break_count++;
483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      listener_called = true;
493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      listener_delegate(exec_state);
503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } catch (e) {
523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    exception = e;
533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Add the debug event listener.
573fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochDebug.setListener(listener);
583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Initialize for a new test.
613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction BeginTest(name) {
623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  test_name = name;
633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  listener_called = false;
643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  exception = null;
653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  begin_test_count++;
663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Check result of a test.
703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction EndTest() {
713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertTrue(listener_called, "listerner not called for " + test_name);
723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertNull(exception, test_name);
733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  end_test_count++;
743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Check that the debugger correctly reflects that the receiver is not
783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// converted to object for strict mode functions.
793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction Strict() { "use strict"; debugger; }
803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestStrict(receiver) {
813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  expected_receiver = receiver;
823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Strict.call(receiver);
833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochlistener_delegate = function(exec_state) {
863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var receiver = exec_state.frame().receiver();
873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertTrue(!receiver.isObject());
883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(expected_receiver, receiver.value())
893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
913fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("strict: undefined"); TestStrict(undefined); EndTest();
923fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("strict: null"); TestStrict(null); EndTest();
933fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("strict: 1"); TestStrict(1); EndTest();
943fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("strict: 1.2"); TestStrict(1.2); EndTest();
953fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("strict: 'asdf'"); TestStrict('asdf'); EndTest();
963fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("strict: true"); TestStrict(true); EndTest();
973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Check that the debugger correctly reflects the object conversion of
1003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// the receiver for non-strict mode functions.
1013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction NonStrict() { debugger; }
1023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochfunction TestNonStrict(receiver) {
1033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // null and undefined should be transformed to the global object and
1043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // primitives should be wrapped.
1053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  expected_receiver = (receiver == null) ? this : Object(receiver);
1063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  NonStrict.call(receiver);
1073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
1083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochlistener_delegate = function(exec_state) {
1103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  var receiver = exec_state.frame().receiver();
1113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertTrue(receiver.isObject());
1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  assertEquals(expected_receiver, receiver.value());
1133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
1143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1153fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("non-strict: undefined"); TestNonStrict(undefined); EndTest();
1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("non-strict: null"); TestNonStrict(null); EndTest();
1173fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("non-strict: 1"); TestNonStrict(1); EndTest();
1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("non-strict: 1.2"); TestNonStrict(1.2); EndTest();
1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("non-strict: 'asdf'"); TestNonStrict('asdf'); EndTest();
1203fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBeginTest("non-strict: true"); TestNonStrict(true); EndTest();
1213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertEquals(begin_test_count, break_count,
1243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch             'one or more tests did not enter the debugger');
1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertEquals(begin_test_count, end_test_count,
1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch             'one or more tests did not have its result checked');
127