code: private EvalResult eval(String using, int runtimeId, Variable... variables) {
      // This call causes us to release objects, which allows them to be garbage collected, and
      // sometimes causes this method to fail.  So I've commented it out.  But I reckon it might cause
      // high memory usage in Opera, so the method might need to be updated in the future.
      //processQueues();
  
      EvalArg.Builder builder = buildEval(using, runtimeId);
      builder.addAllVariableList(Arrays.asList(variables));
  
      Response response = executeMessage(EcmascriptMessage.EVAL, builder, SCRIPT_TIMEOUT.getMs());
  
      if (response == null && retries < SCRIPT_RETRIES) {
        retries++;
        sleepDuration += SCRIPT_RETRY_INTERVAL.getMs();
        sleep(sleepDuration);
        recover();
        return eval(using, variables);
      } else if (retries >= SCRIPT_RETRIES) {
        resetCounters();
        throw new CommunicationException("No response on ECMAScript evaluation command");
      }
  
      resetCounters();
      return parseEvalData(response);
    }
docs: Evaluates ECMAScript in the global scope.  This method maps to {@link EcmascriptMessage#EVAL}
  in Scope. For instance to fetch information on the window object, one can do:
  
  <pre><code>
  Object window = parseEvalReply(parseEvalData(eval("window", 1)));
  </code></pre>
  
  {@link EvalResult#getValue#getObject} will be set, note however that this will not include
  properties on the return object to conserve the amount of data that needs to be sent.  To get
  properties use {@link #examineObjects(Integer)}.
  
  @param using     piece of ECMAScript to evaluate
  @param runtimeId ID of the runtime to execute script in
  @param variables a list of objects to place in the execution environment when evaluating
  <code>using</code>
  @return result of script execution
  @throws CommunicationException if browser does not respond
  @see EcmascriptMessage#EVAL