19 using namespace clang;
39 using LabelTy =
typename ByteCodeStmtGen<Emitter>::LabelTy;
45 OldContinueLabel(Ctx->ContinueLabel) {
46 this->Ctx->BreakLabel = BreakLabel;
47 this->Ctx->ContinueLabel = ContinueLabel;
51 this->Ctx->BreakLabel = OldBreakLabel;
52 this->Ctx->ContinueLabel = OldContinueLabel;
56 OptLabelTy OldBreakLabel;
57 OptLabelTy OldContinueLabel;
63 using LabelTy =
typename ByteCodeStmtGen<Emitter>::LabelTy;
65 using CaseMap =
typename ByteCodeStmtGen<Emitter>::CaseMap;
70 OldDefaultLabel(this->Ctx->DefaultLabel),
71 OldCaseLabels(
std::move(this->Ctx->CaseLabels)) {
72 this->Ctx->BreakLabel = BreakLabel;
73 this->Ctx->DefaultLabel = DefaultLabel;
74 this->Ctx->CaseLabels = std::move(CaseLabels);
78 this->Ctx->BreakLabel = OldBreakLabel;
79 this->Ctx->DefaultLabel = OldDefaultLabel;
80 this->Ctx->CaseLabels = std::move(OldCaseLabels);
84 OptLabelTy OldBreakLabel;
85 OptLabelTy OldDefaultLabel;
86 CaseMap OldCaseLabels;
92 template <
class Emitter>
98 if (
auto *MD = dyn_cast<CXXMethodDecl>(F))
99 return this->bail(MD);
102 if (!visitStmt(Body))
112 template <
class Emitter>
114 switch (S->getStmtClass()) {
115 case Stmt::CompoundStmtClass:
116 return visitCompoundStmt(cast<CompoundStmt>(S));
117 case Stmt::DeclStmtClass:
118 return visitDeclStmt(cast<DeclStmt>(S));
119 case Stmt::ReturnStmtClass:
120 return visitReturnStmt(cast<ReturnStmt>(S));
121 case Stmt::IfStmtClass:
122 return visitIfStmt(cast<IfStmt>(S));
123 case Stmt::NullStmtClass:
126 if (
auto *Exp = dyn_cast<Expr>(S))
127 return this->discard(Exp);
128 return this->bail(S);
133 template <
class Emitter>
138 if (!visitStmt(InnerStmt))
143 template <
class Emitter>
145 for (
auto *D : DS->
decls()) {
147 if (
auto *VD = dyn_cast<VarDecl>(D)) {
148 if (!visitVarDecl(VD))
154 if (
auto *DD = dyn_cast<DecompositionDecl>(D)) {
155 return this->bail(DD);
162 template <
class Emitter>
168 if (!this->visit(RE))
171 return this->emitRet(*ReturnType, RS);
174 auto ReturnLocation = [
this, RE] {
return this->emitGetParamPtr(0, RE); };
175 if (!this->visitInitializer(RE, ReturnLocation))
178 return this->emitRetVoid(RS);
182 if (!this->emitRetVoid(RS))
188 template <
class Emitter>
193 return visitStmt(IS->
getThen());
197 if (
auto *CondInit = IS->
getInit())
202 if (!visitDeclStmt(CondDecl))
205 if (!this->visitBool(IS->
getCond()))
209 LabelTy LabelElse = this->getLabel();
210 LabelTy LabelEnd = this->getLabel();
211 if (!this->jumpFalse(LabelElse))
215 if (!this->jump(LabelEnd))
217 this->emitLabel(LabelElse);
218 if (!visitStmt(Else))
220 this->emitLabel(LabelEnd);
222 LabelTy LabelEnd = this->getLabel();
223 if (!this->jumpFalse(LabelEnd))
227 this->emitLabel(LabelEnd);
233 template <
class Emitter>
244 auto Off = this->allocateLocalPrimitive(VD, *T, DT.isConstQualified());
248 if (!this->visit(VD->
getInit()))
252 return this->emitSetLocal(*T, Off, VD);
255 if (
auto Off = this->allocateLocal(VD)) {
256 return this->visitLocalInitializer(VD->
getInit(), *Off);
258 return this->bail(VD);