| Index: src/inspector/DebuggerScript.js
 | 
| diff --git a/src/inspector/DebuggerScript.js b/src/inspector/DebuggerScript.js
 | 
| deleted file mode 100644
 | 
| index 18beac0e03ceea0d897f7d584a6a38984c51eddd..0000000000000000000000000000000000000000
 | 
| --- a/src/inspector/DebuggerScript.js
 | 
| +++ /dev/null
 | 
| @@ -1,711 +0,0 @@
 | 
| -/*
 | 
| - * Copyright (C) 2010 Google Inc. All rights reserved.
 | 
| - *
 | 
| - * Redistribution and use in source and binary forms, with or without
 | 
| - * modification, are permitted provided that the following conditions are
 | 
| - * met:
 | 
| - *
 | 
| - *     * Redistributions of source code must retain the above copyright
 | 
| - * notice, this list of conditions and the following disclaimer.
 | 
| - *     * Redistributions in binary form must reproduce the above
 | 
| - * copyright notice, this list of conditions and the following disclaimer
 | 
| - * in the documentation and/or other materials provided with the
 | 
| - * distribution.
 | 
| - *     * Neither the name of Google Inc. nor the names of its
 | 
| - * contributors may be used to endorse or promote products derived from
 | 
| - * this software without specific prior written permission.
 | 
| - *
 | 
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
| - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
| - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
| - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
| - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
| - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
| - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
| - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
| - */
 | 
| -"use strict";
 | 
| -
 | 
| -(function () {
 | 
| -
 | 
| -var DebuggerScript = {};
 | 
| -
 | 
| -/** @enum */
 | 
| -DebuggerScript.PauseOnExceptionsState = {
 | 
| -    DontPauseOnExceptions: 0,
 | 
| -    PauseOnAllExceptions: 1,
 | 
| -    PauseOnUncaughtExceptions: 2
 | 
| -};
 | 
| -
 | 
| -DebuggerScript._pauseOnExceptionsState = DebuggerScript.PauseOnExceptionsState.DontPauseOnExceptions;
 | 
| -Debug.clearBreakOnException();
 | 
| -Debug.clearBreakOnUncaughtException();
 | 
| -
 | 
| -/**
 | 
| - * @param {?CompileEvent} eventData
 | 
| - */
 | 
| -DebuggerScript.getAfterCompileScript = function(eventData)
 | 
| -{
 | 
| -    var script = eventData.script().value();
 | 
| -    if (!script.is_debugger_script)
 | 
| -        return DebuggerScript._formatScript(eventData.script().value());
 | 
| -    return null;
 | 
| -}
 | 
| -
 | 
| -/** @type {!Map<!ScopeType, string>} */
 | 
| -DebuggerScript._scopeTypeNames = new Map();
 | 
| -DebuggerScript._scopeTypeNames.set(ScopeType.Global, "global");
 | 
| -DebuggerScript._scopeTypeNames.set(ScopeType.Local, "local");
 | 
| -DebuggerScript._scopeTypeNames.set(ScopeType.With, "with");
 | 
| -DebuggerScript._scopeTypeNames.set(ScopeType.Closure, "closure");
 | 
| -DebuggerScript._scopeTypeNames.set(ScopeType.Catch, "catch");
 | 
| -DebuggerScript._scopeTypeNames.set(ScopeType.Block, "block");
 | 
| -DebuggerScript._scopeTypeNames.set(ScopeType.Script, "script");
 | 
| -
 | 
| -/**
 | 
| - * @param {function()} fun
 | 
| - * @return {?Array<!Scope>}
 | 
| - */
 | 
| -DebuggerScript.getFunctionScopes = function(fun)
 | 
| -{
 | 
| -    var mirror = MakeMirror(fun);
 | 
| -    if (!mirror.isFunction())
 | 
| -        return null;
 | 
| -    var functionMirror = /** @type {!FunctionMirror} */(mirror);
 | 
| -    var count = functionMirror.scopeCount();
 | 
| -    if (count == 0)
 | 
| -        return null;
 | 
| -    var result = [];
 | 
| -    for (var i = 0; i < count; i++) {
 | 
| -        var scopeDetails = functionMirror.scope(i).details();
 | 
| -        var scopeObject = DebuggerScript._buildScopeObject(scopeDetails.type(), scopeDetails.object());
 | 
| -        if (!scopeObject)
 | 
| -            continue;
 | 
| -        result.push({
 | 
| -            type: /** @type {string} */(DebuggerScript._scopeTypeNames.get(scopeDetails.type())),
 | 
| -            object: scopeObject,
 | 
| -            name: scopeDetails.name() || ""
 | 
| -        });
 | 
| -    }
 | 
| -    return result;
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {Object} object
 | 
| - * @return {?RawLocation}
 | 
| - */
 | 
| -DebuggerScript.getGeneratorObjectLocation = function(object)
 | 
| -{
 | 
| -    var mirror = MakeMirror(object, true /* transient */);
 | 
| -    if (!mirror.isGenerator())
 | 
| -        return null;
 | 
| -    var generatorMirror = /** @type {!GeneratorMirror} */(mirror);
 | 
| -    var funcMirror = generatorMirror.func();
 | 
| -    if (!funcMirror.resolved())
 | 
| -        return null;
 | 
| -    var location = generatorMirror.sourceLocation() || funcMirror.sourceLocation();
 | 
| -    var script = funcMirror.script();
 | 
| -    if (script && location) {
 | 
| -        return {
 | 
| -            scriptId: "" + script.id(),
 | 
| -            lineNumber: location.line,
 | 
| -            columnNumber: location.column
 | 
| -        };
 | 
| -    }
 | 
| -    return null;
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {Object} object
 | 
| - * @return {!Array<!{value: *}>|undefined}
 | 
| - */
 | 
| -DebuggerScript.getCollectionEntries = function(object)
 | 
| -{
 | 
| -    var mirror = MakeMirror(object, true /* transient */);
 | 
| -    if (mirror.isMap())
 | 
| -        return /** @type {!MapMirror} */(mirror).entries();
 | 
| -    if (mirror.isSet() || mirror.isIterator()) {
 | 
| -        var result = [];
 | 
| -        var values = mirror.isSet() ? /** @type {!SetMirror} */(mirror).values() : /** @type {!IteratorMirror} */(mirror).preview();
 | 
| -        for (var i = 0; i < values.length; ++i)
 | 
| -            result.push({ value: values[i] });
 | 
| -        return result;
 | 
| -    }
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {string|undefined} contextData
 | 
| - * @return {number}
 | 
| - */
 | 
| -DebuggerScript._executionContextId = function(contextData)
 | 
| -{
 | 
| -    if (!contextData)
 | 
| -        return 0;
 | 
| -    var match = contextData.match(/^[^,]*,([^,]*),.*$/);
 | 
| -    if (!match)
 | 
| -        return 0;
 | 
| -    return parseInt(match[1], 10) || 0;
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {string|undefined} contextData
 | 
| - * @return {string}
 | 
| - */
 | 
| -DebuggerScript._executionContextAuxData = function(contextData)
 | 
| -{
 | 
| -    if (!contextData)
 | 
| -        return "";
 | 
| -    var match = contextData.match(/^[^,]*,[^,]*,(.*)$/);
 | 
| -    return match ? match[1] : "";
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {string} contextGroupId
 | 
| - * @return {!Array<!FormattedScript>}
 | 
| - */
 | 
| -DebuggerScript.getScripts = function(contextGroupId)
 | 
| -{
 | 
| -    var result = [];
 | 
| -    var scripts = Debug.scripts();
 | 
| -    var contextDataPrefix = null;
 | 
| -    if (contextGroupId)
 | 
| -        contextDataPrefix = contextGroupId + ",";
 | 
| -    for (var i = 0; i < scripts.length; ++i) {
 | 
| -        var script = scripts[i];
 | 
| -        if (contextDataPrefix) {
 | 
| -            if (!script.context_data)
 | 
| -                continue;
 | 
| -            // Context data is a string in the following format:
 | 
| -            // <contextGroupId>,<contextId>,<auxData>
 | 
| -            if (script.context_data.indexOf(contextDataPrefix) !== 0)
 | 
| -                continue;
 | 
| -        }
 | 
| -        if (script.is_debugger_script)
 | 
| -            continue;
 | 
| -        result.push(DebuggerScript._formatScript(script));
 | 
| -    }
 | 
| -    return result;
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!Script} script
 | 
| - * @return {!FormattedScript}
 | 
| - */
 | 
| -DebuggerScript._formatScript = function(script)
 | 
| -{
 | 
| -    var lineEnds = script.line_ends;
 | 
| -    var lineCount = lineEnds.length;
 | 
| -    var endLine = script.line_offset + lineCount - 1;
 | 
| -    var endColumn;
 | 
| -    // V8 will not count last line if script source ends with \n.
 | 
| -    if (script.source[script.source.length - 1] === '\n') {
 | 
| -        endLine += 1;
 | 
| -        endColumn = 0;
 | 
| -    } else {
 | 
| -        if (lineCount === 1)
 | 
| -            endColumn = script.source.length + script.column_offset;
 | 
| -        else
 | 
| -            endColumn = script.source.length - (lineEnds[lineCount - 2] + 1);
 | 
| -    }
 | 
| -    return {
 | 
| -        id: script.id,
 | 
| -        name: script.nameOrSourceURL(),
 | 
| -        sourceURL: script.source_url,
 | 
| -        sourceMappingURL: script.source_mapping_url,
 | 
| -        source: script.source,
 | 
| -        startLine: script.line_offset,
 | 
| -        startColumn: script.column_offset,
 | 
| -        endLine: endLine,
 | 
| -        endColumn: endColumn,
 | 
| -        executionContextId: DebuggerScript._executionContextId(script.context_data),
 | 
| -        // Note that we cannot derive aux data from context id because of compilation cache.
 | 
| -        executionContextAuxData: DebuggerScript._executionContextAuxData(script.context_data)
 | 
| -    };
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - * @param {!BreakpointInfo} info
 | 
| - * @return {string|undefined}
 | 
| - */
 | 
| -DebuggerScript.setBreakpoint = function(execState, info)
 | 
| -{
 | 
| -    var breakId = Debug.setScriptBreakPointById(info.sourceID, info.lineNumber, info.columnNumber, info.condition, undefined, Debug.BreakPositionAlignment.Statement);
 | 
| -    var locations = Debug.findBreakPointActualLocations(breakId);
 | 
| -    if (!locations.length)
 | 
| -        return undefined;
 | 
| -    info.lineNumber = locations[0].line;
 | 
| -    info.columnNumber = locations[0].column;
 | 
| -    return breakId.toString();
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - * @param {!{breakpointId: number}} info
 | 
| - */
 | 
| -DebuggerScript.removeBreakpoint = function(execState, info)
 | 
| -{
 | 
| -    Debug.findBreakPoint(info.breakpointId, true);
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @return {number}
 | 
| - */
 | 
| -DebuggerScript.pauseOnExceptionsState = function()
 | 
| -{
 | 
| -    return DebuggerScript._pauseOnExceptionsState;
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {number} newState
 | 
| - */
 | 
| -DebuggerScript.setPauseOnExceptionsState = function(newState)
 | 
| -{
 | 
| -    DebuggerScript._pauseOnExceptionsState = newState;
 | 
| -
 | 
| -    if (DebuggerScript.PauseOnExceptionsState.PauseOnAllExceptions === newState)
 | 
| -        Debug.setBreakOnException();
 | 
| -    else
 | 
| -        Debug.clearBreakOnException();
 | 
| -
 | 
| -    if (DebuggerScript.PauseOnExceptionsState.PauseOnUncaughtExceptions === newState)
 | 
| -        Debug.setBreakOnUncaughtException();
 | 
| -    else
 | 
| -        Debug.clearBreakOnUncaughtException();
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - * @param {number} limit
 | 
| - * @return {!Array<!JavaScriptCallFrame>}
 | 
| - */
 | 
| -DebuggerScript.currentCallFrames = function(execState, limit)
 | 
| -{
 | 
| -    var frames = [];
 | 
| -    for (var i = 0; i < execState.frameCount() && (!limit || i < limit); ++i)
 | 
| -        frames.push(DebuggerScript._frameMirrorToJSCallFrame(execState.frame(i)));
 | 
| -    return frames;
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - */
 | 
| -DebuggerScript.stepIntoStatement = function(execState)
 | 
| -{
 | 
| -    execState.prepareStep(Debug.StepAction.StepIn);
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - */
 | 
| -DebuggerScript.stepFrameStatement = function(execState)
 | 
| -{
 | 
| -    execState.prepareStep(Debug.StepAction.StepFrame);
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - */
 | 
| -DebuggerScript.stepOverStatement = function(execState)
 | 
| -{
 | 
| -    execState.prepareStep(Debug.StepAction.StepNext);
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - */
 | 
| -DebuggerScript.stepOutOfFunction = function(execState)
 | 
| -{
 | 
| -    execState.prepareStep(Debug.StepAction.StepOut);
 | 
| -}
 | 
| -
 | 
| -DebuggerScript.clearStepping = function()
 | 
| -{
 | 
| -    Debug.clearStepping();
 | 
| -}
 | 
| -
 | 
| -// Returns array in form:
 | 
| -//      [ 0, <v8_result_report> ] in case of success
 | 
| -//   or [ 1, <general_error_message>, <compiler_message>, <line_number>, <column_number> ] in case of compile error, numbers are 1-based.
 | 
| -// or throws exception with message.
 | 
| -/**
 | 
| - * @param {number} scriptId
 | 
| - * @param {string} newSource
 | 
| - * @param {boolean} preview
 | 
| - * @return {!Array<*>}
 | 
| - */
 | 
| -DebuggerScript.liveEditScriptSource = function(scriptId, newSource, preview)
 | 
| -{
 | 
| -    var scripts = Debug.scripts();
 | 
| -    var scriptToEdit = null;
 | 
| -    for (var i = 0; i < scripts.length; i++) {
 | 
| -        if (scripts[i].id == scriptId) {
 | 
| -            scriptToEdit = scripts[i];
 | 
| -            break;
 | 
| -        }
 | 
| -    }
 | 
| -    if (!scriptToEdit)
 | 
| -        throw("Script not found");
 | 
| -
 | 
| -    var changeLog = [];
 | 
| -    try {
 | 
| -        var result = Debug.LiveEdit.SetScriptSource(scriptToEdit, newSource, preview, changeLog);
 | 
| -        return [0, result.stack_modified];
 | 
| -    } catch (e) {
 | 
| -        if (e instanceof Debug.LiveEdit.Failure && "details" in e) {
 | 
| -            var details = /** @type {!LiveEditErrorDetails} */(e.details);
 | 
| -            if (details.type === "liveedit_compile_error") {
 | 
| -                var startPosition = details.position.start;
 | 
| -                return [1, String(e), String(details.syntaxErrorMessage), Number(startPosition.line), Number(startPosition.column)];
 | 
| -            }
 | 
| -        }
 | 
| -        throw e;
 | 
| -    }
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - */
 | 
| -DebuggerScript.clearBreakpoints = function(execState)
 | 
| -{
 | 
| -    Debug.clearAllBreakPoints();
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!ExecutionState} execState
 | 
| - * @param {!{enabled: boolean}} info
 | 
| - */
 | 
| -DebuggerScript.setBreakpointsActivated = function(execState, info)
 | 
| -{
 | 
| -    Debug.debuggerFlags().breakPointsActive.setValue(info.enabled);
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {!BreakEvent} eventData
 | 
| - */
 | 
| -DebuggerScript.getBreakpointNumbers = function(eventData)
 | 
| -{
 | 
| -    var breakpoints = eventData.breakPointsHit();
 | 
| -    var numbers = [];
 | 
| -    if (!breakpoints)
 | 
| -        return numbers;
 | 
| -
 | 
| -    for (var i = 0; i < breakpoints.length; i++) {
 | 
| -        var breakpoint = breakpoints[i];
 | 
| -        var scriptBreakPoint = breakpoint.script_break_point();
 | 
| -        numbers.push(scriptBreakPoint ? scriptBreakPoint.number() : breakpoint.number());
 | 
| -    }
 | 
| -    return numbers;
 | 
| -}
 | 
| -
 | 
| -// NOTE: This function is performance critical, as it can be run on every
 | 
| -// statement that generates an async event (like addEventListener) to support
 | 
| -// asynchronous call stacks. Thus, when possible, initialize the data lazily.
 | 
| -/**
 | 
| - * @param {!FrameMirror} frameMirror
 | 
| - * @return {!JavaScriptCallFrame}
 | 
| - */
 | 
| -DebuggerScript._frameMirrorToJSCallFrame = function(frameMirror)
 | 
| -{
 | 
| -    // Stuff that can not be initialized lazily (i.e. valid while paused with a valid break_id).
 | 
| -    // The frameMirror and scopeMirror can be accessed only while paused on the debugger.
 | 
| -    var frameDetails = frameMirror.details();
 | 
| -
 | 
| -    var funcObject = frameDetails.func();
 | 
| -    var sourcePosition = frameDetails.sourcePosition();
 | 
| -    var thisObject = frameDetails.receiver();
 | 
| -
 | 
| -    var isAtReturn = !!frameDetails.isAtReturn();
 | 
| -    var returnValue = isAtReturn ? frameDetails.returnValue() : undefined;
 | 
| -
 | 
| -    var scopeMirrors = frameMirror.allScopes(false);
 | 
| -    /** @type {!Array<ScopeType>} */
 | 
| -    var scopeTypes = new Array(scopeMirrors.length);
 | 
| -    /** @type {?Array<!Object>} */
 | 
| -    var scopeObjects = new Array(scopeMirrors.length);
 | 
| -    /** @type {!Array<string|undefined>} */
 | 
| -    var scopeNames = new Array(scopeMirrors.length);
 | 
| -    /** @type {?Array<number>} */
 | 
| -    var scopeStartPositions = new Array(scopeMirrors.length);
 | 
| -    /** @type {?Array<number>} */
 | 
| -    var scopeEndPositions = new Array(scopeMirrors.length);
 | 
| -    /** @type {?Array<function()|null>} */
 | 
| -    var scopeFunctions = new Array(scopeMirrors.length);
 | 
| -    for (var i = 0; i < scopeMirrors.length; ++i) {
 | 
| -        var scopeDetails = scopeMirrors[i].details();
 | 
| -        scopeTypes[i] = scopeDetails.type();
 | 
| -        scopeObjects[i] = scopeDetails.object();
 | 
| -        scopeNames[i] = scopeDetails.name();
 | 
| -        scopeStartPositions[i] = scopeDetails.startPosition ? scopeDetails.startPosition() : 0;
 | 
| -        scopeEndPositions[i] = scopeDetails.endPosition ? scopeDetails.endPosition() : 0;
 | 
| -        scopeFunctions[i] = scopeDetails.func ? scopeDetails.func() : null;
 | 
| -    }
 | 
| -
 | 
| -    // Calculated lazily.
 | 
| -    var scopeChain;
 | 
| -    var funcMirror;
 | 
| -    var location;
 | 
| -    /** @type {!Array<?RawLocation>} */
 | 
| -    var scopeStartLocations;
 | 
| -    /** @type {!Array<?RawLocation>} */
 | 
| -    var scopeEndLocations;
 | 
| -    var details;
 | 
| -
 | 
| -    /**
 | 
| -     * @param {!ScriptMirror|undefined} script
 | 
| -     * @param {number} pos
 | 
| -     * @return {?RawLocation}
 | 
| -     */
 | 
| -    function createLocation(script, pos)
 | 
| -    {
 | 
| -        if (!script)
 | 
| -            return null;
 | 
| -
 | 
| -        var location = script.locationFromPosition(pos, true);
 | 
| -        return {
 | 
| -            "lineNumber": location.line,
 | 
| -            "columnNumber": location.column,
 | 
| -            "scriptId": String(script.id())
 | 
| -        }
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {!Array<!Object>}
 | 
| -     */
 | 
| -    function ensureScopeChain()
 | 
| -    {
 | 
| -        if (!scopeChain) {
 | 
| -            scopeChain = [];
 | 
| -            scopeStartLocations = [];
 | 
| -            scopeEndLocations = [];
 | 
| -            for (var i = 0, j = 0; i < scopeObjects.length; ++i) {
 | 
| -                var scopeObject = DebuggerScript._buildScopeObject(scopeTypes[i], scopeObjects[i]);
 | 
| -                if (scopeObject) {
 | 
| -                    scopeTypes[j] = scopeTypes[i];
 | 
| -                    scopeNames[j] = scopeNames[i];
 | 
| -                    scopeChain[j] = scopeObject;
 | 
| -
 | 
| -                    var funcMirror = scopeFunctions ? MakeMirror(scopeFunctions[i]) : null;
 | 
| -                    if (!funcMirror || !funcMirror.isFunction())
 | 
| -                        funcMirror = new UnresolvedFunctionMirror(funcObject);
 | 
| -
 | 
| -                    var script = /** @type {!FunctionMirror} */(funcMirror).script();
 | 
| -                    scopeStartLocations[j] = createLocation(script, scopeStartPositions[i]);
 | 
| -                    scopeEndLocations[j] = createLocation(script, scopeEndPositions[i]);
 | 
| -                    ++j;
 | 
| -                }
 | 
| -            }
 | 
| -            scopeTypes.length = scopeChain.length;
 | 
| -            scopeNames.length = scopeChain.length;
 | 
| -            scopeObjects = null; // Free for GC.
 | 
| -            scopeFunctions = null;
 | 
| -            scopeStartPositions = null;
 | 
| -            scopeEndPositions = null;
 | 
| -        }
 | 
| -        return scopeChain;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {!JavaScriptCallFrameDetails}
 | 
| -     */
 | 
| -    function lazyDetails()
 | 
| -    {
 | 
| -        if (!details) {
 | 
| -            var scopeObjects = ensureScopeChain();
 | 
| -            var script = ensureFuncMirror().script();
 | 
| -            /** @type {!Array<Scope>} */
 | 
| -            var scopes = [];
 | 
| -            for (var i = 0; i < scopeObjects.length; ++i) {
 | 
| -                var scope = {
 | 
| -                    "type": /** @type {string} */(DebuggerScript._scopeTypeNames.get(scopeTypes[i])),
 | 
| -                    "object": scopeObjects[i],
 | 
| -                };
 | 
| -                if (scopeNames[i])
 | 
| -                    scope.name = scopeNames[i];
 | 
| -                if (scopeStartLocations[i])
 | 
| -                    scope.startLocation = /** @type {!RawLocation} */(scopeStartLocations[i]);
 | 
| -                if (scopeEndLocations[i])
 | 
| -                    scope.endLocation = /** @type {!RawLocation} */(scopeEndLocations[i]);
 | 
| -                scopes.push(scope);
 | 
| -            }
 | 
| -            details = {
 | 
| -                "functionName": ensureFuncMirror().debugName(),
 | 
| -                "location": {
 | 
| -                    "lineNumber": line(),
 | 
| -                    "columnNumber": column(),
 | 
| -                    "scriptId": String(script.id())
 | 
| -                },
 | 
| -                "this": thisObject,
 | 
| -                "scopeChain": scopes
 | 
| -            };
 | 
| -            var functionLocation = ensureFuncMirror().sourceLocation();
 | 
| -            if (functionLocation) {
 | 
| -                details.functionLocation = {
 | 
| -                    "lineNumber": functionLocation.line,
 | 
| -                    "columnNumber": functionLocation.column,
 | 
| -                    "scriptId": String(script.id())
 | 
| -                };
 | 
| -            }
 | 
| -            if (isAtReturn)
 | 
| -                details.returnValue = returnValue;
 | 
| -        }
 | 
| -        return details;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {!FunctionMirror}
 | 
| -     */
 | 
| -    function ensureFuncMirror()
 | 
| -    {
 | 
| -        if (!funcMirror) {
 | 
| -            funcMirror = MakeMirror(funcObject);
 | 
| -            if (!funcMirror.isFunction())
 | 
| -                funcMirror = new UnresolvedFunctionMirror(funcObject);
 | 
| -        }
 | 
| -        return /** @type {!FunctionMirror} */(funcMirror);
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {!{line: number, column: number}}
 | 
| -     */
 | 
| -    function ensureLocation()
 | 
| -    {
 | 
| -        if (!location) {
 | 
| -            var script = ensureFuncMirror().script();
 | 
| -            if (script)
 | 
| -                location = script.locationFromPosition(sourcePosition, true);
 | 
| -            if (!location)
 | 
| -                location = { line: 0, column: 0 };
 | 
| -        }
 | 
| -        return location;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {number}
 | 
| -     */
 | 
| -    function line()
 | 
| -    {
 | 
| -        return ensureLocation().line;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {number}
 | 
| -     */
 | 
| -    function column()
 | 
| -    {
 | 
| -        return ensureLocation().column;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {number}
 | 
| -     */
 | 
| -    function contextId()
 | 
| -    {
 | 
| -        var mirror = ensureFuncMirror();
 | 
| -        // Old V8 do not have context() function on these objects
 | 
| -        if (!mirror.context)
 | 
| -            return DebuggerScript._executionContextId(mirror.script().value().context_data);
 | 
| -        var context = mirror.context();
 | 
| -        if (context)
 | 
| -            return DebuggerScript._executionContextId(context.data());
 | 
| -        return 0;
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @return {number|undefined}
 | 
| -     */
 | 
| -    function sourceID()
 | 
| -    {
 | 
| -        var script = ensureFuncMirror().script();
 | 
| -        return script && script.id();
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @param {string} expression
 | 
| -     * @return {*}
 | 
| -     */
 | 
| -    function evaluate(expression)
 | 
| -    {
 | 
| -        return frameMirror.evaluate(expression, false).value();
 | 
| -    }
 | 
| -
 | 
| -    /** @return {undefined} */
 | 
| -    function restart()
 | 
| -    {
 | 
| -        return frameMirror.restart();
 | 
| -    }
 | 
| -
 | 
| -    /**
 | 
| -     * @param {number} scopeNumber
 | 
| -     * @param {string} variableName
 | 
| -     * @param {*} newValue
 | 
| -     */
 | 
| -    function setVariableValue(scopeNumber, variableName, newValue)
 | 
| -    {
 | 
| -        var scopeMirror = frameMirror.scope(scopeNumber);
 | 
| -        if (!scopeMirror)
 | 
| -            throw new Error("Incorrect scope index");
 | 
| -        scopeMirror.setVariableValue(variableName, newValue);
 | 
| -    }
 | 
| -
 | 
| -    return {
 | 
| -        "sourceID": sourceID,
 | 
| -        "line": line,
 | 
| -        "column": column,
 | 
| -        "contextId": contextId,
 | 
| -        "thisObject": thisObject,
 | 
| -        "evaluate": evaluate,
 | 
| -        "restart": restart,
 | 
| -        "setVariableValue": setVariableValue,
 | 
| -        "isAtReturn": isAtReturn,
 | 
| -        "details": lazyDetails
 | 
| -    };
 | 
| -}
 | 
| -
 | 
| -/**
 | 
| - * @param {number} scopeType
 | 
| - * @param {!Object} scopeObject
 | 
| - * @return {!Object|undefined}
 | 
| - */
 | 
| -DebuggerScript._buildScopeObject = function(scopeType, scopeObject)
 | 
| -{
 | 
| -    var result;
 | 
| -    switch (scopeType) {
 | 
| -    case ScopeType.Local:
 | 
| -    case ScopeType.Closure:
 | 
| -    case ScopeType.Catch:
 | 
| -    case ScopeType.Block:
 | 
| -    case ScopeType.Script:
 | 
| -        // For transient objects we create a "persistent" copy that contains
 | 
| -        // the same properties.
 | 
| -        // Reset scope object prototype to null so that the proto properties
 | 
| -        // don't appear in the local scope section.
 | 
| -        var properties = /** @type {!ObjectMirror} */(MakeMirror(scopeObject, true /* transient */)).properties();
 | 
| -        // Almost always Script scope will be empty, so just filter out that noise.
 | 
| -        // Also drop empty Block scopes, should we get any.
 | 
| -        if (!properties.length && (scopeType === ScopeType.Script || scopeType === ScopeType.Block))
 | 
| -            break;
 | 
| -        result = { __proto__: null };
 | 
| -        for (var j = 0; j < properties.length; j++) {
 | 
| -            var name = properties[j].name();
 | 
| -            if (name.length === 0 || name.charAt(0) === ".")
 | 
| -                continue; // Skip internal variables like ".arguments" and variables with empty name
 | 
| -            result[name] = properties[j].value_;
 | 
| -        }
 | 
| -        break;
 | 
| -    case ScopeType.Global:
 | 
| -    case ScopeType.With:
 | 
| -        result = scopeObject;
 | 
| -        break;
 | 
| -    }
 | 
| -    return result;
 | 
| -}
 | 
| -
 | 
| -// We never resolve Mirror by its handle so to avoid memory leaks caused by Mirrors in the cache we disable it.
 | 
| -ToggleMirrorCache(false);
 | 
| -
 | 
| -return DebuggerScript;
 | 
| -})();
 | 
| 
 |