File: foozzie_launcher.py

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (48 lines) | stat: -rw-r--r-- 1,430 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python3
# Copyright 2020 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.


"""
Launcher for the foozzie differential-fuzzing harness. Wraps foozzie
with Python2 for backwards-compatibility when bisecting.

Obsolete now after switching to Python3 entirely. We keep the launcher
for a transition period.
"""

import re
import shutil
import subprocess
import sys

def find_harness_code(args):
  for arg in args:
    if arg.endswith('v8_foozzie.py'):
      with open(arg) as f:
        return f.read()
  assert False, 'Foozzie harness not found'

if __name__ == '__main__':
  # In some cases or older versions, the python executable is passed as
  # first argument. Let's be robust either way, with or without full
  # path or version.
  if re.match(r'.*python.*', sys.argv[1]):
    args = sys.argv[2:]
  else:
    args = sys.argv[1:]

  python_exe = 'python3'

  # To ease bisection of really old bugs, attempt to use Python2 as long
  # as it is supported. This enables bisection before the point where the
  # harness switched to Python3.
  script = find_harness_code(args)
  use_python3 = script.startswith('#!/usr/bin/env python3')
  if not use_python3 and shutil.which('python2'):
    python_exe = 'python2'

  process = subprocess.Popen([python_exe] + args)
  process.communicate()
  sys.exit(process.returncode)