• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ES2PANDA_COMPILER_CORE_ENV_SCOPE_H
17 #define ES2PANDA_COMPILER_CORE_ENV_SCOPE_H
18 
19 #include <binder/scope.h>
20 #include <ir/irnode.h>
21 #include <compiler/core/dynamicContext.h>
22 #include <compiler/core/regScope.h>
23 #include <compiler/core/labelTarget.h>
24 
25 namespace panda::es2panda::ir {
26 class AstNode;
27 class Statement;
28 }  // namespace panda::es2panda::ir
29 
30 namespace panda::es2panda::compiler {
31 
32 class PandaGen;
33 
34 class ScopeContext {
35 public:
36     explicit ScopeContext(PandaGen *pg, binder::Scope *newScope);
37     ~ScopeContext();
38 
39     NO_COPY_SEMANTIC(ScopeContext);
40     NO_MOVE_SEMANTIC(ScopeContext);
41 
42 private:
43     PandaGen *pg_;
44     binder::Scope *prevScope_;
45 };
46 
47 class EnvScope {
48 public:
49     explicit EnvScope() = default;
50 
51     NO_COPY_SEMANTIC(EnvScope);
52     NO_MOVE_SEMANTIC(EnvScope);
53     ~EnvScope();
54 
55     void Initialize(PandaGen *pg);
56 
Prev()57     EnvScope *Prev() const
58     {
59         return prev_;
60     }
61 
62 protected:
63     friend class PandaGen;
64 
65     PandaGen *pg_ {};
66     EnvScope *prev_ {};
67 };
68 
69 class VariableEnvScope : public EnvScope {
70 public:
VariableEnvScope(PandaGen * pg,binder::VariableScope * scope,LabelTarget target)71     explicit VariableEnvScope(PandaGen *pg, binder::VariableScope *scope, LabelTarget target)
72         : scope_(InitVariableContext(pg, scope) ? scope : nullptr), regScope_(pg, scope), lexEnvCtx_(this, pg, target)
73     {
74     }
75 
HasEnv()76     bool HasEnv() const
77     {
78         return scope_ != nullptr;
79     }
80 
Scope()81     binder::VariableScope *Scope() const
82     {
83         ASSERT(HasEnv());
84         return scope_;
85     }
86 
87 protected:
88     binder::VariableScope *scope_ {};
89 
90 private:
91     bool InitVariableContext(PandaGen *pg, binder::VariableScope *scope);
92 
93     LocalRegScope regScope_;
94     LexEnvContext lexEnvCtx_;
95 };
96 
97 class LoopEnvScope : public VariableEnvScope {
98 public:
LoopEnvScope(PandaGen * pg,binder::LoopScope * scope,LabelTarget target)99     explicit LoopEnvScope(PandaGen *pg, binder::LoopScope *scope, LabelTarget target)
100         : VariableEnvScope(pg, scope, target)
101     {
102     }
103 
LoopEnvScope(PandaGen * pg,LabelTarget target,binder::LoopScope * scope)104     explicit LoopEnvScope(PandaGen *pg, LabelTarget target, binder::LoopScope *scope)
105         : VariableEnvScope(pg, scope, target)
106     {
107     }
108 
109     void CopyPerIterationCtx();
110 };
111 
112 }  // namespace panda::es2panda::compiler
113 
114 #endif
115