14514f5e3Sopenharmony_ci#!/usr/bin/env python3
24514f5e3Sopenharmony_ci#coding: utf-8
34514f5e3Sopenharmony_ci"""
44514f5e3Sopenharmony_ciCopyright (c) 2024 Huawei Device Co., Ltd.
54514f5e3Sopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License");
64514f5e3Sopenharmony_ciyou may not use this file except in compliance with the License.
74514f5e3Sopenharmony_ciYou may obtain a copy of the License at
84514f5e3Sopenharmony_ci
94514f5e3Sopenharmony_ci    http://www.apache.org/licenses/LICENSE-2.0
104514f5e3Sopenharmony_ci
114514f5e3Sopenharmony_ciUnless required by applicable law or agreed to in writing, software
124514f5e3Sopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS,
134514f5e3Sopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144514f5e3Sopenharmony_ciSee the License for the specific language governing permissions and
154514f5e3Sopenharmony_cilimitations under the License.
164514f5e3Sopenharmony_ci
174514f5e3Sopenharmony_ciDescription: run script
184514f5e3Sopenharmony_ci    input: input file
194514f5e3Sopenharmony_ci    output: output file
204514f5e3Sopenharmony_ci    prefix: prefix
214514f5e3Sopenharmony_ci"""
224514f5e3Sopenharmony_ci
234514f5e3Sopenharmony_ciimport os
244514f5e3Sopenharmony_ciimport sys
254514f5e3Sopenharmony_ciimport argparse
264514f5e3Sopenharmony_ci
274514f5e3Sopenharmony_cireplace_config1 = [
284514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO1", "start": 0, "end": 31608},
294514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO2", "start": 31609, "end": 65535},
304514f5e3Sopenharmony_ci]
314514f5e3Sopenharmony_cireplace_config2 = [
324514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO1", "start": 0, "end": 65488},
334514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO2", "start": 65489, "end": 65535},
344514f5e3Sopenharmony_ci]
354514f5e3Sopenharmony_cireplace_config3 = [
364514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO1", "start": 0, "end": 65488},
374514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO2", "start": 65489, "end": 65536},
384514f5e3Sopenharmony_ci]
394514f5e3Sopenharmony_cireplace_config4 = [
404514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO1", "start": 35004, "end": 40153},
414514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO2", "start": 1, "end": 34999, "isFunc": True, "msg": "base"},
424514f5e3Sopenharmony_ci]
434514f5e3Sopenharmony_cireplace_config5 = [
444514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO1", "start": 35004, "end": 40153},
454514f5e3Sopenharmony_ci    {"id": "REPLACE_FUNC_FOO2", "start": 1, "end": 34999, "isFunc": True, "msg": "patch"},
464514f5e3Sopenharmony_ci]
474514f5e3Sopenharmony_ci
484514f5e3Sopenharmony_ciAOT_MULTI_CONSTANTPOOL_TEST_PATH = "ets_runtime/test/aottest/aot_multi_constantpool_test/"
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_cifile_list = [
514514f5e3Sopenharmony_ci    {
524514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_funcconstpool/base_modify.js",
534514f5e3Sopenharmony_ci        "replace_config": replace_config1,
544514f5e3Sopenharmony_ci    },
554514f5e3Sopenharmony_ci    {
564514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_funcconstpool/base.js",
574514f5e3Sopenharmony_ci        "replace_config": replace_config1,
584514f5e3Sopenharmony_ci    },
594514f5e3Sopenharmony_ci    {
604514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_funccallconstpool/base_modify.js",
614514f5e3Sopenharmony_ci        "replace_config": replace_config1,
624514f5e3Sopenharmony_ci    },
634514f5e3Sopenharmony_ci    {
644514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_funccallconstpool/base.js",
654514f5e3Sopenharmony_ci        "replace_config": replace_config1,
664514f5e3Sopenharmony_ci    },
674514f5e3Sopenharmony_ci    {
684514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_constructorconstpool/base_modify.js",
694514f5e3Sopenharmony_ci        "replace_config": replace_config1,
704514f5e3Sopenharmony_ci    },
714514f5e3Sopenharmony_ci    {
724514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_constructorconstpool/base.js",
734514f5e3Sopenharmony_ci        "replace_config": replace_config1,
744514f5e3Sopenharmony_ci    },
754514f5e3Sopenharmony_ci    {
764514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_closureconstpool/base_modify.js",
774514f5e3Sopenharmony_ci        "replace_config": replace_config3,
784514f5e3Sopenharmony_ci    },
794514f5e3Sopenharmony_ci    {
804514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_closureconstpool/base.js",
814514f5e3Sopenharmony_ci        "replace_config": replace_config3,
824514f5e3Sopenharmony_ci    },
834514f5e3Sopenharmony_ci    {
844514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_classconstpool/base_modify.js",
854514f5e3Sopenharmony_ci        "replace_config": replace_config2,
864514f5e3Sopenharmony_ci    },
874514f5e3Sopenharmony_ci    {
884514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multi_classconstpool/base.js",
894514f5e3Sopenharmony_ci        "replace_config": replace_config2,
904514f5e3Sopenharmony_ci    },
914514f5e3Sopenharmony_ci    {
924514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multiconstpool_multifunc/base.js",
934514f5e3Sopenharmony_ci        "replace_config": replace_config4,
944514f5e3Sopenharmony_ci    },
954514f5e3Sopenharmony_ci    {
964514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/quickfix/multiconstpool_multifunc/base_modify.js",
974514f5e3Sopenharmony_ci        "replace_config": replace_config5,
984514f5e3Sopenharmony_ci    },
994514f5e3Sopenharmony_ci    {
1004514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/moduletest/multiconstpoolobj/multiconstpoolobj.js",
1014514f5e3Sopenharmony_ci        "replace_config": replace_config2,
1024514f5e3Sopenharmony_ci    },
1034514f5e3Sopenharmony_ci    {
1044514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/moduletest/multiconstpoolfunc/multiconstpoolfunc.js",
1054514f5e3Sopenharmony_ci        "replace_config": replace_config2,
1064514f5e3Sopenharmony_ci    },
1074514f5e3Sopenharmony_ci    {
1084514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/moduletest/multiconstpoolconstructor/multiconstpoolconstructor.js",
1094514f5e3Sopenharmony_ci        "replace_config": replace_config2,
1104514f5e3Sopenharmony_ci    },
1114514f5e3Sopenharmony_ci    {
1124514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/moduletest/multiconstpoolclass/multiconstpoolclass.js",
1134514f5e3Sopenharmony_ci        "replace_config": replace_config2,
1144514f5e3Sopenharmony_ci    },
1154514f5e3Sopenharmony_ci    {
1164514f5e3Sopenharmony_ci        "file_name": "ets_runtime/test/moduletest/multiconstpoolarray/multiconstpoolarray.js",
1174514f5e3Sopenharmony_ci        "replace_config": replace_config2,
1184514f5e3Sopenharmony_ci    },
1194514f5e3Sopenharmony_ci    {
1204514f5e3Sopenharmony_ci        "file_name": AOT_MULTI_CONSTANTPOOL_TEST_PATH
1214514f5e3Sopenharmony_ci            + "multi_constantpool_func/multi_constantpool_func.ts",
1224514f5e3Sopenharmony_ci        "replace_config": replace_config1,
1234514f5e3Sopenharmony_ci    },
1244514f5e3Sopenharmony_ci    {
1254514f5e3Sopenharmony_ci        "file_name": AOT_MULTI_CONSTANTPOOL_TEST_PATH
1264514f5e3Sopenharmony_ci            + "multi_constantpool_constructor/multi_constantpool_constructor.ts",
1274514f5e3Sopenharmony_ci        "replace_config": replace_config2,
1284514f5e3Sopenharmony_ci    },
1294514f5e3Sopenharmony_ci    {
1304514f5e3Sopenharmony_ci        "file_name": AOT_MULTI_CONSTANTPOOL_TEST_PATH
1314514f5e3Sopenharmony_ci            + "multi_constantpool_class/multi_constantpool_class.ts",
1324514f5e3Sopenharmony_ci        "replace_config": replace_config2,
1334514f5e3Sopenharmony_ci    },
1344514f5e3Sopenharmony_ci    {
1354514f5e3Sopenharmony_ci        "file_name": AOT_MULTI_CONSTANTPOOL_TEST_PATH
1364514f5e3Sopenharmony_ci            + "multi_constantpool_funccall/multi_constantpool_funccall.ts",
1374514f5e3Sopenharmony_ci        "replace_config": replace_config1,
1384514f5e3Sopenharmony_ci    },
1394514f5e3Sopenharmony_ci    {
1404514f5e3Sopenharmony_ci        "file_name": AOT_MULTI_CONSTANTPOOL_TEST_PATH
1414514f5e3Sopenharmony_ci            + "multi_constantpool_closure/multi_constantpool_closure.ts",
1424514f5e3Sopenharmony_ci        "replace_config": replace_config3,
1434514f5e3Sopenharmony_ci    },
1444514f5e3Sopenharmony_ci]
1454514f5e3Sopenharmony_ci
1464514f5e3Sopenharmony_ci
1474514f5e3Sopenharmony_cidef generate_var(var_begin, var_end):
1484514f5e3Sopenharmony_ci    str_var_list = []
1494514f5e3Sopenharmony_ci    for i in range(var_begin, var_end + 1):
1504514f5e3Sopenharmony_ci        str_var_list.append('var a{0} = "{1}";'.format(i, i))
1514514f5e3Sopenharmony_ci        if (i + 1) % 6 == 0:
1524514f5e3Sopenharmony_ci            str_var_list.append("\n")
1534514f5e3Sopenharmony_ci    return ''.join(str_var_list)
1544514f5e3Sopenharmony_ci
1554514f5e3Sopenharmony_ci
1564514f5e3Sopenharmony_cidef generate_funcs(var_begin, var_end, msg):
1574514f5e3Sopenharmony_ci    str_func_list = []
1584514f5e3Sopenharmony_ci    for i in range(var_begin, var_end + 1):
1594514f5e3Sopenharmony_ci        str_func_list.append('function foo{0}()'.format(i))
1604514f5e3Sopenharmony_ci        str_func_list.append('{\n\t')
1614514f5e3Sopenharmony_ci        str_func_list.append('var a{0} = "{1}";\n\tprint("{2} foo{3}")\n'.format(i, i, msg, i))
1624514f5e3Sopenharmony_ci        str_func_list.append('}\n')
1634514f5e3Sopenharmony_ci    return ''.join(str_func_list)
1644514f5e3Sopenharmony_ci
1654514f5e3Sopenharmony_ci
1664514f5e3Sopenharmony_cidef read_file_content(input_file):
1674514f5e3Sopenharmony_ci    input_fd = os.open(input_file, os.O_RDONLY, 0o755)
1684514f5e3Sopenharmony_ci    with os.fdopen(input_fd, 'r') as fp:
1694514f5e3Sopenharmony_ci        return fp.read()
1704514f5e3Sopenharmony_ci
1714514f5e3Sopenharmony_ci
1724514f5e3Sopenharmony_cidef write_file_content(output_file, data):
1734514f5e3Sopenharmony_ci    output_fd = os.open(output_file, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o755)
1744514f5e3Sopenharmony_ci    if os.path.exists(output_file):
1754514f5e3Sopenharmony_ci        with os.fdopen(output_fd, 'w') as fp:
1764514f5e3Sopenharmony_ci            fp.write(data)
1774514f5e3Sopenharmony_ci
1784514f5e3Sopenharmony_ci
1794514f5e3Sopenharmony_cidef replace_in_data(data, replace_config):
1804514f5e3Sopenharmony_ci    for cfg in replace_config:
1814514f5e3Sopenharmony_ci        if cfg["id"] in data:
1824514f5e3Sopenharmony_ci            if "isFunc" in cfg:
1834514f5e3Sopenharmony_ci                str_func = generate_funcs(cfg["start"], cfg["end"], cfg["msg"])
1844514f5e3Sopenharmony_ci                data = data.replace(cfg["id"], str_func)
1854514f5e3Sopenharmony_ci            else:
1864514f5e3Sopenharmony_ci                str_var = generate_var(cfg["start"], cfg["end"])
1874514f5e3Sopenharmony_ci                data = data.replace(cfg["id"], str_var)
1884514f5e3Sopenharmony_ci    return data
1894514f5e3Sopenharmony_ci
1904514f5e3Sopenharmony_ci
1914514f5e3Sopenharmony_cidef replace_js(input_file, output_file):
1924514f5e3Sopenharmony_ci    for file in file_list:
1934514f5e3Sopenharmony_ci        file_name = file.get("file_name")
1944514f5e3Sopenharmony_ci        if not input_file.endswith(file_name):
1954514f5e3Sopenharmony_ci            continue
1964514f5e3Sopenharmony_ci        data = read_file_content(input_file)
1974514f5e3Sopenharmony_ci        replace_config = file.get("replace_config")
1984514f5e3Sopenharmony_ci        data = replace_in_data(data, replace_config)
1994514f5e3Sopenharmony_ci        write_file_content(output_file, data)
2004514f5e3Sopenharmony_ci        return output_file
2014514f5e3Sopenharmony_ci    return None
2024514f5e3Sopenharmony_ci
2034514f5e3Sopenharmony_ci
2044514f5e3Sopenharmony_cidef is_file_in_list(file_path):
2054514f5e3Sopenharmony_ci    input_dir_path = (
2064514f5e3Sopenharmony_ci        os.path.dirname(file_path)
2074514f5e3Sopenharmony_ci        if os.path.isfile(file_path)
2084514f5e3Sopenharmony_ci        else file_path
2094514f5e3Sopenharmony_ci    )
2104514f5e3Sopenharmony_ci
2114514f5e3Sopenharmony_ci    for item in file_list:
2124514f5e3Sopenharmony_ci        file_name = item.get("file_name")
2134514f5e3Sopenharmony_ci        list_dir_path = os.path.dirname(file_name)
2144514f5e3Sopenharmony_ci        if list_dir_path in input_dir_path:
2154514f5e3Sopenharmony_ci            return True
2164514f5e3Sopenharmony_ci    return False
2174514f5e3Sopenharmony_ci
2184514f5e3Sopenharmony_ci
2194514f5e3Sopenharmony_cidef process_with_prefix(input_file, output_file, prefix):
2204514f5e3Sopenharmony_ci    input_fd = os.open(input_file, os.O_RDONLY, 0o755)
2214514f5e3Sopenharmony_ci    output_fd = os.open(output_file, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o755)
2224514f5e3Sopenharmony_ci    with os.fdopen(input_fd, 'r') as inputfp, os.fdopen(output_fd, 'w') as outputfp:
2234514f5e3Sopenharmony_ci        for line in inputfp:
2244514f5e3Sopenharmony_ci            outputfp.write(prefix + line)
2254514f5e3Sopenharmony_ci
2264514f5e3Sopenharmony_ci
2274514f5e3Sopenharmony_cidef handle_files(input_file, output_file, prefix):
2284514f5e3Sopenharmony_ci    input_fd = os.open(input_file, os.O_RDONLY, 0o755)
2294514f5e3Sopenharmony_ci    output_fd = os.open(output_file, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o755)
2304514f5e3Sopenharmony_ci    output_file_dir = os.path.dirname(output_file)
2314514f5e3Sopenharmony_ci
2324514f5e3Sopenharmony_ci    with os.fdopen(input_fd, "r") as fp, os.fdopen(output_fd, "w") as outputfp:
2334514f5e3Sopenharmony_ci        lines = fp.readlines()
2344514f5e3Sopenharmony_ci        for line in lines:
2354514f5e3Sopenharmony_ci            ll = line.split(";")
2364514f5e3Sopenharmony_ci            original_js_filename = os.path.basename(ll[0])
2374514f5e3Sopenharmony_ci            js_fn = replace_js(prefix + ll[0], os.path.join(output_file_dir, original_js_filename))
2384514f5e3Sopenharmony_ci            if js_fn and os.path.exists(js_fn):
2394514f5e3Sopenharmony_ci                ll[0] = js_fn
2404514f5e3Sopenharmony_ci            else:
2414514f5e3Sopenharmony_ci                ll[0] = prefix + ll[0]
2424514f5e3Sopenharmony_ci            outputfp.write(";".join(ll))
2434514f5e3Sopenharmony_ci
2444514f5e3Sopenharmony_ci
2454514f5e3Sopenharmony_cidef replace_merge_file(input_file, output_file, prefix):
2464514f5e3Sopenharmony_ci    if input_file.endswith(("base.txt", "patch.txt")) and is_file_in_list(prefix):
2474514f5e3Sopenharmony_ci        handle_files(input_file, output_file, prefix)
2484514f5e3Sopenharmony_ci    else:
2494514f5e3Sopenharmony_ci        process_with_prefix(input_file, output_file, prefix)
2504514f5e3Sopenharmony_ci
2514514f5e3Sopenharmony_ci
2524514f5e3Sopenharmony_cidef replace_var(input_file, output_file, prefix):
2534514f5e3Sopenharmony_ci    if prefix:
2544514f5e3Sopenharmony_ci        replace_merge_file(input_file, output_file, prefix)
2554514f5e3Sopenharmony_ci    else:
2564514f5e3Sopenharmony_ci        replace_js(input_file, output_file)
2574514f5e3Sopenharmony_ci
2584514f5e3Sopenharmony_ci
2594514f5e3Sopenharmony_cidef main():
2604514f5e3Sopenharmony_ci    parser = argparse.ArgumentParser()
2614514f5e3Sopenharmony_ci    parser.add_argument("--input", type=str, required=True)
2624514f5e3Sopenharmony_ci    parser.add_argument("--output", type=str, required=True)
2634514f5e3Sopenharmony_ci    parser.add_argument("--prefix", type=str)
2644514f5e3Sopenharmony_ci
2654514f5e3Sopenharmony_ci    args = parser.parse_args()
2664514f5e3Sopenharmony_ci    replace_var(os.path.abspath(args.input), args.output, args.prefix)
2674514f5e3Sopenharmony_ci
2684514f5e3Sopenharmony_ci
2694514f5e3Sopenharmony_ciif __name__ == "__main__":
2704514f5e3Sopenharmony_ci    sys.exit(main())
271