forked from xuos/xiuos
				
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
# Copyright JS Foundation and other contributors, http://js.foundation
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
from __future__ import print_function
 | 
						|
# force // operator to be integer division in Python 2
 | 
						|
from __future__ import division
 | 
						|
 | 
						|
import argparse
 | 
						|
import json
 | 
						|
import os
 | 
						|
import subprocess
 | 
						|
import sys
 | 
						|
 | 
						|
TOOLS_PATH = os.path.dirname(os.path.realpath(__file__))
 | 
						|
BASE_PATH = os.path.join(TOOLS_PATH, '..')
 | 
						|
 | 
						|
FLAG_CLEAN = '--clean'
 | 
						|
FLAG_DEBUG = '--debug'
 | 
						|
FLAG_HEAPLIMIT = '--mem-heap'
 | 
						|
JERRY_BUILDER = os.path.join(BASE_PATH, 'tools', 'build.py')
 | 
						|
JERRY_BIN = os.path.join(BASE_PATH, 'build', 'bin', 'jerry')
 | 
						|
TEST_DIR = os.path.join(BASE_PATH, 'tests')
 | 
						|
 | 
						|
 | 
						|
def get_args():
 | 
						|
    """ Parse input arguments. """
 | 
						|
    desc = 'Finds the smallest possible JerryHeap size without failing to run the given js file'
 | 
						|
    parser = argparse.ArgumentParser(description=desc)
 | 
						|
    parser.add_argument('testfile')
 | 
						|
    parser.add_argument('--heapsize', type=int, default=512,
 | 
						|
                        help='set the limit of the first heapsize (default: %(default)d)')
 | 
						|
    parser.add_argument('--buildtype', choices=['release', 'debug'], default='release',
 | 
						|
                        help='select build type (default: %(default)s)')
 | 
						|
 | 
						|
    script_args = parser.parse_args()
 | 
						|
 | 
						|
    return script_args
 | 
						|
 | 
						|
 | 
						|
def check_files(opts):
 | 
						|
    files = [JERRY_BUILDER, opts.testfile]
 | 
						|
    for _file in files:
 | 
						|
        if not os.path.isfile(_file):
 | 
						|
            sys.exit("File not found: %s" % _file)
 | 
						|
 | 
						|
 | 
						|
def build_bin(heapsize, opts):
 | 
						|
    """ Run tools/build.py script """
 | 
						|
    command = [
 | 
						|
        JERRY_BUILDER,
 | 
						|
        FLAG_CLEAN,
 | 
						|
        FLAG_HEAPLIMIT,
 | 
						|
        str(heapsize)
 | 
						|
    ]
 | 
						|
 | 
						|
    if opts.buildtype == 'debug':
 | 
						|
        command.append(FLAG_DEBUG)
 | 
						|
 | 
						|
    print('Building JerryScript with: %s' % (' '.join(command)))
 | 
						|
    subprocess.check_output(command)
 | 
						|
 | 
						|
 | 
						|
def run_test(opts):
 | 
						|
    """ Run the testfile to get the exitcode. """
 | 
						|
    try:
 | 
						|
        testfile = os.path.abspath(opts.testfile)
 | 
						|
        run_cmd = [JERRY_BIN, testfile]
 | 
						|
        # check output will raise an error if the exit code is not 0
 | 
						|
        subprocess.check_output(run_cmd, cwd=TEST_DIR)
 | 
						|
    except subprocess.CalledProcessError as err:
 | 
						|
        return err.returncode
 | 
						|
 | 
						|
    return 0
 | 
						|
 | 
						|
 | 
						|
def heap_limit(opts):
 | 
						|
    """ Find the minimal size of jerryheap to pass """
 | 
						|
    goodheap = opts.heapsize
 | 
						|
    lowheap = 0
 | 
						|
    hiheap = opts.heapsize
 | 
						|
 | 
						|
    while lowheap < hiheap:
 | 
						|
        build_bin(hiheap, opts)
 | 
						|
        assert os.path.isfile(JERRY_BIN), 'Jerry binary file does not exists'
 | 
						|
 | 
						|
        exitcode = run_test(opts)
 | 
						|
        if exitcode != 0:
 | 
						|
            lowheap = hiheap
 | 
						|
            hiheap = (lowheap + goodheap) // 2
 | 
						|
        else:
 | 
						|
            goodheap = hiheap
 | 
						|
            hiheap = (lowheap + hiheap) // 2
 | 
						|
 | 
						|
    return {
 | 
						|
        'testfile': opts.testfile,
 | 
						|
        'heaplimit to pass': goodheap
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
def main(options):
 | 
						|
    check_files(options)
 | 
						|
    result = heap_limit(options)
 | 
						|
    print(json.dumps(result, indent=4))
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main(get_args())
 |