text: #!/usr/bin/env python
  # Copyright 2017 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.
  
  """
  Wrapper script for verify-predictable mode. D8 is expected to be compiled with
  v8_enable_verify_predictable.
  
  The actual test command is expected to be passed to this wraper as is. E.g.:
  predictable_wrapper.py path/to/d8 --test --predictable --flag1 --flag2
  
  The command is run up to three times and the printed allocation hash is
  compared. Differences are reported as errors.
  """
  
  
  # for py2/py3 compatibility
  
  
  import sys
  
  from .testrunner.local import command
  from .testrunner.local import utils
  
  
  MAX_TRIES = 3
  TIMEOUT = 120
  
  # Predictable mode works only when run on the host os.
  command.setup(utils.GuessOS(), None)
  
  def main(args):
    def allocation_str(stdout):
      for line in reversed((stdout or '').splitlines()):
        if line.startswith('### Allocations = '):
          return line
      return None
  
    cmd = command.Command(args[0], args[1:], timeout=TIMEOUT)
  
    previous_allocations = None
    for run in range(1, MAX_TRIES + 1):
      print(('### Predictable run #%d' % run))
      output = cmd.execute()
      if output.stdout:
        print('### Stdout:')
        print((output.stdout))
      if output.stderr:
        print('### Stderr:')
        print((output.stderr))
      print(('### Return code: %s' % output.exit_code))
      if output.HasTimedOut():
        # If we get a timeout in any run, we are in an unpredictable state. Just
        # report it as a failure and don't rerun.
        print('### Test timed out')
        return 1
      allocations = allocation_str(output.stdout)
      if not allocations:
        print ('### Test had no allocation output. Ensure this is built '
               'with v8_enable_verify_predictable and that '
               '--verify-predictable is passed at the cmd line.')
        return 2
      if previous_allocations and previous_allocations != allocations:
        print('### Allocations differ')
        return 3
      if run >= MAX_TRIES:
        # No difference on the last run -> report a success.
        return 0
      previous_allocations = allocations
    # Unreachable.
    assert False
  
  
  if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
  