13af6ab5fSopenharmony_ci#!/usr/bin/env python3
23af6ab5fSopenharmony_ci# -*- coding: utf-8 -*-
33af6ab5fSopenharmony_ci
43af6ab5fSopenharmony_ci"""
53af6ab5fSopenharmony_ciCopyright (c) 2021 Huawei Device Co., Ltd.
63af6ab5fSopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License");
73af6ab5fSopenharmony_ciyou may not use this file except in compliance with the License.
83af6ab5fSopenharmony_ciYou may obtain a copy of the License at
93af6ab5fSopenharmony_ci
103af6ab5fSopenharmony_ci    http://www.apache.org/licenses/LICENSE-2.0
113af6ab5fSopenharmony_ci
123af6ab5fSopenharmony_ciUnless required by applicable law or agreed to in writing, software
133af6ab5fSopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS,
143af6ab5fSopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153af6ab5fSopenharmony_ciSee the License for the specific language governing permissions and
163af6ab5fSopenharmony_cilimitations under the License.
173af6ab5fSopenharmony_ci
183af6ab5fSopenharmony_ciDescription: Use ark to execute js files
193af6ab5fSopenharmony_ci"""
203af6ab5fSopenharmony_ci
213af6ab5fSopenharmony_ciimport argparse
223af6ab5fSopenharmony_ciimport os
233af6ab5fSopenharmony_ciimport platform
243af6ab5fSopenharmony_ciimport json
253af6ab5fSopenharmony_ciimport sys
263af6ab5fSopenharmony_ciimport signal
273af6ab5fSopenharmony_ciimport re
283af6ab5fSopenharmony_ciimport fileinput
293af6ab5fSopenharmony_ciimport subprocess
303af6ab5fSopenharmony_cifrom utils import *
313af6ab5fSopenharmony_cifrom config import *
323af6ab5fSopenharmony_ciimport mix_compile
333af6ab5fSopenharmony_ci
343af6ab5fSopenharmony_ci
353af6ab5fSopenharmony_cidef parse_args():
363af6ab5fSopenharmony_ci    parser = argparse.ArgumentParser()
373af6ab5fSopenharmony_ci    parser.add_argument('--ark-tool',
383af6ab5fSopenharmony_ci                        default=DEFAULT_ARK_TOOL,
393af6ab5fSopenharmony_ci                        required=False,
403af6ab5fSopenharmony_ci                        help="ark's binary tool")
413af6ab5fSopenharmony_ci    parser.add_argument('--ark-aot', action='store_true',
423af6ab5fSopenharmony_ci                        required=False,
433af6ab5fSopenharmony_ci                        help="Run test262 with aot")
443af6ab5fSopenharmony_ci    parser.add_argument('--ark-aot-tool',
453af6ab5fSopenharmony_ci                        default=DEFAULT_ARK_AOT_TOOL,
463af6ab5fSopenharmony_ci                        required=False,
473af6ab5fSopenharmony_ci                        help="ark's aot tool")
483af6ab5fSopenharmony_ci    parser.add_argument("--libs-dir",
493af6ab5fSopenharmony_ci                        default=DEFAULT_LIBS_DIR,
503af6ab5fSopenharmony_ci                        required=False,
513af6ab5fSopenharmony_ci                        help="The path collection of dependent so has been divided by':'")
523af6ab5fSopenharmony_ci    parser.add_argument("--js-file",
533af6ab5fSopenharmony_ci                        required=True,
543af6ab5fSopenharmony_ci                        help="js file")
553af6ab5fSopenharmony_ci    parser.add_argument("--stub-file",
563af6ab5fSopenharmony_ci                        default=DEFAULT_STUB_FILE,
573af6ab5fSopenharmony_ci                        required=False,
583af6ab5fSopenharmony_ci                        help="stub file")
593af6ab5fSopenharmony_ci    parser.add_argument('--ark-frontend',
603af6ab5fSopenharmony_ci                        default=DEFAULT_ARK_FRONTEND,
613af6ab5fSopenharmony_ci                        required=False,
623af6ab5fSopenharmony_ci                        nargs='?', choices=ARK_FRONTEND_LIST, type=str,
633af6ab5fSopenharmony_ci                        help="Choose one of them")
643af6ab5fSopenharmony_ci    parser.add_argument('--ark-frontend-binary',
653af6ab5fSopenharmony_ci                        default=DEFAULT_ARK_FRONTEND_BINARY,
663af6ab5fSopenharmony_ci                        required=False,
673af6ab5fSopenharmony_ci                        help="ark frontend conversion binary tool")
683af6ab5fSopenharmony_ci    parser.add_argument('--ark-arch',
693af6ab5fSopenharmony_ci                        default=DEFAULT_ARK_ARCH,
703af6ab5fSopenharmony_ci                        required=False,
713af6ab5fSopenharmony_ci                        nargs='?', choices=ARK_ARCH_LIST, type=str,
723af6ab5fSopenharmony_ci                        help="Choose one of them")
733af6ab5fSopenharmony_ci    parser.add_argument('--ark-arch-root',
743af6ab5fSopenharmony_ci                        default=DEFAULT_ARK_ARCH,
753af6ab5fSopenharmony_ci                        required=False,
763af6ab5fSopenharmony_ci                        help="the root path for qemu-aarch64 or qemu-arm")
773af6ab5fSopenharmony_ci    parser.add_argument('--opt-level',
783af6ab5fSopenharmony_ci                        default=DEFAULT_OPT_LEVEL,
793af6ab5fSopenharmony_ci                        required=False,
803af6ab5fSopenharmony_ci                        help="the opt level for es2abc")
813af6ab5fSopenharmony_ci    parser.add_argument('--es2abc-thread-count',
823af6ab5fSopenharmony_ci                        default=DEFAULT_ES2ABC_THREAD_COUNT,
833af6ab5fSopenharmony_ci                        required=False,
843af6ab5fSopenharmony_ci                        help="the thread count for es2abc")
853af6ab5fSopenharmony_ci    parser.add_argument('--merge-abc-binary',
863af6ab5fSopenharmony_ci                        default=DEFAULT_MERGE_ABC_BINARY,
873af6ab5fSopenharmony_ci                        required=False,
883af6ab5fSopenharmony_ci                        help="frontend merge abc binary tool")
893af6ab5fSopenharmony_ci    parser.add_argument('--merge-abc-mode',
903af6ab5fSopenharmony_ci                        default=DEFAULT_MERGE_ABC_MODE,
913af6ab5fSopenharmony_ci                        required=False,
923af6ab5fSopenharmony_ci                        help="run test for merge abc mode")
933af6ab5fSopenharmony_ci    parser.add_argument('--product-name',
943af6ab5fSopenharmony_ci                        default=DEFAULT_PRODUCT_NAME,
953af6ab5fSopenharmony_ci                        required=False,
963af6ab5fSopenharmony_ci                        help="ark's product name")
973af6ab5fSopenharmony_ci    parser.add_argument('--run-pgo', action='store_true',
983af6ab5fSopenharmony_ci                        required=False,
993af6ab5fSopenharmony_ci                        help="Run test262 with aot pgo")
1003af6ab5fSopenharmony_ci    parser.add_argument('--enable-litecg', action='store_true',
1013af6ab5fSopenharmony_ci                        required=False,
1023af6ab5fSopenharmony_ci                        help="Run test262 with aot litecg enabled")
1033af6ab5fSopenharmony_ci    parser.add_argument('--run-jit', action='store_true',
1043af6ab5fSopenharmony_ci                        required=False,
1053af6ab5fSopenharmony_ci                        help="Run test262 with JIT")
1063af6ab5fSopenharmony_ci    parser.add_argument('--run-baseline-jit', action='store_true',
1073af6ab5fSopenharmony_ci                        required=False,
1083af6ab5fSopenharmony_ci                        help="Run test262 with baseline JIT")
1093af6ab5fSopenharmony_ci    parser.add_argument('--abc2program', action='store_true',
1103af6ab5fSopenharmony_ci                        help="Use abc2prog to generate abc, aot or pgo is not supported yet under this option")
1113af6ab5fSopenharmony_ci    parser.add_argument('--disable-force-gc', action='store_true',
1123af6ab5fSopenharmony_ci                        help="Run test262 with close force-gc")
1133af6ab5fSopenharmony_ci    parser.add_argument('--enable-arkguard', action='store_true',
1143af6ab5fSopenharmony_ci                        required=False,
1153af6ab5fSopenharmony_ci                        help="enable arkguard for 262 tests")
1163af6ab5fSopenharmony_ci    arguments = parser.parse_args()
1173af6ab5fSopenharmony_ci    return arguments
1183af6ab5fSopenharmony_ci
1193af6ab5fSopenharmony_ci
1203af6ab5fSopenharmony_ciICU_PATH = f"--icu-data-path={CODE_ROOT}/third_party/icu/ohos_icu4j/data"
1213af6ab5fSopenharmony_ciif platform.system() == "Windows":
1223af6ab5fSopenharmony_ci    ICU_PATH = ICU_PATH.replace("/", "\\")
1233af6ab5fSopenharmony_ciARK_TOOL = DEFAULT_ARK_TOOL
1243af6ab5fSopenharmony_ciLIBS_DIR = DEFAULT_LIBS_DIR
1253af6ab5fSopenharmony_ciARK_AOT_TOOL = DEFAULT_ARK_AOT_TOOL
1263af6ab5fSopenharmony_ciARK_FRONTEND = DEFAULT_ARK_FRONTEND
1273af6ab5fSopenharmony_ciARK_FRONTEND_BINARY = DEFAULT_ARK_FRONTEND_BINARY
1283af6ab5fSopenharmony_ciARK_ARCH = DEFAULT_ARK_ARCH
1293af6ab5fSopenharmony_ciPROTO_BIN_SUFFIX = "protoBin"
1303af6ab5fSopenharmony_ci
1313af6ab5fSopenharmony_ci
1323af6ab5fSopenharmony_ciclass ArkProgram():
1333af6ab5fSopenharmony_ci    def __init__(self, args):
1343af6ab5fSopenharmony_ci        self.args = args
1353af6ab5fSopenharmony_ci        self.ark_tool = ARK_TOOL
1363af6ab5fSopenharmony_ci        self.ark_aot = False
1373af6ab5fSopenharmony_ci        self.run_pgo = False
1383af6ab5fSopenharmony_ci        self.enable_litecg = False
1393af6ab5fSopenharmony_ci        self.disable_force_gc = False
1403af6ab5fSopenharmony_ci        self.run_jit = False
1413af6ab5fSopenharmony_ci        self.run_baseline_jit = False
1423af6ab5fSopenharmony_ci        self.ark_aot_tool = ARK_AOT_TOOL
1433af6ab5fSopenharmony_ci        self.libs_dir = LIBS_DIR
1443af6ab5fSopenharmony_ci        self.ark_frontend = ARK_FRONTEND
1453af6ab5fSopenharmony_ci        self.ark_frontend_binary = ARK_FRONTEND_BINARY
1463af6ab5fSopenharmony_ci        self.module_list = []
1473af6ab5fSopenharmony_ci        self.dynamicImport_list = []
1483af6ab5fSopenharmony_ci        self.js_file = ""
1493af6ab5fSopenharmony_ci        self.stub_file = ""
1503af6ab5fSopenharmony_ci        self.module = False
1513af6ab5fSopenharmony_ci        self.abc_file = ""
1523af6ab5fSopenharmony_ci        self.arch = ARK_ARCH
1533af6ab5fSopenharmony_ci        self.arch_root = ""
1543af6ab5fSopenharmony_ci        self.opt_level = DEFAULT_OPT_LEVEL
1553af6ab5fSopenharmony_ci        self.es2abc_thread_count = DEFAULT_ES2ABC_THREAD_COUNT
1563af6ab5fSopenharmony_ci        self.merge_abc_binary = DEFAULT_MERGE_ABC_BINARY
1573af6ab5fSopenharmony_ci        self.merge_abc_mode = DEFAULT_MERGE_ABC_MODE
1583af6ab5fSopenharmony_ci        self.abc2program = False
1593af6ab5fSopenharmony_ci        # when enabling abc2program, may generate a list of abc files
1603af6ab5fSopenharmony_ci        self.abc_outputs = []
1613af6ab5fSopenharmony_ci        self.enable_arkguard = False
1623af6ab5fSopenharmony_ci
1633af6ab5fSopenharmony_ci    def proce_parameters(self):
1643af6ab5fSopenharmony_ci        if self.args.ark_tool:
1653af6ab5fSopenharmony_ci            self.ark_tool = self.args.ark_tool
1663af6ab5fSopenharmony_ci
1673af6ab5fSopenharmony_ci        if self.args.ark_aot:
1683af6ab5fSopenharmony_ci            self.ark_aot = self.args.ark_aot
1693af6ab5fSopenharmony_ci
1703af6ab5fSopenharmony_ci        if self.args.run_pgo:
1713af6ab5fSopenharmony_ci            self.run_pgo = self.args.run_pgo
1723af6ab5fSopenharmony_ci
1733af6ab5fSopenharmony_ci        if self.args.enable_litecg:
1743af6ab5fSopenharmony_ci            self.enable_litecg = self.args.enable_litecg
1753af6ab5fSopenharmony_ci
1763af6ab5fSopenharmony_ci        if self.args.disable_force_gc:
1773af6ab5fSopenharmony_ci            self.disable_force_gc = self.args.disable_force_gc
1783af6ab5fSopenharmony_ci
1793af6ab5fSopenharmony_ci        if self.args.run_jit:
1803af6ab5fSopenharmony_ci            self.run_jit = self.args.run_jit
1813af6ab5fSopenharmony_ci
1823af6ab5fSopenharmony_ci        if self.args.run_baseline_jit:
1833af6ab5fSopenharmony_ci            self.run_baseline_jit = self.args.run_baseline_jit
1843af6ab5fSopenharmony_ci
1853af6ab5fSopenharmony_ci        if self.args.ark_aot_tool:
1863af6ab5fSopenharmony_ci            self.ark_aot_tool = self.args.ark_aot_tool
1873af6ab5fSopenharmony_ci
1883af6ab5fSopenharmony_ci        if self.args.ark_frontend_binary:
1893af6ab5fSopenharmony_ci            self.ark_frontend_binary = self.args.ark_frontend_binary
1903af6ab5fSopenharmony_ci
1913af6ab5fSopenharmony_ci        if self.args.libs_dir:
1923af6ab5fSopenharmony_ci            self.libs_dir = self.args.libs_dir
1933af6ab5fSopenharmony_ci
1943af6ab5fSopenharmony_ci        if self.args.ark_frontend:
1953af6ab5fSopenharmony_ci            self.ark_frontend = self.args.ark_frontend
1963af6ab5fSopenharmony_ci
1973af6ab5fSopenharmony_ci        if self.args.opt_level:
1983af6ab5fSopenharmony_ci            self.opt_level = self.args.opt_level
1993af6ab5fSopenharmony_ci
2003af6ab5fSopenharmony_ci        if self.args.es2abc_thread_count:
2013af6ab5fSopenharmony_ci            self.es2abc_thread_count = self.args.es2abc_thread_count
2023af6ab5fSopenharmony_ci
2033af6ab5fSopenharmony_ci        if self.args.merge_abc_binary:
2043af6ab5fSopenharmony_ci            self.merge_abc_binary = self.args.merge_abc_binary
2053af6ab5fSopenharmony_ci
2063af6ab5fSopenharmony_ci        if self.args.merge_abc_mode:
2073af6ab5fSopenharmony_ci            self.merge_abc_mode = self.args.merge_abc_mode
2083af6ab5fSopenharmony_ci
2093af6ab5fSopenharmony_ci        if self.args.abc2program:
2103af6ab5fSopenharmony_ci            self.abc2program = self.args.abc2program
2113af6ab5fSopenharmony_ci
2123af6ab5fSopenharmony_ci        self.enable_arkguard = self.args.enable_arkguard
2133af6ab5fSopenharmony_ci
2143af6ab5fSopenharmony_ci        self.module_list = MODULE_LIST
2153af6ab5fSopenharmony_ci
2163af6ab5fSopenharmony_ci        self.dynamicImport_list = DYNAMIC_IMPORT_LIST
2173af6ab5fSopenharmony_ci
2183af6ab5fSopenharmony_ci        self.js_file = self.args.js_file
2193af6ab5fSopenharmony_ci
2203af6ab5fSopenharmony_ci        self.stub_file = self.args.stub_file
2213af6ab5fSopenharmony_ci
2223af6ab5fSopenharmony_ci        self.arch = self.args.ark_arch
2233af6ab5fSopenharmony_ci
2243af6ab5fSopenharmony_ci        self.arch_root = self.args.ark_arch_root
2253af6ab5fSopenharmony_ci
2263af6ab5fSopenharmony_ci    def check_compile_mode(self, file):
2273af6ab5fSopenharmony_ci        with open(file, 'r', encoding='utf-8') as check_file:
2283af6ab5fSopenharmony_ci            content_file = check_file.read()
2293af6ab5fSopenharmony_ci            module_pattern = '((?:export|import)\s+(?:{[\s\S]+}|\*))|'
2303af6ab5fSopenharmony_ci            module_pattern += '(export\s+(?:let|const|var|function|class|default))|'
2313af6ab5fSopenharmony_ci            module_pattern += '(import\s+[\'\"].+[\'\"])'
2323af6ab5fSopenharmony_ci            module_mode_list = re.findall(module_pattern, content_file)
2333af6ab5fSopenharmony_ci
2343af6ab5fSopenharmony_ci            for module_mode in list(set(module_mode_list)):
2353af6ab5fSopenharmony_ci                if len(module_mode[0]) != 0 or len(module_mode[1]) != 0 or len(module_mode[2]) != 0:
2363af6ab5fSopenharmony_ci                    return True
2373af6ab5fSopenharmony_ci
2383af6ab5fSopenharmony_ci        if "flags: [module]" in content_file or "/language/module-code/" in self.js_file:
2393af6ab5fSopenharmony_ci            return True
2403af6ab5fSopenharmony_ci
2413af6ab5fSopenharmony_ci        return False
2423af6ab5fSopenharmony_ci
2433af6ab5fSopenharmony_ci    def get_all_skip_force_gc_tests(self):
2443af6ab5fSopenharmony_ci        SKIP_FORCE_GC_LIST_FILES.append(TS2ABC_SKIP_FORCE_GC_LIST_FILE)
2453af6ab5fSopenharmony_ci
2463af6ab5fSopenharmony_ci        for file in SKIP_FORCE_GC_LIST_FILES:
2473af6ab5fSopenharmony_ci            with open(file) as jsonfile:
2483af6ab5fSopenharmony_ci                json_data = json.load(jsonfile)
2493af6ab5fSopenharmony_ci                for key in json_data:
2503af6ab5fSopenharmony_ci                    FORCE_GC_SKIP_TESTS.extend(key["files"])
2513af6ab5fSopenharmony_ci
2523af6ab5fSopenharmony_ci    def gen_dependency_proto(self, dependency):
2533af6ab5fSopenharmony_ci        cmd_args = []
2543af6ab5fSopenharmony_ci        output_file = os.path.splitext(dependency.replace(DATA_DIR, BASE_OUT_DIR))[0]
2553af6ab5fSopenharmony_ci        output_abc = f"{output_file}{ABC_EXT}"
2563af6ab5fSopenharmony_ci        frontend_tool = self.ark_frontend_binary
2573af6ab5fSopenharmony_ci        merge_abc_binary = self.args.merge_abc_binary
2583af6ab5fSopenharmony_ci        merge_abc_mode = self.merge_abc_mode
2593af6ab5fSopenharmony_ci        compile_as_module = self.check_compile_mode(dependency)
2603af6ab5fSopenharmony_ci
2613af6ab5fSopenharmony_ci        if self.ark_frontend == ARK_FRONTEND_LIST[0]:
2623af6ab5fSopenharmony_ci            if merge_abc_mode != "0":
2633af6ab5fSopenharmony_ci                cmd_args = ['node', '--expose-gc', frontend_tool, dependency,
2643af6ab5fSopenharmony_ci                            '--output-proto', '--merge-abc']
2653af6ab5fSopenharmony_ci            else:
2663af6ab5fSopenharmony_ci                # for testing no-record-name abc
2673af6ab5fSopenharmony_ci                cmd_args = ['node', '--expose-gc', frontend_tool, dependency,
2683af6ab5fSopenharmony_ci                            '-o', output_abc]
2693af6ab5fSopenharmony_ci            if compile_as_module:
2703af6ab5fSopenharmony_ci                mod_opt_index = 6
2713af6ab5fSopenharmony_ci                cmd_args.insert(mod_opt_index, "--modules")
2723af6ab5fSopenharmony_ci        elif self.ark_frontend == ARK_FRONTEND_LIST[1]:
2733af6ab5fSopenharmony_ci            if merge_abc_mode != "0":
2743af6ab5fSopenharmony_ci                proto_bin_file = output_file + "." + PROTO_BIN_SUFFIX
2753af6ab5fSopenharmony_ci                cmd_args = [frontend_tool, dependency, '--outputProto',
2763af6ab5fSopenharmony_ci                            proto_bin_file, '--merge-abc']
2773af6ab5fSopenharmony_ci            else:
2783af6ab5fSopenharmony_ci                # for testing no-record-name abc
2793af6ab5fSopenharmony_ci                cmd_args = [frontend_tool, dependency, '--output', output_abc]
2803af6ab5fSopenharmony_ci            if compile_as_module:
2813af6ab5fSopenharmony_ci                mod_opt_index = 4
2823af6ab5fSopenharmony_ci                cmd_args.insert(mod_opt_index, "--module")
2833af6ab5fSopenharmony_ci        proc = subprocess.Popen(cmd_args)
2843af6ab5fSopenharmony_ci        proc.wait()
2853af6ab5fSopenharmony_ci
2863af6ab5fSopenharmony_ci    def gen_apart_abc(self, dependencies):
2873af6ab5fSopenharmony_ci        merge_abc_binary = self.args.merge_abc_binary
2883af6ab5fSopenharmony_ci        retcode = 0
2893af6ab5fSopenharmony_ci        for dependency in list(set(dependencies)):
2903af6ab5fSopenharmony_ci            cmd_args = []
2913af6ab5fSopenharmony_ci            output_file = os.path.splitext(dependency.replace(DATA_DIR, BASE_OUT_DIR))[0]
2923af6ab5fSopenharmony_ci            output_abc = os.path.basename(f"{output_file}{ABC_EXT}")
2933af6ab5fSopenharmony_ci            file_dir = os.path.split(self.js_file)[0]
2943af6ab5fSopenharmony_ci            is_apart_abc_existed = os.path.exists(file_dir + "/" + output_abc)
2953af6ab5fSopenharmony_ci            dependency_file_prefix = os.path.basename(dependency)[:-3]
2963af6ab5fSopenharmony_ci            dependency_bin_file = '%s/%s.%s' % (file_dir,
2973af6ab5fSopenharmony_ci                                                dependency_file_prefix, PROTO_BIN_SUFFIX)
2983af6ab5fSopenharmony_ci            cmd_args = [merge_abc_binary, '--input', dependency_bin_file,
2993af6ab5fSopenharmony_ci                        '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath',
3003af6ab5fSopenharmony_ci                        file_dir, '--output', output_abc]
3013af6ab5fSopenharmony_ci            if not is_apart_abc_existed:
3023af6ab5fSopenharmony_ci                retcode = exec_command(cmd_args)
3033af6ab5fSopenharmony_ci        return retcode
3043af6ab5fSopenharmony_ci
3053af6ab5fSopenharmony_ci    def gen_merged_abc(self, dependencies, file_name_pre, proto_bin_file):
3063af6ab5fSopenharmony_ci        merge_abc_binary = self.args.merge_abc_binary
3073af6ab5fSopenharmony_ci        file_dir = os.path.split(self.js_file)[0]
3083af6ab5fSopenharmony_ci        proto_abc_file = ".".join([os.path.splitext(os.path.basename(self.js_file))[0], "abc"])
3093af6ab5fSopenharmony_ci        generate_merged_abc = True
3103af6ab5fSopenharmony_ci        # collect protoBin file into new-made testcase dir
3113af6ab5fSopenharmony_ci        if (len(dependencies) != 0):
3123af6ab5fSopenharmony_ci            if os.path.exists(file_name_pre):
3133af6ab5fSopenharmony_ci                subprocess.run(['rm', '-rf', file_name_pre])
3143af6ab5fSopenharmony_ci            subprocess.run(['mkdir', file_name_pre])
3153af6ab5fSopenharmony_ci
3163af6ab5fSopenharmony_ci            for dependency in list(set(dependencies)):
3173af6ab5fSopenharmony_ci                dependency_file_prefix = os.path.basename(dependency)[:-3]
3183af6ab5fSopenharmony_ci                dependency_bin_file = '%s/%s.%s' % (file_dir,
3193af6ab5fSopenharmony_ci                                                    dependency_file_prefix, PROTO_BIN_SUFFIX)
3203af6ab5fSopenharmony_ci                # test262 report syntax error cases
3213af6ab5fSopenharmony_ci                if not os.path.exists(dependency_bin_file):
3223af6ab5fSopenharmony_ci                    generate_merged_abc = False
3233af6ab5fSopenharmony_ci                else:
3243af6ab5fSopenharmony_ci                    subprocess.run(['cp', dependency_bin_file, file_name_pre])
3253af6ab5fSopenharmony_ci
3263af6ab5fSopenharmony_ci            if not os.path.exists(proto_bin_file):
3273af6ab5fSopenharmony_ci                generate_merged_abc = False
3283af6ab5fSopenharmony_ci            else:
3293af6ab5fSopenharmony_ci                subprocess.run(['cp', proto_bin_file, file_name_pre])
3303af6ab5fSopenharmony_ci
3313af6ab5fSopenharmony_ci        if (len(dependencies) != 0) and generate_merged_abc:
3323af6ab5fSopenharmony_ci            # module test262 cases
3333af6ab5fSopenharmony_ci            cmd_args = [merge_abc_binary, '--input', file_name_pre,
3343af6ab5fSopenharmony_ci                        '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath',
3353af6ab5fSopenharmony_ci                        file_dir, '--output', proto_abc_file]
3363af6ab5fSopenharmony_ci            self.abc_file = f'{file_name_pre}.abc'
3373af6ab5fSopenharmony_ci            return exec_command(cmd_args)
3383af6ab5fSopenharmony_ci        elif os.path.exists(proto_bin_file):
3393af6ab5fSopenharmony_ci            cmd_args = [merge_abc_binary, '--input', proto_bin_file,
3403af6ab5fSopenharmony_ci                        '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath',
3413af6ab5fSopenharmony_ci                        file_dir, '--output', proto_abc_file]
3423af6ab5fSopenharmony_ci            self.abc_file = f'{file_name_pre}.abc'
3433af6ab5fSopenharmony_ci            return exec_command(cmd_args)
3443af6ab5fSopenharmony_ci        return 0
3453af6ab5fSopenharmony_ci
3463af6ab5fSopenharmony_ci    def gen_abc_for_merge_abc_mode(self, js_file, dependencies):
3473af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(js_file)[0]
3483af6ab5fSopenharmony_ci        proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX
3493af6ab5fSopenharmony_ci
3503af6ab5fSopenharmony_ci        if "dynamic-import" in js_file:
3513af6ab5fSopenharmony_ci            return self.gen_apart_abc(dependencies)
3523af6ab5fSopenharmony_ci        else:
3533af6ab5fSopenharmony_ci            return self.gen_merged_abc(dependencies, file_name_pre, proto_bin_file)
3543af6ab5fSopenharmony_ci
3553af6ab5fSopenharmony_ci    def gen_abc_for_script_mode(self, cmd_args, retcode):
3563af6ab5fSopenharmony_ci        retcode = exec_command(cmd_args)
3573af6ab5fSopenharmony_ci        if retcode == 1:
3583af6ab5fSopenharmony_ci            return retcode
3593af6ab5fSopenharmony_ci        self.abc_cmd = cmd_args
3603af6ab5fSopenharmony_ci        return retcode
3613af6ab5fSopenharmony_ci
3623af6ab5fSopenharmony_ci    def gen_abc_for_dynamic_import(self, js_file, retcode):
3633af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(js_file)[0]
3643af6ab5fSopenharmony_ci        out_file = f"{file_name_pre}{ABC_EXT}"
3653af6ab5fSopenharmony_ci        proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX
3663af6ab5fSopenharmony_ci        merge_abc_binary = self.args.merge_abc_binary
3673af6ab5fSopenharmony_ci
3683af6ab5fSopenharmony_ci        if ("dynamic-import" in js_file and not os.path.exists(out_file)):
3693af6ab5fSopenharmony_ci            file_dir = os.path.split(self.js_file)[0]
3703af6ab5fSopenharmony_ci            proto_abc_file = ".".join([os.path.splitext(os.path.basename(self.js_file))[0], "abc"])
3713af6ab5fSopenharmony_ci            cmd_args = [merge_abc_binary, '--input', proto_bin_file,
3723af6ab5fSopenharmony_ci                        '--suffix', PROTO_BIN_SUFFIX, '--outputFilePath',
3733af6ab5fSopenharmony_ci                        file_dir, '--output', proto_abc_file]
3743af6ab5fSopenharmony_ci            retcode = exec_command(cmd_args)
3753af6ab5fSopenharmony_ci            if retcode == 1:
3763af6ab5fSopenharmony_ci                return retcode
3773af6ab5fSopenharmony_ci            self.abc_cmd = cmd_args
3783af6ab5fSopenharmony_ci            return retcode
3793af6ab5fSopenharmony_ci
3803af6ab5fSopenharmony_ci    def get_abc_from_import_statement(self, js_file):
3813af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(js_file)[0]
3823af6ab5fSopenharmony_ci        out_file = f"{file_name_pre}{ABC_EXT}"
3833af6ab5fSopenharmony_ci
3843af6ab5fSopenharmony_ci        self.abc_file = os.path.abspath(out_file)
3853af6ab5fSopenharmony_ci        js_dir = os.path.dirname(js_file)
3863af6ab5fSopenharmony_ci        for line in fileinput.input(js_file):
3873af6ab5fSopenharmony_ci            import_line = re.findall(r"^(?:ex|im)port.*\.js", line)
3883af6ab5fSopenharmony_ci            if len(import_line):
3893af6ab5fSopenharmony_ci                import_file = re.findall(r"['\"].*\.js", import_line[0])
3903af6ab5fSopenharmony_ci                if len(import_file):
3913af6ab5fSopenharmony_ci                    abc_file = import_file[0][1:].replace(".js", ABC_EXT)
3923af6ab5fSopenharmony_ci                    abc_file = os.path.abspath(f'{js_dir}/{abc_file}')
3933af6ab5fSopenharmony_ci                    if self.abc_file.find(abc_file) < 0:
3943af6ab5fSopenharmony_ci                        self.abc_file += f':{abc_file}'
3953af6ab5fSopenharmony_ci
3963af6ab5fSopenharmony_ci    def gen_command(self, js_file, compile_as_module):
3973af6ab5fSopenharmony_ci        cmd_args = []
3983af6ab5fSopenharmony_ci        mod_opt_index = 0
3993af6ab5fSopenharmony_ci        frontend_tool = self.ark_frontend_binary
4003af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(js_file)[0]
4013af6ab5fSopenharmony_ci        merge_abc_mode = self.merge_abc_mode
4023af6ab5fSopenharmony_ci        proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX
4033af6ab5fSopenharmony_ci        out_file = f"{file_name_pre}{ABC_EXT}"
4043af6ab5fSopenharmony_ci
4053af6ab5fSopenharmony_ci        if self.ark_frontend == ARK_FRONTEND_LIST[0]:
4063af6ab5fSopenharmony_ci            mod_opt_index = 3
4073af6ab5fSopenharmony_ci            if merge_abc_mode != "0":
4083af6ab5fSopenharmony_ci                cmd_args = ['node', '--expose-gc', frontend_tool, js_file,
4093af6ab5fSopenharmony_ci                            '--output-proto', '--merge-abc']
4103af6ab5fSopenharmony_ci            else:
4113af6ab5fSopenharmony_ci                # for testing no-record-name abc
4123af6ab5fSopenharmony_ci                cmd_args = ['node', '--expose-gc', frontend_tool, js_file,
4133af6ab5fSopenharmony_ci                            '-o', out_file]
4143af6ab5fSopenharmony_ci            if compile_as_module:
4153af6ab5fSopenharmony_ci                cmd_args.insert(mod_opt_index, "-m")
4163af6ab5fSopenharmony_ci                self.module = True
4173af6ab5fSopenharmony_ci        elif self.ark_frontend == ARK_FRONTEND_LIST[1]:
4183af6ab5fSopenharmony_ci            mod_opt_index = 1
4193af6ab5fSopenharmony_ci            if merge_abc_mode != "0":
4203af6ab5fSopenharmony_ci                # '--merge-abc' is added due to 'merge-abc' is not opened as default in es2abc, should be removed later
4213af6ab5fSopenharmony_ci                cmd_args = [frontend_tool, '--function-threads=' +
4223af6ab5fSopenharmony_ci                            str(self.es2abc_thread_count), '--outputProto',
4233af6ab5fSopenharmony_ci                            proto_bin_file, js_file, '--merge-abc', '--opt-level=' + str(self.opt_level)]
4243af6ab5fSopenharmony_ci            else:
4253af6ab5fSopenharmony_ci                # for testing no-record-name abc
4263af6ab5fSopenharmony_ci                cmd_args = [frontend_tool, '--opt-level=' + str(self.opt_level),
4273af6ab5fSopenharmony_ci                            '--function-threads=' +
4283af6ab5fSopenharmony_ci                            str(self.es2abc_thread_count), '--output',
4293af6ab5fSopenharmony_ci                            out_file, js_file]
4303af6ab5fSopenharmony_ci            if compile_as_module:
4313af6ab5fSopenharmony_ci                cmd_args.insert(mod_opt_index, "--module")
4323af6ab5fSopenharmony_ci                self.module = True
4333af6ab5fSopenharmony_ci
4343af6ab5fSopenharmony_ci        return cmd_args
4353af6ab5fSopenharmony_ci
4363af6ab5fSopenharmony_ci    def gen_dependencies_proto(self, js_file):
4373af6ab5fSopenharmony_ci        file_dir = os.path.split(js_file)[0]
4383af6ab5fSopenharmony_ci        compile_as_module = False
4393af6ab5fSopenharmony_ci        dependencies = []
4403af6ab5fSopenharmony_ci
4413af6ab5fSopenharmony_ci        if ("dynamic-import" in js_file):
4423af6ab5fSopenharmony_ci            search_dir = os.path.dirname(js_file)
4433af6ab5fSopenharmony_ci        else:
4443af6ab5fSopenharmony_ci            search_dir = os.path.dirname(js_file.replace(BASE_OUT_DIR, DATA_DIR))
4453af6ab5fSopenharmony_ci
4463af6ab5fSopenharmony_ci        dependencies = collect_module_dependencies(js_file, search_dir, [])
4473af6ab5fSopenharmony_ci        compile_as_module = self.check_compile_mode(js_file)
4483af6ab5fSopenharmony_ci
4493af6ab5fSopenharmony_ci        if (self.ark_frontend == ARK_FRONTEND_LIST[1]):
4503af6ab5fSopenharmony_ci            if list(set(dependencies)):
4513af6ab5fSopenharmony_ci                for dependency in list(set(dependencies)):
4523af6ab5fSopenharmony_ci                    dependency_file = os.path.basename(dependency)
4533af6ab5fSopenharmony_ci                    dependency_name = os.path.splitext(dependency_file)[0]
4543af6ab5fSopenharmony_ci                    out_dependency_pre = '%s/%s' % (file_dir, dependency_name)
4553af6ab5fSopenharmony_ci                    out_dependency_proto = f"{out_dependency_pre}.protoBin"
4563af6ab5fSopenharmony_ci                    is_dependency_proto_existed = os.path.exists(out_dependency_proto)
4573af6ab5fSopenharmony_ci                    if not is_dependency_proto_existed:
4583af6ab5fSopenharmony_ci                        self.gen_dependency_proto(dependency)
4593af6ab5fSopenharmony_ci
4603af6ab5fSopenharmony_ci        return compile_as_module, dependencies
4613af6ab5fSopenharmony_ci
4623af6ab5fSopenharmony_ci    def gen_abc_for_mix_compile_mode(self, dependencies, out_file):
4633af6ab5fSopenharmony_ci        record_names = set()
4643af6ab5fSopenharmony_ci        files_info_list = []
4653af6ab5fSopenharmony_ci        # In some cases of circular reference, the js file will be from BASE_OUT_DIR, remove it
4663af6ab5fSopenharmony_ci        dependencies = [os.path.abspath(dependency) for dependency in dependencies]
4673af6ab5fSopenharmony_ci        dependencies.insert(0, os.path.abspath(self.js_file))
4683af6ab5fSopenharmony_ci        for dependency in dependencies:
4693af6ab5fSopenharmony_ci            record_name = os.path.splitext(os.path.basename(dependency))[0]
4703af6ab5fSopenharmony_ci            if record_name in record_names:
4713af6ab5fSopenharmony_ci                continue
4723af6ab5fSopenharmony_ci
4733af6ab5fSopenharmony_ci            record_names.add(record_name)
4743af6ab5fSopenharmony_ci            compile_mode = 'esm' if self.check_compile_mode(dependency) else 'script'
4753af6ab5fSopenharmony_ci            files_info_list.append(f"{dependency};{record_name};{compile_mode};xxx;yyy\n")
4763af6ab5fSopenharmony_ci
4773af6ab5fSopenharmony_ci        mix_compiler = mix_compile.MixCompiler(out_file, files_info_list, self.opt_level,
4783af6ab5fSopenharmony_ci                                               self.es2abc_thread_count, self.es2abc_thread_count,
4793af6ab5fSopenharmony_ci                                               self.es2abc_thread_count, self.ark_frontend_binary)
4803af6ab5fSopenharmony_ci
4813af6ab5fSopenharmony_ci        retcode = mix_compiler.mix_compile()
4823af6ab5fSopenharmony_ci        self.abc_outputs = mix_compiler.abc_outputs
4833af6ab5fSopenharmony_ci        return retcode
4843af6ab5fSopenharmony_ci
4853af6ab5fSopenharmony_ci    def gen_abc(self):
4863af6ab5fSopenharmony_ci        js_file = self.js_file
4873af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(js_file)[0]
4883af6ab5fSopenharmony_ci        file_name = os.path.basename(js_file)
4893af6ab5fSopenharmony_ci        file_dir = os.path.split(js_file)[0]
4903af6ab5fSopenharmony_ci        out_file = f"{file_name_pre}{ABC_EXT}"
4913af6ab5fSopenharmony_ci        out_proto = f"{file_name_pre}.proto"
4923af6ab5fSopenharmony_ci        proto_bin_file = file_name_pre + "." + PROTO_BIN_SUFFIX
4933af6ab5fSopenharmony_ci        self.abc_file = out_file
4943af6ab5fSopenharmony_ci        mod_opt_index = 0
4953af6ab5fSopenharmony_ci        compile_as_module = False
4963af6ab5fSopenharmony_ci        cmd_args = []
4973af6ab5fSopenharmony_ci        dependency_cmd_args = []
4983af6ab5fSopenharmony_ci        frontend_tool = self.ark_frontend_binary
4993af6ab5fSopenharmony_ci        merge_abc_mode = self.merge_abc_mode
5003af6ab5fSopenharmony_ci        dependencies = []
5013af6ab5fSopenharmony_ci        merge_abc_binary = self.args.merge_abc_binary
5023af6ab5fSopenharmony_ci        retcode = 0
5033af6ab5fSopenharmony_ci
5043af6ab5fSopenharmony_ci        # generate the dependencies' proto when ark_frontend is [es2panda]
5053af6ab5fSopenharmony_ci        if (file_name in self.module_list or file_name in self.dynamicImport_list):
5063af6ab5fSopenharmony_ci            compile_as_module, dependencies = self.gen_dependencies_proto(js_file)
5073af6ab5fSopenharmony_ci
5083af6ab5fSopenharmony_ci        if self.abc2program:
5093af6ab5fSopenharmony_ci            return self.gen_abc_for_mix_compile_mode(dependencies, out_file)
5103af6ab5fSopenharmony_ci
5113af6ab5fSopenharmony_ci        # generate execution command
5123af6ab5fSopenharmony_ci        cmd_args = self.gen_command(js_file, compile_as_module)
5133af6ab5fSopenharmony_ci
5143af6ab5fSopenharmony_ci        # get abc file list from import statement
5153af6ab5fSopenharmony_ci        if merge_abc_mode == "0" and self.ark_aot and self.module:
5163af6ab5fSopenharmony_ci            self.get_abc_from_import_statement(js_file)
5173af6ab5fSopenharmony_ci
5183af6ab5fSopenharmony_ci        # generate abc file by script mode
5193af6ab5fSopenharmony_ci        if not os.path.exists(out_proto):
5203af6ab5fSopenharmony_ci            retcode = self.gen_abc_for_script_mode(cmd_args, retcode)
5213af6ab5fSopenharmony_ci            if retcode == 1:
5223af6ab5fSopenharmony_ci                return retcode
5233af6ab5fSopenharmony_ci
5243af6ab5fSopenharmony_ci        # generate abc file by script mode for dynamic-import
5253af6ab5fSopenharmony_ci        if self.ark_frontend == ARK_FRONTEND_LIST[1]:
5263af6ab5fSopenharmony_ci            retcode = self.gen_abc_for_dynamic_import(js_file, retcode)
5273af6ab5fSopenharmony_ci            if retcode == 1:
5283af6ab5fSopenharmony_ci                return retcode
5293af6ab5fSopenharmony_ci
5303af6ab5fSopenharmony_ci        # generate merged abc file
5313af6ab5fSopenharmony_ci        if merge_abc_mode != "0":
5323af6ab5fSopenharmony_ci            self.gen_abc_for_merge_abc_mode(js_file, dependencies)
5333af6ab5fSopenharmony_ci
5343af6ab5fSopenharmony_ci        return retcode
5353af6ab5fSopenharmony_ci
5363af6ab5fSopenharmony_ci    def execute_arkguard(self):
5373af6ab5fSopenharmony_ci        js_file = self.js_file
5383af6ab5fSopenharmony_ci        js_file_allpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../', js_file)
5393af6ab5fSopenharmony_ci        cmd_args = ['node', '--no-warnings',
5403af6ab5fSopenharmony_ci                    '--loader=ts-node/esm',
5413af6ab5fSopenharmony_ci                    './src/cli/SecHarmony.ts',
5423af6ab5fSopenharmony_ci                    js_file_allpath,
5433af6ab5fSopenharmony_ci                    '--config-path',
5443af6ab5fSopenharmony_ci                    './test/test262/test262Config.json',
5453af6ab5fSopenharmony_ci                    '--inplace']
5463af6ab5fSopenharmony_ci        arkguard_path = os.getcwd() + '/arkguard'
5473af6ab5fSopenharmony_ci        retcode = exec_command(cmd_args, custom_cwd = arkguard_path)
5483af6ab5fSopenharmony_ci
5493af6ab5fSopenharmony_ci    def compile_aot(self):
5503af6ab5fSopenharmony_ci        os.environ["LD_LIBRARY_PATH"] = self.libs_dir
5513af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(self.js_file)[0]
5523af6ab5fSopenharmony_ci        cmd_args = []
5533af6ab5fSopenharmony_ci        if self.run_pgo:
5543af6ab5fSopenharmony_ci            if self.arch == ARK_ARCH_LIST[1]:
5553af6ab5fSopenharmony_ci                qemu_tool = "qemu-aarch64"
5563af6ab5fSopenharmony_ci                qemu_arg1 = "-L"
5573af6ab5fSopenharmony_ci                qemu_arg2 = self.arch_root
5583af6ab5fSopenharmony_ci                cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_aot_tool,
5593af6ab5fSopenharmony_ci                            ICU_PATH, f'--compiler-target-triple=aarch64-unknown-linux-gnu']
5603af6ab5fSopenharmony_ci            elif self.arch == ARK_ARCH_LIST[2]:
5613af6ab5fSopenharmony_ci                cmd_args = [self.ark_aot_tool, ICU_PATH, f'--compiler-target-triple=arm-unknown-linux-gnu']
5623af6ab5fSopenharmony_ci            elif self.arch == ARK_ARCH_LIST[0]:
5633af6ab5fSopenharmony_ci                cmd_args = [self.ark_aot_tool, ICU_PATH]
5643af6ab5fSopenharmony_ci
5653af6ab5fSopenharmony_ci            cmd_args.append("--compiler-opt-loop-peeling=true")
5663af6ab5fSopenharmony_ci            cmd_args.append("--compiler-fast-compile=false")
5673af6ab5fSopenharmony_ci            cmd_args.append("--compiler-opt-track-field=true")
5683af6ab5fSopenharmony_ci            cmd_args.append("--compiler-opt-inlining=true")
5693af6ab5fSopenharmony_ci            cmd_args.append("--compiler-max-inline-bytecodes=45")
5703af6ab5fSopenharmony_ci            cmd_args.append("--compiler-opt-level=2")
5713af6ab5fSopenharmony_ci            if self.stub_file != "":
5723af6ab5fSopenharmony_ci                cmd_args.append(f"--stub-file={self.stub_file}")
5733af6ab5fSopenharmony_ci            if self.disable_force_gc:
5743af6ab5fSopenharmony_ci                cmd_args.append(f"--enable-force-gc=false")
5753af6ab5fSopenharmony_ci            cmd_args.append(f'--compiler-pgo-profiler-path={file_name_pre}.ap')
5763af6ab5fSopenharmony_ci            cmd_args.append(f'--aot-file={file_name_pre}')
5773af6ab5fSopenharmony_ci            cmd_args.append(self.abc_file)
5783af6ab5fSopenharmony_ci        else:
5793af6ab5fSopenharmony_ci            if self.arch == ARK_ARCH_LIST[1]:
5803af6ab5fSopenharmony_ci                cmd_args = [self.ark_aot_tool, ICU_PATH,
5813af6ab5fSopenharmony_ci                            f'--compiler-target-triple=aarch64-unknown-linux-gnu',
5823af6ab5fSopenharmony_ci                            f'--aot-file={file_name_pre}',
5833af6ab5fSopenharmony_ci                            self.abc_file]
5843af6ab5fSopenharmony_ci            elif self.arch == ARK_ARCH_LIST[2]:
5853af6ab5fSopenharmony_ci                cmd_args = [self.ark_aot_tool, ICU_PATH,
5863af6ab5fSopenharmony_ci                            f'--compiler-target-triple=arm-unknown-linux-gnu',
5873af6ab5fSopenharmony_ci                            f'--aot-file={file_name_pre}',
5883af6ab5fSopenharmony_ci                            self.abc_file]
5893af6ab5fSopenharmony_ci            elif self.arch == ARK_ARCH_LIST[0]:
5903af6ab5fSopenharmony_ci                cmd_args = [self.ark_aot_tool, ICU_PATH,
5913af6ab5fSopenharmony_ci                            f'--aot-file={file_name_pre}',
5923af6ab5fSopenharmony_ci                            self.abc_file]
5933af6ab5fSopenharmony_ci        if self.enable_litecg:
5943af6ab5fSopenharmony_ci            cmd_args.insert(-1, "--compiler-enable-litecg=true")
5953af6ab5fSopenharmony_ci        retcode = exec_command(cmd_args, 180000)
5963af6ab5fSopenharmony_ci        if retcode:
5973af6ab5fSopenharmony_ci            print_command(self.abc_cmd)
5983af6ab5fSopenharmony_ci            print_command(cmd_args)
5993af6ab5fSopenharmony_ci
6003af6ab5fSopenharmony_ci    def execute_aot(self):
6013af6ab5fSopenharmony_ci        unforce_gc = False
6023af6ab5fSopenharmony_ci        os.environ["LD_LIBRARY_PATH"] = self.libs_dir
6033af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(self.js_file)[0]
6043af6ab5fSopenharmony_ci        cmd_args = []
6053af6ab5fSopenharmony_ci        if self.arch == ARK_ARCH_LIST[1]:
6063af6ab5fSopenharmony_ci            qemu_tool = "qemu-aarch64"
6073af6ab5fSopenharmony_ci            qemu_arg1 = "-L"
6083af6ab5fSopenharmony_ci            qemu_arg2 = self.arch_root
6093af6ab5fSopenharmony_ci            cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool,
6103af6ab5fSopenharmony_ci                        ICU_PATH,
6113af6ab5fSopenharmony_ci                        f'--aot-file={file_name_pre}',
6123af6ab5fSopenharmony_ci                        f'{file_name_pre}.abc']
6133af6ab5fSopenharmony_ci        elif self.arch == ARK_ARCH_LIST[2]:
6143af6ab5fSopenharmony_ci            qemu_tool = "qemu-arm"
6153af6ab5fSopenharmony_ci            qemu_arg1 = "-L"
6163af6ab5fSopenharmony_ci            qemu_arg2 = self.arch_root
6173af6ab5fSopenharmony_ci            cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool,
6183af6ab5fSopenharmony_ci                        ICU_PATH,
6193af6ab5fSopenharmony_ci                        f'--aot-file={file_name_pre}',
6203af6ab5fSopenharmony_ci                        f'{file_name_pre}.abc']
6213af6ab5fSopenharmony_ci        elif self.arch == ARK_ARCH_LIST[0]:
6223af6ab5fSopenharmony_ci            if file_name_pre in FORCE_GC_SKIP_TESTS:
6233af6ab5fSopenharmony_ci                unforce_gc = True
6243af6ab5fSopenharmony_ci            asm_arg1 = "--enable-force-gc=true"
6253af6ab5fSopenharmony_ci            if unforce_gc or self.disable_force_gc:
6263af6ab5fSopenharmony_ci                asm_arg1 = "--enable-force-gc=false"
6273af6ab5fSopenharmony_ci            cmd_args = [self.ark_tool, ICU_PATH, asm_arg1,
6283af6ab5fSopenharmony_ci                        f'--aot-file={file_name_pre}',
6293af6ab5fSopenharmony_ci                        f'{file_name_pre}.abc']
6303af6ab5fSopenharmony_ci
6313af6ab5fSopenharmony_ci        record_name = os.path.splitext(os.path.split(self.js_file)[1])[0]
6323af6ab5fSopenharmony_ci        cmd_args.insert(-1, f'--entry-point={record_name}')
6333af6ab5fSopenharmony_ci        if self.stub_file != "":
6343af6ab5fSopenharmony_ci            cmd_args.insert(-1, f'--stub-file={self.stub_file}')
6353af6ab5fSopenharmony_ci        retcode = exec_command(cmd_args)
6363af6ab5fSopenharmony_ci        if retcode:
6373af6ab5fSopenharmony_ci            print_command(cmd_args)
6383af6ab5fSopenharmony_ci        return retcode
6393af6ab5fSopenharmony_ci
6403af6ab5fSopenharmony_ci    def execute_abc2program_outputs(self, cmd_args):
6413af6ab5fSopenharmony_ci        retcode = 0
6423af6ab5fSopenharmony_ci        for abc in self.abc_outputs:
6433af6ab5fSopenharmony_ci            abc = get_formated_path(abc)
6443af6ab5fSopenharmony_ci            cmd_args[-1] = abc
6453af6ab5fSopenharmony_ci            retcode = exec_command(cmd_args)
6463af6ab5fSopenharmony_ci            if retcode:
6473af6ab5fSopenharmony_ci                print_command(cmd_args)
6483af6ab5fSopenharmony_ci                return retcode
6493af6ab5fSopenharmony_ci        return retcode
6503af6ab5fSopenharmony_ci
6513af6ab5fSopenharmony_ci    def execute(self):
6523af6ab5fSopenharmony_ci        unforce_gc = False
6533af6ab5fSopenharmony_ci        if platform.system() == "Windows":
6543af6ab5fSopenharmony_ci            # add env path for cmd/powershell execute
6553af6ab5fSopenharmony_ci            libs_dir = self.libs_dir.replace(":", ";")
6563af6ab5fSopenharmony_ci            libs_dir = libs_dir.replace("/", "\\")
6573af6ab5fSopenharmony_ci            os.environ["PATH"] = libs_dir + ";" + os.environ["PATH"]
6583af6ab5fSopenharmony_ci        elif platform.system() == "Linux":
6593af6ab5fSopenharmony_ci            os.environ["LD_LIBRARY_PATH"] = self.libs_dir
6603af6ab5fSopenharmony_ci        else:
6613af6ab5fSopenharmony_ci            sys.exit(f" test262 on {platform.system()} not supported")
6623af6ab5fSopenharmony_ci
6633af6ab5fSopenharmony_ci        file_name_pre = get_formated_path(os.path.splitext(self.js_file)[0])
6643af6ab5fSopenharmony_ci        cmd_args = []
6653af6ab5fSopenharmony_ci        if self.arch == ARK_ARCH_LIST[1]:
6663af6ab5fSopenharmony_ci            qemu_tool = "qemu-aarch64"
6673af6ab5fSopenharmony_ci            qemu_arg1 = "-L"
6683af6ab5fSopenharmony_ci            qemu_arg2 = self.arch_root
6693af6ab5fSopenharmony_ci            cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool,
6703af6ab5fSopenharmony_ci                        ICU_PATH,
6713af6ab5fSopenharmony_ci                        f'{file_name_pre}.abc']
6723af6ab5fSopenharmony_ci            if self.run_jit or self.run_baseline_jit:
6733af6ab5fSopenharmony_ci                cmd_args.insert(-1, f'--compiler-target-triple=aarch64-unknown-linux-gnu')
6743af6ab5fSopenharmony_ci                cmd_args.insert(-1, f'--open-ark-tools=true')
6753af6ab5fSopenharmony_ci            if self.run_baseline_jit:
6763af6ab5fSopenharmony_ci                cmd_args.insert(-1, f'--test-assert=true')
6773af6ab5fSopenharmony_ci        elif self.arch == ARK_ARCH_LIST[2]:
6783af6ab5fSopenharmony_ci            qemu_tool = "qemu-arm"
6793af6ab5fSopenharmony_ci            qemu_arg1 = "-L"
6803af6ab5fSopenharmony_ci            qemu_arg2 = self.arch_root
6813af6ab5fSopenharmony_ci            cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool,
6823af6ab5fSopenharmony_ci                        ICU_PATH,
6833af6ab5fSopenharmony_ci                        f'{file_name_pre}.abc']
6843af6ab5fSopenharmony_ci        elif self.arch == ARK_ARCH_LIST[0]:
6853af6ab5fSopenharmony_ci            if file_name_pre in FORCE_GC_SKIP_TESTS:
6863af6ab5fSopenharmony_ci                unforce_gc = True
6873af6ab5fSopenharmony_ci            asm_arg1 = "--enable-force-gc=true"
6883af6ab5fSopenharmony_ci            if unforce_gc or self.disable_force_gc:
6893af6ab5fSopenharmony_ci                asm_arg1 = "--enable-force-gc=false"
6903af6ab5fSopenharmony_ci            cmd_args = [self.ark_tool, ICU_PATH, asm_arg1,
6913af6ab5fSopenharmony_ci                        f'{file_name_pre}.abc']
6923af6ab5fSopenharmony_ci
6933af6ab5fSopenharmony_ci        record_name = os.path.splitext(os.path.split(self.js_file)[1])[0]
6943af6ab5fSopenharmony_ci        cmd_args.insert(-1, f'--entry-point={record_name}')
6953af6ab5fSopenharmony_ci        if self.run_jit:
6963af6ab5fSopenharmony_ci            cmd_args.insert(-1, f'--compiler-enable-litecg=true')
6973af6ab5fSopenharmony_ci            cmd_args.insert(-1, f'--compiler-enable-jit=true --log-debug=jit')
6983af6ab5fSopenharmony_ci        if self.run_baseline_jit:
6993af6ab5fSopenharmony_ci            cmd_args.insert(-1, f'--compiler-enable-baselinejit=true')
7003af6ab5fSopenharmony_ci            cmd_args.insert(-1, f'--compiler-force-baselinejit-compile-main=true')
7013af6ab5fSopenharmony_ci        if self.stub_file != "":
7023af6ab5fSopenharmony_ci            cmd_args.insert(-1, f"--stub-file={self.stub_file}")
7033af6ab5fSopenharmony_ci        retcode = 0
7043af6ab5fSopenharmony_ci        if self.abc2program:
7053af6ab5fSopenharmony_ci            retcode = self.execute_abc2program_outputs(cmd_args)
7063af6ab5fSopenharmony_ci        else:
7073af6ab5fSopenharmony_ci            retcode = exec_command(cmd_args)
7083af6ab5fSopenharmony_ci            if retcode:
7093af6ab5fSopenharmony_ci                print_command(cmd_args)
7103af6ab5fSopenharmony_ci        return retcode
7113af6ab5fSopenharmony_ci
7123af6ab5fSopenharmony_ci    def run_generator_ap(self):
7133af6ab5fSopenharmony_ci        os.environ["LD_LIBRARY_PATH"] = self.libs_dir
7143af6ab5fSopenharmony_ci        file_name_pre = os.path.splitext(self.js_file)[0]
7153af6ab5fSopenharmony_ci        record_name = os.path.splitext(os.path.split(self.js_file)[1])[0]
7163af6ab5fSopenharmony_ci        if self.arch == ARK_ARCH_LIST[1]:
7173af6ab5fSopenharmony_ci            qemu_tool = "qemu-aarch64"
7183af6ab5fSopenharmony_ci            qemu_arg1 = "-L"
7193af6ab5fSopenharmony_ci            qemu_arg2 = self.arch_root
7203af6ab5fSopenharmony_ci            cmd_args = [qemu_tool, qemu_arg1, qemu_arg2, self.ark_tool,
7213af6ab5fSopenharmony_ci                        ICU_PATH,
7223af6ab5fSopenharmony_ci                        "--log-level=error",
7233af6ab5fSopenharmony_ci                        "--enable-pgo-profiler=true",
7243af6ab5fSopenharmony_ci                        "--compiler-opt-inlining=true",
7253af6ab5fSopenharmony_ci                        f'--compiler-pgo-profiler-path={file_name_pre}.ap',
7263af6ab5fSopenharmony_ci                        "--asm-interpreter=true",
7273af6ab5fSopenharmony_ci                        f'--entry-point={record_name}']
7283af6ab5fSopenharmony_ci        else:
7293af6ab5fSopenharmony_ci            cmd_args = [self.ark_tool, ICU_PATH,
7303af6ab5fSopenharmony_ci                        "--log-level=error",
7313af6ab5fSopenharmony_ci                        "--enable-pgo-profiler=true",
7323af6ab5fSopenharmony_ci                        "--compiler-opt-inlining=true",
7333af6ab5fSopenharmony_ci                        f'--compiler-pgo-profiler-path={file_name_pre}.ap',
7343af6ab5fSopenharmony_ci                        "--asm-interpreter=true",
7353af6ab5fSopenharmony_ci                        f'--entry-point={record_name}']
7363af6ab5fSopenharmony_ci        if self.stub_file != "":
7373af6ab5fSopenharmony_ci            cmd_args.append(f"--stub-file={self.stub_file}")
7383af6ab5fSopenharmony_ci        if self.disable_force_gc:
7393af6ab5fSopenharmony_ci            cmd_args.append(f"--enable-force-gc=false")
7403af6ab5fSopenharmony_ci        cmd_args.append(f'{file_name_pre}.abc')
7413af6ab5fSopenharmony_ci        return_code = exec_command(cmd_args)
7423af6ab5fSopenharmony_ci        if return_code:
7433af6ab5fSopenharmony_ci            print_command(cmd_args)
7443af6ab5fSopenharmony_ci        return return_code
7453af6ab5fSopenharmony_ci
7463af6ab5fSopenharmony_ci    def is_legal_frontend(self):
7473af6ab5fSopenharmony_ci        if self.ark_frontend not in ARK_FRONTEND_LIST:
7483af6ab5fSopenharmony_ci            sys.stderr.write("Wrong ark front-end option")
7493af6ab5fSopenharmony_ci            return False
7503af6ab5fSopenharmony_ci        return True
7513af6ab5fSopenharmony_ci
7523af6ab5fSopenharmony_ci    def execute_ark(self):
7533af6ab5fSopenharmony_ci        self.proce_parameters()
7543af6ab5fSopenharmony_ci        self.get_all_skip_force_gc_tests()
7553af6ab5fSopenharmony_ci        if not self.is_legal_frontend():
7563af6ab5fSopenharmony_ci            return
7573af6ab5fSopenharmony_ci        if self.enable_arkguard:
7583af6ab5fSopenharmony_ci            self.execute_arkguard()
7593af6ab5fSopenharmony_ci        if self.gen_abc():
7603af6ab5fSopenharmony_ci            return
7613af6ab5fSopenharmony_ci        if self.run_pgo:
7623af6ab5fSopenharmony_ci            self.run_generator_ap()
7633af6ab5fSopenharmony_ci        if self.ark_aot:
7643af6ab5fSopenharmony_ci            self.compile_aot()
7653af6ab5fSopenharmony_ci            self.execute_aot()
7663af6ab5fSopenharmony_ci        else:
7673af6ab5fSopenharmony_ci            self.execute()
7683af6ab5fSopenharmony_ci
7693af6ab5fSopenharmony_ci
7703af6ab5fSopenharmony_cidef main():
7713af6ab5fSopenharmony_ci    args = parse_args()
7723af6ab5fSopenharmony_ci
7733af6ab5fSopenharmony_ci    ark = ArkProgram(args)
7743af6ab5fSopenharmony_ci    ark.execute_ark()
7753af6ab5fSopenharmony_ci
7763af6ab5fSopenharmony_ci
7773af6ab5fSopenharmony_ciif __name__ == "__main__":
7783af6ab5fSopenharmony_ci    sys.exit(main())
779