text: load("8e10ed2ef8d5793457c2d22533e5ff15.js");
  // Copyright 2016 the V8 project authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  // Flags: --validate-asm
  
  function testFunction() {
    function generateAsmJs(stdlib, foreign, heap) {
      'use asm';
      var debugger_fun = foreign.call_debugger;
      function callDebugger() {
        debugger_fun();
      }
      function redirectFun() {
        callDebugger();
      }
      return redirectFun;
    }
  
    function call_debugger() {
      debugger;
    }
  
    var fun = generateAsmJs(this, {'call_debugger': call_debugger}, undefined);
    fun();
  }
  
  InspectorTest.addScript(testFunction.toString());
  
  Protocol.Debugger.enable();
  Protocol.Debugger.oncePaused().then(handleDebuggerPaused);
  Protocol.Runtime.evaluate({'expression': 'testFunction()'});
  
  function locationToString(callFrame) {
    var res = {functionName: callFrame.functionName};
    for (var attr in callFrame.functionLocation) {
      if (attr == 'scriptId') continue;
      res['function_'+attr] = callFrame.functionLocation[attr];
    }
    for (var attr in callFrame.location) {
      if (attr == 'scriptId') continue;
      res[attr] = callFrame.location[attr];
    }
    return JSON.stringify(res);
  }
  
  function logStackTrace(messageObject) {
    var frames = messageObject.params.callFrames;
    InspectorTest.log('Number of frames: ' + frames.length);
    for (var i = 0; i < frames.length; ++i) {
      InspectorTest.log('  - [' + i + '] ' + locationToString(frames[i]));
    }
  }
  
  function handleDebuggerPaused(messageObject)
  {
    InspectorTest.log('Paused on \'debugger;\'');
    logStackTrace(messageObject);
    InspectorTest.log('Getting v8-generated stack trace...');
    var topFrameId = messageObject.params.callFrames[0].callFrameId;
    Protocol.Debugger
        .evaluateOnCallFrame({
          callFrameId: topFrameId,
          expression: '(new Error("getting stack trace")).stack'
        })
        .then(callbackEvaluate);
  }
  
  function callbackEvaluate(response)
  {
    InspectorTest.log(
        'Result of evaluate (' + response.result.result.type + '):');
    var result_lines = response.result.result.value.split("\n");
    // Skip the second line, containing the 'evaluate' position.
    result_lines[1] = "    -- skipped --";
    InspectorTest.log(result_lines.join('\n'));
    InspectorTest.log('Finished!');
    InspectorTest.completeTest();
  }
  
  