From 6e5e845e137c77a4d6350b8db3977483eca344dd Mon Sep 17 00:00:00 2001 From: hufeng Date: Thu, 20 Apr 2023 21:16:31 +0800 Subject: [PATCH 1/2] Fix commonjs's main_func parameters count Signed-off-by: hufeng Change-Id: I541cfcf5974c48c83dc1726248d43fe7819f351e --- es2panda/compiler/core/compileQueue.cpp | 3 +-- es2panda/compiler/core/pandagen.cpp | 6 ++++-- es2panda/parser/program/program.h | 5 +++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/es2panda/compiler/core/compileQueue.cpp b/es2panda/compiler/core/compileQueue.cpp index 48083b4c09..42743c71ff 100644 --- a/es2panda/compiler/core/compileQueue.cpp +++ b/es2panda/compiler/core/compileQueue.cpp @@ -101,8 +101,7 @@ void CompileFileJob::Run() return; } - if (src_->scriptKind != parser::ScriptKind::COMMONJS && options_->optLevel != 0) { - // common-js files has hidden parameters which cause optimizer abort, skip optimizing them. + if (options_->optLevel != 0) { util::Helpers::OptimizeProgram(prog, src_->fileName); } diff --git a/es2panda/compiler/core/pandagen.cpp b/es2panda/compiler/core/pandagen.cpp index a0f674fa4f..62b2a863d1 100644 --- a/es2panda/compiler/core/pandagen.cpp +++ b/es2panda/compiler/core/pandagen.cpp @@ -138,8 +138,10 @@ uint32_t PandaGen::FormalParametersCount() const uint32_t PandaGen::InternalParamCount() const { - static const uint32_t HIDDEN_PARAMS = 3; - return ParamCount() + HIDDEN_PARAMS; + if (rootNode_->IsProgram() && context_->Binder()->Program()->IsCommonjs()) { + return binder::Binder::CJS_MANDATORY_PARAMS_NUMBER; + } + return ParamCount() + binder::Binder::MANDATORY_PARAMS_NUMBER; } const util::StringView &PandaGen::InternalName() const diff --git a/es2panda/parser/program/program.h b/es2panda/parser/program/program.h index 0bc4ec8590..f4cac784c0 100644 --- a/es2panda/parser/program/program.h +++ b/es2panda/parser/program/program.h @@ -70,6 +70,11 @@ public: return kind_; } + bool IsCommonjs() const + { + return kind_ == ScriptKind::COMMONJS; + } + SourceTextModuleRecord *ModuleRecord() const { return moduleRecord_; -- Gitee From a59cca78b69563d0fa5639349f599400099e65da Mon Sep 17 00:00:00 2001 From: hufeng Date: Tue, 25 Apr 2023 14:40:58 +0800 Subject: [PATCH 2/2] Add bytecode tests Signed-off-by: hufeng Change-Id: I33fcb403fb241b1b72a62db75e53933735b55a88 --- .../test-commonjs-main-func-args-expected.txt | 45 +++++++++++++++++++ .../commonjs/test-commonjs-main-func-args.js | 2 + es2panda/test/runner.py | 29 +++++++++++- 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 es2panda/test/bytecode/commonjs/test-commonjs-main-func-args-expected.txt create mode 100644 es2panda/test/bytecode/commonjs/test-commonjs-main-func-args.js diff --git a/es2panda/test/bytecode/commonjs/test-commonjs-main-func-args-expected.txt b/es2panda/test/bytecode/commonjs/test-commonjs-main-func-args-expected.txt new file mode 100644 index 0000000000..cdc7924ad2 --- /dev/null +++ b/es2panda/test/bytecode/commonjs/test-commonjs-main-func-args-expected.txt @@ -0,0 +1,45 @@ +.language ECMAScript + +.function any .#1#(any a0, any a1, any a2, any a3, any a4, any a5, any a6, any a7) { +label_1: +label_0: + lda.str commonjsTest + sta v0 + createobjectwithbuffer 0x0, _0 + sta v1 + lda v0 + stownbyname 0x1, a, v1 + ldundefined + returnundefined +label_2: +} + +.function any .func_main_0(any a0, any a1, any a2, any a3, any a4, any a5, any a6, any a7) { +label_1: +label_0: + tryldglobalbyname 0x0, Reflect + sta v0 + ldobjbyname 0x1, apply + sta v1 + definefunc 0x3, .#1#, 0x5 + sta v2 + createemptyarray 0x4 + sta v3 + lda a3 + stownbyindex 0x5, v3, 0x0 + lda a4 + stownbyindex 0x7, v3, 0x1 + lda a5 + stownbyindex 0x9, v3, 0x2 + lda a6 + stownbyindex 0xb, v3, 0x3 + lda a7 + stownbyindex 0xd, v3, 0x4 + lda v1 + callthis3 0xf, v0, v2, a3, v3 + ldundefined + returnundefined +label_2: +} + + diff --git a/es2panda/test/bytecode/commonjs/test-commonjs-main-func-args.js b/es2panda/test/bytecode/commonjs/test-commonjs-main-func-args.js new file mode 100644 index 0000000000..003820f71d --- /dev/null +++ b/es2panda/test/bytecode/commonjs/test-commonjs-main-func-args.js @@ -0,0 +1,2 @@ +let a = "commonjsTest"; +exports = {a}; \ No newline at end of file diff --git a/es2panda/test/runner.py b/es2panda/test/runner.py index 342d97ddf5..6382410150 100755 --- a/es2panda/test/runner.py +++ b/es2panda/test/runner.py @@ -159,6 +159,8 @@ def get_args(): help='run hotreload tests') parser.add_argument('--base64', dest='base64', action='store_true', default=False, help='run base64 tests') + parser.add_argument('--bytecode', dest='bytecode', action='store_true', default=False, + help='run bytecode tests') return parser.parse_args() @@ -182,8 +184,11 @@ class Test: return "%s-expected.txt" % (self.path[:self.path.find(".d.ts")]) def run(self, runner): + test_abc_name = ("%s.abc" % (path.splitext(self.path)[0])).replace("/", "_") + test_abc_path = path.join(runner.build_dir, test_abc_name) cmd = runner.cmd_prefix + [runner.es2panda] cmd.extend(self.flags) + cmd.extend(["--output=" + test_abc_path]) cmd.append(self.path) self.log_cmd(cmd) @@ -204,6 +209,9 @@ class Test: if not self.passed: self.error = err.decode("utf-8", errors="ignore") + if os.path.exists(test_abc_path): + os.remove(test_abc_path) + return self @@ -535,7 +543,7 @@ class Runner: class RegressionRunner(Runner): def __init__(self, args): - Runner.__init__(self, args, "Regresssion") + Runner.__init__(self, args, "Regression") def add_directory(self, directory, extension, flags, func=Test): glob_expression = path.join( @@ -1389,6 +1397,19 @@ class TypeExtractorWithAOTTest(Test): return self +class BytecodeRunner(Runner): + def __init__(self, args): + Runner.__init__(self, args, "Bytecode") + + def add_directory(self, directory, extension, flags, func=Test): + glob_expression = path.join( + self.test_root, directory, "**/*.%s" % (extension)) + files = glob(glob_expression, recursive=True) + files = fnmatch.filter(files, self.test_root + '**' + self.args.filter) + self.tests += list(map(lambda f: func(f, flags), files)) + + def test_path(self, src): + return src def main(): args = get_args() @@ -1445,6 +1466,12 @@ def main(): if args.type_extractor: runners.append(TypeExtractorRunner(args)) + if args.bytecode: + runner = BytecodeRunner(args) + runner.add_directory("bytecode/commonjs", "js", ["--commonjs", "--dump-assembly"]) + + runners.append(runner) + failed_tests = 0 for runner in runners: -- Gitee