diff --git a/es2panda/binder/binder.cpp b/es2panda/binder/binder.cpp index 47b85b99676b3303e32added1978fff7bf90f1c3..1c6f0022a76f4dedfab7b15aeb9d13e7f47fc929 100644 --- a/es2panda/binder/binder.cpp +++ b/es2panda/binder/binder.cpp @@ -609,6 +609,7 @@ void Binder::AddMandatoryParam(const std::string_view &name) auto &funcParams = scope_->AsFunctionVariableScope()->ParamScope()->Params(); funcParams.insert(funcParams.begin(), param); + scope_->AsFunctionVariableScope()->ParamScope()->Bindings().insert({decl->Name(), param}); scope_->AsFunctionVariableScope()->Bindings().insert({decl->Name(), param}); } diff --git a/es2panda/compiler/core/pandagen.cpp b/es2panda/compiler/core/pandagen.cpp index 88a863f84f23b3fbf09436c1d599fd4fea1d0c86..3488d439f952da11a35264406b67230d14273577 100644 --- a/es2panda/compiler/core/pandagen.cpp +++ b/es2panda/compiler/core/pandagen.cpp @@ -1180,11 +1180,11 @@ void PandaGen::CallThis(const ir::AstNode *node, VReg startReg, size_t argCount) default: { int64_t actualArgs = argCount - 1; if (actualArgs <= util::Helpers::MAX_INT8) { - rra_.Emit(node, thisReg, argCount + 1, 0, actualArgs, thisReg); + rra_.Emit(node, thisReg, argCount, 0, actualArgs, thisReg); break; } - rra_.Emit(node, thisReg, argCount + 1, actualArgs, thisReg); + rra_.Emit(node, thisReg, argCount, actualArgs, thisReg); break; } } diff --git a/es2panda/compiler/core/regAllocator.cpp b/es2panda/compiler/core/regAllocator.cpp index 7e9ce2ca7268ae0afc3ad16cda4b9b2ad95d2ad8..88613e85bda2794fe3c0fab2a1fc1fefdbf5267b 100644 --- a/es2panda/compiler/core/regAllocator.cpp +++ b/es2panda/compiler/core/regAllocator.cpp @@ -89,6 +89,11 @@ void RegAllocatorBase::Restore(IRNode *ins) Add(ins->Node(), spillReg, origin); } +void RegAllocatorBase::ClearSpillMap() +{ + spillMap_.clear(); +} + // RegAllocator void RegAllocator::Run(IRNode *ins) @@ -122,7 +127,7 @@ void RegAllocator::Run(IRNode *ins) Restore(ins); } - spillMap_.clear(); + ClearSpillMap(); } void RegAllocator::Run(IRNode *ins, int64_t typeIndex) @@ -176,6 +181,8 @@ void RangeRegAllocator::Run(IRNode *ins, VReg rangeStart, size_t argCount) while (spillIndex_ != 0) { Restore(ins); } + + ClearSpillMap(); } } // namespace panda::es2panda::compiler diff --git a/es2panda/compiler/core/regAllocator.h b/es2panda/compiler/core/regAllocator.h index dd00e365b7b4cffee4f21338bd1492b8b283d28b..bd1bb17fa87ad60a5ffa29ccceba83cb3eced954 100644 --- a/es2panda/compiler/core/regAllocator.h +++ b/es2panda/compiler/core/regAllocator.h @@ -151,6 +151,7 @@ protected: VReg Spill(IRNode *ins, VReg reg); void Restore(IRNode *ins); + void ClearSpillMap(); VReg spillIndex_ {0}; VReg regEnd_ {0}; diff --git a/es2panda/test/compiler/js/parameter/parameter-with-default-value-1-expected.txt b/es2panda/test/compiler/js/parameter/parameter-with-default-value-1-expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..1191247b6d9a206f6ba3d8ac79e26d041dd86941 --- /dev/null +++ b/es2panda/test/compiler/js/parameter/parameter-with-default-value-1-expected.txt @@ -0,0 +1,2 @@ +1 +2 diff --git a/es2panda/test/compiler/js/parameter/parameter-with-default-value-1.js b/es2panda/test/compiler/js/parameter/parameter-with-default-value-1.js new file mode 100644 index 0000000000000000000000000000000000000000..e749bcbacdebb822b1d06dfb475dfb2e43bcf684 --- /dev/null +++ b/es2panda/test/compiler/js/parameter/parameter-with-default-value-1.js @@ -0,0 +1,13 @@ +class A { + constructor(param) { + this.c = param; + } + + a(b = this.c) { + print(b); + } +} + +let aa = new A(1); +aa.a(); +aa.a(2); diff --git a/es2panda/test/compiler/js/regAllocator/test-spill-fill-2-expected.txt b/es2panda/test/compiler/js/regAllocator/test-spill-fill-2-expected.txt new file mode 100644 index 0000000000000000000000000000000000000000..190a18037c64c43e6b11489df4bf0b9eb6d2c9bf --- /dev/null +++ b/es2panda/test/compiler/js/regAllocator/test-spill-fill-2-expected.txt @@ -0,0 +1 @@ +123 diff --git a/es2panda/test/compiler/js/regAllocator/test-spill-fill-2.js b/es2panda/test/compiler/js/regAllocator/test-spill-fill-2.js new file mode 100644 index 0000000000000000000000000000000000000000..66a845537c907468e091a5447e159e846ed82e1e --- /dev/null +++ b/es2panda/test/compiler/js/regAllocator/test-spill-fill-2.js @@ -0,0 +1,267 @@ +function xx() { + let a = undefined; + let aa = undefined; + let aaa = undefined; + let aaaa = undefined; + let aaaaa = undefined; + let aaaaaa = undefined; + let aaaaaaa = undefined; + let aaaaaaaa = undefined; + let b = undefined; + let bb = undefined; + let bbb = undefined; + let aaabab = undefined; + let aaaabab = undefined; + let aaaabaab = undefined; + let aaaaabaab = undefined; + let aaaaaabaab = undefined; + let ab = undefined; + let aba = undefined; + let abaa = undefined; + let abaaa = undefined; + let abaaaa = undefined; + let aabaaaa = undefined; + let aabaaaaa = undefined; + let aaabaaaaa = undefined; + let bbbbb = undefined; + let bbbbbb = undefined; + let bbbb = undefined; + let aaaba = undefined; + let aaaaba = undefined; + let aaaabaa = undefined; + let aaaaabaa = undefined; + let aaaaaabaa = undefined; + let c = undefined; + let ac = undefined; + let aac = undefined; + let aaac = undefined; + let aaaac = undefined; + let aaaaac = undefined; + let aaaaaac = undefined; + let aaaaaaac = undefined; + let aaaaaaaca = undefined; + let bc = undefined; + let bbc = undefined; + let bbbc = undefined; + let aaabcab = undefined; + let aaaababc = undefined; + let aaaabaabc = undefined; + let aaaaabaabc = undefined; + let aaaaaabaabc = undefined; + let abc = undefined; + let abca = undefined; + let abcaa = undefined; + let abacaa = undefined; + let abacaaa = undefined; + let aabaacaa = undefined; + let aabaacaaa = undefined; + let aaabcaaaaa = undefined; + let bbbbcb = undefined; + let bbbbcbb = undefined; + let bbbcb = undefined; + let aacaba = undefined; + let aaaabca = undefined; + let aaaacbaa = undefined; + let aaaaabcaa = undefined; + let aaaaacabaa = undefined; + let add = undefined; + let aadd = undefined; + let aaadd = undefined; + let aaaadd = undefined; + let aaaaadd = undefined; + let aaaaaadd = undefined; + let aaaaaadda = undefined; + let aaaaaaadda = undefined; + let bdd = undefined; + let bbdd = undefined; + let bbbdd = undefined; + let aaababdd = undefined; + let aaaabddab = undefined; + let aaaabddaab = undefined; + let aaaaaddbaab = undefined; + let aaaaaabddaab = undefined; + let ddab = undefined; + let abdda = undefined; + let abadda = undefined; + let abaddaa = undefined; + let abaaddaa = undefined; + let aabaaddaa = undefined; + let aabaaaddaa = undefined; + let aaabaaaddaa = undefined; + let bbbddbb = undefined; + let bbbddbbb = undefined; + let bbddbb = undefined; + let aaaddba = undefined; + let aaaddaba = undefined; + let aaaabaadd = undefined; + let aaaaabaadd = undefined; + let aaaaaabaadd = undefined; + let cdd = undefined; + let acdd = undefined; + let aacdd = undefined; + let aaacdd = undefined; + let aaaacddd = undefined; + let aaaaacddd = undefined; + let aaaaaacddd = undefined; + let aaaaaaacdd = undefined; + let aaaaaaacadd = undefined; + let bcdd = undefined; + let bbcdd = undefined; + let bbbcdd = undefined; + let aaabcabdd = undefined; + let aaaababcdd = undefined; + let aaaabaabcdd = undefined; + let aaaaabaabcdd = undefined; + let aaaaaabaabcdd = undefined; + let abcdd = undefined; + let abcdda = undefined; + let abcaddda = undefined; + let abacaddda = undefined; + let abacaadda = undefined; + let aabaacddaa = undefined; + let aabaacaaadd = undefined; + let aaabcaaaaadd = undefined; + let bbbbcbdd = undefined; + let bbbbcbbdd = undefined; + let bbbcbdd = undefined; + let aacabdda = undefined; + let aaaabcadd = undefined; + let aaaacbadda = undefined; + let aaaaabcaadd = undefined; + let aaaaacabddaa = undefined; + let ae = undefined; + let aaee = undefined; + let aaaee = undefined; + let aaaae = undefined; + let aaaaea = undefined; + let aaaaaea = undefined; + let aaaaaeaa = undefined; + let aaaaaaeaa = undefined; + let be = undefined; + let bbe = undefined; + let bbeb = undefined; + let aaabeab = undefined; + let aaaaebab = undefined; + let aaaabaeab = undefined; + let aaaaaebaab = undefined; + let aaaaaaebaab = undefined; + let abe = undefined; + let aeba = undefined; + let abeaa = undefined; + let abaeaa = undefined; + let abaeaaa = undefined; + let aabaeaaa = undefined; + let aabaaeaaa = undefined; + let aaabeaaaaa = undefined; + let bbbbeb = undefined; + let bbbbebb = undefined; + let bbbeb = undefined; + let aaaeba = undefined; + let aaaeaba = undefined; + let aaaeabaa = undefined; + let aaaeaabaa = undefined; + let aaaaeaabaa = undefined; + let ce = undefined; + let aec = undefined; + let aaec = undefined; + let aaaec = undefined; + let aaaeac = undefined; + let aaaaeac = undefined; + let aaaaeaac = undefined; + let aaaaaeaac = undefined; + let aaaaaeaaca = undefined; + let bce = undefined; + let bbce = undefined; + let bbbec = undefined; + let aaabceab = undefined; + let aaaabaebc = undefined; + let aaaabaeabc = undefined; + let aaaaabaeabc = undefined; + let aaaaaabeaabc = undefined; + let abce = undefined; + let abcea = undefined; + let abcaea = undefined; + let abacaea = undefined; + let abacaeaa = undefined; + let aabaeacaa = undefined; + let aabaaceaaa = undefined; + let aaabcaaeaaa = undefined; + let bbbbecb = undefined; + let bbbbcbeb = undefined; + let bbbceb = undefined; + let aacaeba = undefined; + let aaaaebca = undefined; + let aaaacbaea = undefined; + let aaaaabecaa = undefined; + let aaaaaceabaa = undefined; + let adde = undefined; + let aaded = undefined; + let aaaedd = undefined; + let aaaaedd = undefined; + let aaaaeadd = undefined; + let aaaaeaadd = undefined; + let aaaaaeadda = undefined; + let aaaaaaeadda = undefined; + let bded = undefined; + let bbedd = undefined; + let bbbded = undefined; + let aaababedd = undefined; + let aaaabdedab = undefined; + let aaaabddaeab = undefined; + let aaaaaeddbaab = undefined; + let aaaaaabeddaab = undefined; + let ddabe = undefined; + let abdeda = undefined; + let abadeda = undefined; + let abadedaa = undefined; + let abaaddeaa = undefined; + let aabaadedaa = undefined; + let aabaaaeddaa = undefined; + let aaabaaadedaa = undefined; + let bbbddebb = undefined; + let bbbddbebb = undefined; + let bbddebb = undefined; + let aaaddeba = undefined; + let aaaddaeba = undefined; + let aaaabeaadd = undefined; + let aaaaabaeadd = undefined; + let aaaaaabaeadd = undefined; + let cdde = undefined; + let acdde = undefined; + let aacdde = undefined; + let aaacdde = undefined; + let aaaacdded = undefined; + let aaaaacdded = undefined; + let aaaaaacdded = undefined; + let aaaaaaacdde = undefined; + let aaaaaaacadde = undefined; + let bcedd = undefined; + let bbcedd = undefined; + let bbbcedd = undefined; + let aaabceabdd = undefined; + let aaaabaebcdd = undefined; + let aaaabaaebcdd = undefined; + let aaaaabaaebcdd = undefined; + let aaaaaabaaebcdd = undefined; + let abcdde = undefined; + let abcddae = undefined; + let abcadddea = undefined; + let abacadddea = undefined; + let abacaaddae = undefined; + let aabaacddaae = undefined; + let aabaacaaadde = undefined; + let aaabcaaaaadde = undefined; + let bbbbcbdde = undefined; + let bbbbcbbdde = undefined; + let bbbcbdde = undefined; + let aacabddae = undefined; + let aaaabcadde = undefined; + let aaaacbaddae = undefined; + let aaaaabcaadde = undefined; + let aaaaacabddaae = {a: function b(c) { + print(c); + }}; + aaaaacabddaae.a(123); +} + +xx();