E start(boolean internalEvaluate) throws EvaluateException {
      ReferenceType lastLoadedClass = null;
      ThreadReferenceProxyImpl lastUsedThread = null;
      while (true) {
        try {
          ThreadReferenceProxyImpl invokeThread = (ThreadReferenceProxyImpl)getEvaluationThread(myEvaluationContext);
          if (invokeThread == lastUsedThread) {
            throw new IllegalStateException("Endless loop while trying to identify thread to successful evaluation: " + invokeThread);
          }
          lastUsedThread = invokeThread;
          return startInternal(internalEvaluate, invokeThread);
        }
        catch (RetryEvaluationException e) {
          LOG.warn(e);
        }
        catch (ClassNotLoadedException e) {
          ReferenceType loadedClass = null;
          try {
            if (myEvaluationContext.isAutoLoadClasses()) {
              loadedClass = loadClass(myEvaluationContext, e.className(), myEvaluationContext.getClassLoader());
            }
          }
          catch (Exception ignored) {
            loadedClass = null;
          }
          if (loadedClass == null) {
            throw EvaluateExceptionUtil.createEvaluateException(e);
          }
          else if (loadedClass.equals(lastLoadedClass)) { // check for endless loading in the incorrect class loader, see IDEA-335672
            throw EvaluateExceptionUtil.createEvaluateException(
              "Loading class " + e.className() + " in the wrong classloader " + myEvaluationContext.getClassLoader());
          }
          lastLoadedClass = loadedClass;
          lastUsedThread = null;
        }
      }
    }
E start(boolean internalEvaluate)