Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2009 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 var exception = false;  // Exception in debug event listener.
     33 var before_compile_count = 0;
     34 var after_compile_count = 0;
     35 var compile_error_count = 0;
     36 var current_source = '';  // Current source being compiled.
     37 var source_count = 0;  // Total number of scources compiled.
     38 var host_compilations = 0;  // Number of scources compiled through the API.
     39 var eval_compilations = 0;  // Number of scources compiled through eval.
     40 var mute_listener = false;
     41 
     42 function compileSource(source) {
     43   current_source = source;
     44   eval(current_source);
     45   source_count++;
     46 }
     47 
     48 function safeEval(code) {
     49   try {
     50     mute_listener = true;
     51     return eval('(' + code + ')');
     52   } catch (e) {
     53     assertEquals(void 0, e);
     54     return undefined;
     55   } finally {
     56     mute_listener = false;
     57   }
     58 }
     59 
     60 function listener(event, exec_state, event_data, data) {
     61   if (mute_listener) return;
     62   try {
     63     if (event == Debug.DebugEvent.BeforeCompile ||
     64         event == Debug.DebugEvent.AfterCompile ||
     65         event == Debug.DebugEvent.CompileError) {
     66       // Count the events.
     67       if (event == Debug.DebugEvent.BeforeCompile) {
     68         before_compile_count++;
     69       } else if (event == Debug.DebugEvent.AfterCompile) {
     70         after_compile_count++;
     71         switch (event_data.script().compilationType()) {
     72           case Debug.ScriptCompilationType.Host:
     73             host_compilations++;
     74             break;
     75           case Debug.ScriptCompilationType.Eval:
     76             eval_compilations++;
     77             break;
     78         }
     79       } else {
     80         compile_error_count++;
     81       }
     82 
     83       // If the compiled source contains 'eval' there will be additional compile
     84       // events for the source inside eval.
     85       if (current_source.indexOf('eval') == 0) {
     86         // For source with 'eval' there will be compile events with substrings
     87         // as well as with with the exact source.
     88         assertTrue(current_source.indexOf(event_data.script().source()) >= 0);
     89       } else {
     90         // For source without 'eval' there will be a compile events with the
     91         // exact source.
     92         assertEquals(current_source, event_data.script().source());
     93       }
     94       // Check that script context is included into the event message.
     95       var json = event_data.toJSONProtocol();
     96       var msg = safeEval(json);
     97       assertTrue('context' in msg.body.script);
     98 
     99       // Check that we pick script name from //# sourceURL, iff present
    100       if (event == Debug.DebugEvent.AfterCompile) {
    101         assertEquals(current_source.indexOf('sourceURL') >= 0 ?
    102             'myscript.js' : undefined,
    103                      event_data.script().name());
    104       }
    105     }
    106   } catch (e) {
    107     exception = e
    108   }
    109 };
    110 
    111 
    112 // Add the debug event listener.
    113 Debug.setListener(listener);
    114 
    115 // Compile different sources.
    116 compileSource('a=1');
    117 compileSource('(function(){})');
    118 compileSource('eval("a=2")');
    119 source_count++;  // Using eval causes additional compilation event.
    120 compileSource('eval("eval(\'(function(){return a;})\')")');
    121 source_count += 2;  // Using eval causes additional compilation event.
    122 compileSource('JSON.parse(\'{"a":1,"b":2}\')');
    123 // Using JSON.parse does not causes additional compilation events.
    124 compileSource('x=1; //# sourceURL=myscript.js');
    125 
    126 try {
    127   compileSource('}');
    128 } catch(e) {
    129 }
    130 
    131 // Make sure that the debug event listener was invoked.
    132 assertFalse(exception, "exception in listener")
    133 
    134 // Number of before and after + error events should be the same.
    135 assertEquals(before_compile_count, after_compile_count + compile_error_count);
    136 assertEquals(compile_error_count, 1);
    137 
    138 // Check the actual number of events (no compilation through the API as all
    139 // source compiled through eval).
    140 assertEquals(source_count, after_compile_count);
    141 assertEquals(0, host_compilations);
    142 assertEquals(source_count, eval_compilations);
    143 
    144 Debug.setListener(null);
    145