diff --git a/es2panda/compiler/core/compileQueue.cpp b/es2panda/compiler/core/compileQueue.cpp index 48083b4c093b3906f88797c50915516d388ffda2..42743c71ffc544fab463fdbc4cd191cfc9fb1509 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 a0f674fa4fbe0bb573dc25291d2398363d95844e..62b2a863d171175a8ae09a62d534f36688a415a8 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 0bc4ec8590b759e8d69c510d9a60eba88a2abd9a..f4cac784c02de43aefdaf8eb64a612c21b4f0115 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_; 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 0000000000000000000000000000000000000000..cdc7924ad2ba977be0c5129c3f3c7245966465a8 --- /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 0000000000000000000000000000000000000000..003820f71d8631527979faf8246e87f479910385 --- /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 342d97ddf571e44c89029b1e4af35cee0b6e162b..63824101507f532d2016686efd8b9ccd2eee249f 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: