From 4314eeec1767059edd9f4f9209f38ad2fe917457 Mon Sep 17 00:00:00 2001 From: ctw-ian Date: Thu, 20 Jul 2023 12:02:02 +0800 Subject: [PATCH] fixed efb5c4d from https://gitee.com/ctw-ian/ark_ts2abc/pulls/1114 Fix implementation of do-while statement Issue:https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/I7MMKG Signed-off-by: ctw-ian Change-Id: Idb9727f24aff7524ba62044a5f1b5293588af0e3 --- es2panda/compiler/core/envScope.cpp | 9 +++++ es2panda/compiler/core/envScope.h | 2 ++ es2panda/ir/statements/doWhileStatement.cpp | 7 ++-- .../do-while-body-lexical-break-expected.txt | 1 + .../lexicalEnv/do-while-body-lexical-break.js | 28 +++++++++++++++ ...o-while-body-lexical-continue-expected.txt | 1 + .../do-while-body-lexical-continue.js | 34 +++++++++++++++++++ .../do-while-body-lexical-expected.txt | 1 + .../do-while-body-lexical-return-expected.txt | 1 + .../do-while-body-lexical-return.js | 28 +++++++++++++++ .../js/lexicalEnv/do-while-body-lexical.js | 29 ++++++++++++++++ 11 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break-expected.txt create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break.js create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue-expected.txt create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue.js create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-expected.txt create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return-expected.txt create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return.js create mode 100644 es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical.js diff --git a/es2panda/compiler/core/envScope.cpp b/es2panda/compiler/core/envScope.cpp index aa3e98344a..7aff0e1bfb 100644 --- a/es2panda/compiler/core/envScope.cpp +++ b/es2panda/compiler/core/envScope.cpp @@ -81,4 +81,13 @@ void LoopEnvScope::CopyPerIterationCtx() } } +void LoopEnvScope::PopLexEnvBeforeTheNextIter() +{ + if (!HasEnv()) { + return; + } + + pg_->PopLexEnv(scope_->Node()); +} + } // namespace panda::es2panda::compiler diff --git a/es2panda/compiler/core/envScope.h b/es2panda/compiler/core/envScope.h index 73085741bf..147a2230ac 100644 --- a/es2panda/compiler/core/envScope.h +++ b/es2panda/compiler/core/envScope.h @@ -93,6 +93,8 @@ public: void CopyPerIterationCtx(); + void PopLexEnvBeforeTheNextIter(); + private: static bool NeedEnv(binder::VariableScope *scope) { diff --git a/es2panda/ir/statements/doWhileStatement.cpp b/es2panda/ir/statements/doWhileStatement.cpp index d5b05b8bf5..359adf736f 100644 --- a/es2panda/ir/statements/doWhileStatement.cpp +++ b/es2panda/ir/statements/doWhileStatement.cpp @@ -44,13 +44,12 @@ void DoWhileStatement::Compile(compiler::PandaGen *pg) const pg->SetLabel(this, startLabel); - { - compiler::LoopEnvScope envScope(pg, labelTarget, scope_); - body_->Compile(pg); - } + compiler::LoopEnvScope envScope(pg, labelTarget, scope_); + body_->Compile(pg); pg->SetLabel(this, labelTarget.ContinueTarget()); compiler::Condition::Compile(pg, this->Test(), labelTarget.BreakTarget()); + envScope.PopLexEnvBeforeTheNextIter(); pg->Branch(this, startLabel); pg->SetLabel(this, labelTarget.BreakTarget()); diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break-expected.txt b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break-expected.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break-expected.txt @@ -0,0 +1 @@ +1 diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break.js b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break.js new file mode 100644 index 0000000000..da965176f0 --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-break.js @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let c; +function x() { + do { + let a = 1; + c = function b() { + print(a); + } + break; + } while (true) +} + +x(); +c(); diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue-expected.txt b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue-expected.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue-expected.txt @@ -0,0 +1 @@ +1 diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue.js b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue.js new file mode 100644 index 0000000000..87107b66d0 --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-continue.js @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let c; +function x() { + let i = 1; + do { + let a = 1; + if (i == 1) { + i++; + continue; + } + + c = function b() { + print(a); + } + i++; + } while (i != 3) +} + +x(); +c(); diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-expected.txt b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-expected.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-expected.txt @@ -0,0 +1 @@ +1 diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return-expected.txt b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return-expected.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return-expected.txt @@ -0,0 +1 @@ +1 diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return.js b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return.js new file mode 100644 index 0000000000..a904e5a8c4 --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical-return.js @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let c; +function x() { + do { + let a = 1; + c = function b() { + print(a); + } + return; + } while (true) +} + +x() +c(); diff --git a/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical.js b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical.js new file mode 100644 index 0000000000..52a4e11712 --- /dev/null +++ b/es2panda/test/compiler/js/lexicalEnv/do-while-body-lexical.js @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let c; +function x() { + let i = 1; + do { + let a = 1; + c = function b() { + print(a); + } + i++; + } while (i != 1) +} + +x(); +c(); -- Gitee