/** Performs the action given by {@link #type}. */
    public Object run(Context cx) {
      switch (type) {
        case IPROXY_COMPILE_SCRIPT:
          cx.compileString(text, url, 1, null);
          break;

        case IPROXY_EVAL_SCRIPT:
          {
            Scriptable scope = null;
            if (dim.scopeProvider != null) {
              scope = dim.scopeProvider.getScope();
            }
            if (scope == null) {
              scope = new ImporterTopLevel(cx);
            }
            cx.evaluateString(scope, text, url, 1, null);
          }
          break;

        case IPROXY_STRING_IS_COMPILABLE:
          booleanResult = cx.stringIsCompilableUnit(text);
          break;

        case IPROXY_OBJECT_TO_STRING:
          if (object == Undefined.instance) {
            stringResult = "undefined";
          } else if (object == null) {
            stringResult = "null";
          } else if (object instanceof NativeCall) {
            stringResult = "[object Call]";
          } else {
            stringResult = Context.toString(object);
          }
          break;

        case IPROXY_OBJECT_PROPERTY:
          objectResult = dim.getObjectPropertyImpl(cx, object, id);
          break;

        case IPROXY_OBJECT_IDS:
          objectArrayResult = dim.getObjectIdsImpl(cx, object);
          break;

        default:
          throw Kit.codeBug();
      }
      return null;
    }
 /** Called when the stack frame is entered. */
 public void onEnter(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
   contextData.pushFrame(this);
   this.scope = scope;
   this.thisObj = thisObj;
   if (dim.breakOnEnter) {
     dim.handleBreakpointHit(this, cx);
   }
 }
    /** Called when compilation is finished. */
    public void handleCompilationDone(Context cx, DebuggableScript fnOrScript, String source) {
      if (type != IPROXY_DEBUG) Kit.codeBug();

      if (!fnOrScript.isTopLevel()) {
        return;
      }
      dim.registerTopScript(fnOrScript, source);
    }
    /** Returns a StackFrame for the given function or script. */
    public DebugFrame getFrame(Context cx, DebuggableScript fnOrScript) {
      if (type != IPROXY_DEBUG) Kit.codeBug();

      FunctionSource item = dim.getFunctionSource(fnOrScript);
      if (item == null) {
        // Can not debug if source is not available
        return null;
      }
      return new StackFrame(cx, dim, item);
    }
    /** Called when the current position has changed. */
    public void onLineChange(Context cx, int lineno) {
      this.lineNumber = lineno;

      if (!breakpoints[lineno] && !dim.breakFlag) {
        boolean lineBreak = contextData.breakNextLine;
        if (lineBreak && contextData.stopAtFrameDepth >= 0) {
          lineBreak = (contextData.frameCount() <= contextData.stopAtFrameDepth);
        }
        if (!lineBreak) {
          return;
        }
        contextData.stopAtFrameDepth = -1;
        contextData.breakNextLine = false;
      }

      dim.handleBreakpointHit(this, cx);
    }
 /** Called when a 'debugger' statement is executed. */
 public void onDebuggerStatement(Context cx) {
   dim.handleBreakpointHit(this, cx);
 }
 /** Called when the stack frame has been left. */
 public void onExit(Context cx, boolean byThrow, Object resultOrException) {
   if (dim.breakOnReturn && !byThrow) {
     dim.handleBreakpointHit(this, cx);
   }
   contextData.popFrame();
 }
 /** Called when an exception has been thrown. */
 public void onExceptionThrown(Context cx, Throwable exception) {
   dim.handleExceptionThrown(cx, exception, this);
 }