Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2008 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 // Flags: --expose-debug-as debug
     29 // Get the Debug object exposed from the debug context global object.
     30 Debug = debug.Debug
     31 
     32 listenerComplete = false;
     33 exception = false;
     34 
     35 // The base part of all evaluate requests.
     36 var base_request = '"seq":0,"type":"request","command":"evaluate"'
     37 
     38 function safeEval(code) {
     39   try {
     40     return eval('(' + code + ')');
     41   } catch (e) {
     42     assertEquals(void 0, e);
     43     return undefined;
     44   }
     45 }
     46 
     47 function testRequest(dcp, arguments, success, result) {
     48   // Generate request with the supplied arguments.
     49   var request;
     50   if (arguments) {
     51     request = '{' + base_request + ',"arguments":' + arguments + '}';
     52   } else {
     53     request = '{' + base_request + '}'
     54   }
     55   var response = safeEval(dcp.processDebugJSONRequest(request));
     56   if (success) {
     57     assertTrue(response.success, request + ' -> ' + response.message);
     58     assertEquals(result, response.body.value);
     59   } else {
     60     assertFalse(response.success, request + ' -> ' + response.message);
     61   }
     62   assertEquals(response.running, "unspecified_running_state",
     63                request + ' -> expected not running');
     64 }
     65 
     66 function listener(event, exec_state, event_data, data) {
     67   try {
     68     if (event == Debug.DebugEvent.Break) {
     69       // Get the debug command processor.
     70       var dcp = exec_state.debugCommandProcessor("unspecified_running_state");
     71 
     72       // Test some illegal evaluate requests.
     73       testRequest(dcp, void 0, false);
     74       testRequest(dcp, '{"expression":"1","global"=true}', false);
     75       testRequest(dcp, '{"expression":"a","frame":4}', false);
     76 
     77       // Test some legal evaluate requests.
     78       testRequest(dcp, '{"expression":"1+2"}', true, 3);
     79       testRequest(dcp, '{"expression":"a+2"}', true, 5);
     80       testRequest(dcp, '{"expression":"({\\"a\\":1,\\"b\\":2}).b+2"}', true, 4);
     81 
     82       // Test evaluation of a in the stack frames and the global context.
     83       testRequest(dcp, '{"expression":"a"}', true, 3);
     84       testRequest(dcp, '{"expression":"a","frame":0}', true, 3);
     85       testRequest(dcp, '{"expression":"a","frame":1}', true, 2);
     86       testRequest(dcp, '{"expression":"a","frame":2}', true, 1);
     87       testRequest(dcp, '{"expression":"a","global":true}', true, 1);
     88       testRequest(dcp, '{"expression":"this.a","global":true}', true, 1);
     89 
     90       // Test that the whole string text is returned if maxStringLength
     91       // parameter is passed.
     92       testRequest(
     93           dcp,
     94           '{"expression":"this.longString","global":true,"maxStringLength":-1}',
     95           true,
     96           longString);
     97       testRequest(
     98           dcp,
     99           '{"expression":"this.longString","global":true,"maxStringLength":' +
    100               longString.length + '}',
    101           true,
    102           longString);
    103       var truncatedStringSuffix = '... (length: ' + longString.length + ')';
    104       testRequest(
    105           dcp,
    106           '{"expression":"this.longString","global":true,"maxStringLength":0}',
    107           true,
    108           truncatedStringSuffix);
    109       testRequest(
    110           dcp,
    111           '{"expression":"this.longString","global":true,"maxStringLength":1}',
    112           true,
    113           longString.charAt(0) + truncatedStringSuffix);
    114       // Test that by default string is truncated to first 80 chars.
    115       testRequest(
    116           dcp,
    117           '{"expression":"this.longString","global":true}',
    118           true,
    119           longString.substring(0, 80) + truncatedStringSuffix);
    120 
    121       // Indicate that all was processed.
    122       listenerComplete = true;
    123     }
    124   } catch (e) {
    125    exception = e
    126   };
    127 };
    128 
    129 // Add the debug event listener.
    130 Debug.setListener(listener);
    131 
    132 function f() {
    133   var a = 3;
    134 };
    135 
    136 function g() {
    137   var a = 2;
    138   f();
    139   return a;  // Use the value to prevent it being removed by DCE.
    140 };
    141 
    142 a = 1;
    143 
    144 // String which is longer than 80 chars.
    145 var longString = "1234567890_";
    146 for (var i = 0; i < 4; i++) {
    147   longString += longString;
    148 }
    149 
    150 // Set a break point at return in f and invoke g to hit the breakpoint.
    151 Debug.setBreakPoint(f, 2, 0);
    152 g();
    153 
    154 assertFalse(exception, "exception in listener")
    155 // Make sure that the debug event listener vas invoked.
    156 assertTrue(listenerComplete, "listener did not run to completion");
    157