mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-05-04 01:11:29 +02:00
[svn r330] Implemented synchronized statements.
Changed the tryfinally handlers to a more generalized EnclosingHandler. Changed ClassInfoS to be mutable so they can be used as locks. Added new BB after throw ala return/break etc.
This commit is contained in:
@@ -29,6 +29,7 @@ struct AggregateDeclaration;
|
||||
struct AnonymousAggregateDeclaration;
|
||||
struct FuncDeclaration;
|
||||
struct DocComment;
|
||||
struct EnclosingHandler;
|
||||
enum LINK;
|
||||
enum PROT;
|
||||
|
||||
@@ -45,7 +46,7 @@ struct Scope
|
||||
LabelStatement *slabel; // enclosing labelled statement
|
||||
SwitchStatement *sw; // enclosing switch statement
|
||||
TryFinallyStatement *tf; // enclosing try finally statement; set inside its finally block
|
||||
TryFinallyStatement *tfOfTry; // enclosing try finally statement; set inside its try block
|
||||
EnclosingHandler *tfOfTry; // enclosing try-finally, volatile or synchronized statement; set inside its try or body block
|
||||
Statement *sbreak; // enclosing statement that supports "break"
|
||||
Statement *scontinue; // enclosing statement that supports "continue"
|
||||
ForeachStatement *fes; // if nested function for ForeachStatement, this is it
|
||||
|
||||
@@ -560,7 +560,7 @@ UnrolledLoopStatement::UnrolledLoopStatement(Loc loc, Statements *s)
|
||||
: Statement(loc)
|
||||
{
|
||||
statements = s;
|
||||
enclosingtryfinally = NULL;
|
||||
enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *UnrolledLoopStatement::syntaxCopy()
|
||||
@@ -582,7 +582,7 @@ Statement *UnrolledLoopStatement::semantic(Scope *sc)
|
||||
{
|
||||
//printf("UnrolledLoopStatement::semantic(this = %p, sc = %p)\n", this, sc);
|
||||
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
|
||||
sc->noctor++;
|
||||
Scope *scd = sc->push();
|
||||
@@ -773,7 +773,7 @@ WhileStatement::WhileStatement(Loc loc, Expression *c, Statement *b)
|
||||
{
|
||||
condition = c;
|
||||
body = b;
|
||||
enclosingtryfinally = NULL;
|
||||
enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *WhileStatement::syntaxCopy()
|
||||
@@ -808,7 +808,7 @@ Statement *WhileStatement::semantic(Scope *sc)
|
||||
}
|
||||
#endif
|
||||
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
|
||||
condition = condition->semantic(sc);
|
||||
condition = resolveProperties(sc, condition);
|
||||
@@ -875,7 +875,7 @@ DoStatement::DoStatement(Loc loc, Statement *b, Expression *c)
|
||||
{
|
||||
body = b;
|
||||
condition = c;
|
||||
enclosingtryfinally = NULL;
|
||||
enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *DoStatement::syntaxCopy()
|
||||
@@ -887,7 +887,7 @@ Statement *DoStatement::syntaxCopy()
|
||||
|
||||
Statement *DoStatement::semantic(Scope *sc)
|
||||
{
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
|
||||
sc->noctor++;
|
||||
if (body)
|
||||
@@ -951,7 +951,7 @@ ForStatement::ForStatement(Loc loc, Statement *init, Expression *condition, Expr
|
||||
this->condition = condition;
|
||||
this->increment = increment;
|
||||
this->body = body;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *ForStatement::syntaxCopy()
|
||||
@@ -971,7 +971,7 @@ Statement *ForStatement::syntaxCopy()
|
||||
|
||||
Statement *ForStatement::semantic(Scope *sc)
|
||||
{
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
|
||||
ScopeDsymbol *sym = new ScopeDsymbol();
|
||||
sym->parent = sc->scopesym;
|
||||
@@ -1085,7 +1085,7 @@ ForeachStatement::ForeachStatement(Loc loc, enum TOK op, Arguments *arguments,
|
||||
this->arguments = arguments;
|
||||
this->aggr = aggr;
|
||||
this->body = body;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
|
||||
this->key = NULL;
|
||||
this->value = NULL;
|
||||
@@ -1114,7 +1114,7 @@ Statement *ForeachStatement::semantic(Scope *sc)
|
||||
Type *tn = NULL;
|
||||
Type *tnv = NULL;
|
||||
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
|
||||
func = sc->func;
|
||||
if (func->fes)
|
||||
@@ -1981,7 +1981,7 @@ SwitchStatement::SwitchStatement(Loc loc, Expression *c, Statement *b)
|
||||
cases = NULL;
|
||||
hasNoDefault = 0;
|
||||
// LLVMDC
|
||||
enclosingtryfinally = NULL;
|
||||
enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *SwitchStatement::syntaxCopy()
|
||||
@@ -1996,7 +1996,7 @@ Statement *SwitchStatement::semantic(Scope *sc)
|
||||
//printf("SwitchStatement::semantic(%p)\n", this);
|
||||
assert(!cases); // ensure semantic() is only run once
|
||||
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
|
||||
condition = condition->semantic(sc);
|
||||
condition = resolveProperties(sc, condition);
|
||||
@@ -2284,7 +2284,7 @@ GotoDefaultStatement::GotoDefaultStatement(Loc loc)
|
||||
: Statement(loc)
|
||||
{
|
||||
sw = NULL;
|
||||
enclosingtryfinally = NULL;
|
||||
enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *GotoDefaultStatement::syntaxCopy()
|
||||
@@ -2295,7 +2295,7 @@ Statement *GotoDefaultStatement::syntaxCopy()
|
||||
|
||||
Statement *GotoDefaultStatement::semantic(Scope *sc)
|
||||
{
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
sw = sc->sw;
|
||||
if (!sw)
|
||||
error("goto default not in switch statement");
|
||||
@@ -2319,7 +2319,7 @@ GotoCaseStatement::GotoCaseStatement(Loc loc, Expression *exp)
|
||||
{
|
||||
cs = NULL;
|
||||
this->exp = exp;
|
||||
enclosingtryfinally = NULL;
|
||||
enclosinghandler = NULL;
|
||||
sw = NULL;
|
||||
}
|
||||
|
||||
@@ -2332,7 +2332,7 @@ Statement *GotoCaseStatement::syntaxCopy()
|
||||
|
||||
Statement *GotoCaseStatement::semantic(Scope *sc)
|
||||
{
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
if (exp)
|
||||
exp = exp->semantic(sc);
|
||||
|
||||
@@ -2391,7 +2391,7 @@ ReturnStatement::ReturnStatement(Loc loc, Expression *exp)
|
||||
: Statement(loc)
|
||||
{
|
||||
this->exp = exp;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *ReturnStatement::syntaxCopy()
|
||||
@@ -2406,7 +2406,7 @@ Statement *ReturnStatement::syntaxCopy()
|
||||
Statement *ReturnStatement::semantic(Scope *sc)
|
||||
{
|
||||
//printf("ReturnStatement::semantic() %s\n", toChars());
|
||||
this->enclosingtryfinally = sc->tfOfTry;
|
||||
this->enclosinghandler = sc->tfOfTry;
|
||||
|
||||
FuncDeclaration *fd = sc->parent->isFuncDeclaration();
|
||||
Scope *scx = sc;
|
||||
@@ -2667,7 +2667,7 @@ BreakStatement::BreakStatement(Loc loc, Identifier *ident)
|
||||
: Statement(loc)
|
||||
{
|
||||
this->ident = ident;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *BreakStatement::syntaxCopy()
|
||||
@@ -2678,7 +2678,7 @@ Statement *BreakStatement::syntaxCopy()
|
||||
|
||||
Statement *BreakStatement::semantic(Scope *sc)
|
||||
{
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
// If:
|
||||
// break Identifier;
|
||||
if (ident)
|
||||
@@ -2761,7 +2761,7 @@ ContinueStatement::ContinueStatement(Loc loc, Identifier *ident)
|
||||
: Statement(loc)
|
||||
{
|
||||
this->ident = ident;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *ContinueStatement::syntaxCopy()
|
||||
@@ -2772,7 +2772,7 @@ Statement *ContinueStatement::syntaxCopy()
|
||||
|
||||
Statement *ContinueStatement::semantic(Scope *sc)
|
||||
{
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
//printf("ContinueStatement::semantic() %p\n", this);
|
||||
if (ident)
|
||||
{
|
||||
@@ -2866,6 +2866,8 @@ SynchronizedStatement::SynchronizedStatement(Loc loc, Expression *exp, Statement
|
||||
this->exp = exp;
|
||||
this->body = body;
|
||||
this->esync = NULL;
|
||||
// LLVMDC
|
||||
this->llsync = NULL;
|
||||
}
|
||||
|
||||
SynchronizedStatement::SynchronizedStatement(Loc loc, elem *esync, Statement *body)
|
||||
@@ -2874,6 +2876,8 @@ SynchronizedStatement::SynchronizedStatement(Loc loc, elem *esync, Statement *bo
|
||||
this->exp = NULL;
|
||||
this->body = body;
|
||||
this->esync = esync;
|
||||
// LLVMDC
|
||||
this->llsync = NULL;
|
||||
}
|
||||
|
||||
Statement *SynchronizedStatement::syntaxCopy()
|
||||
@@ -2902,7 +2906,12 @@ Statement *SynchronizedStatement::semantic(Scope *sc)
|
||||
}
|
||||
}
|
||||
if (body)
|
||||
body = body->semantic(sc);
|
||||
{
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
sc->tfOfTry = new EnclosingSynchro(this);
|
||||
body = body->semantic(sc);
|
||||
sc->tfOfTry = enclosinghandler;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -3205,7 +3214,7 @@ TryFinallyStatement::TryFinallyStatement(Loc loc, Statement *body, Statement *fi
|
||||
{
|
||||
this->body = body;
|
||||
this->finalbody = finalbody;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *TryFinallyStatement::syntaxCopy()
|
||||
@@ -3219,10 +3228,10 @@ Statement *TryFinallyStatement::semantic(Scope *sc)
|
||||
{
|
||||
//printf("TryFinallyStatement::semantic()\n");
|
||||
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
sc->tfOfTry = this;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
sc->tfOfTry = new EnclosingTryFinally(this);
|
||||
body = body->semantic(sc);
|
||||
sc->tfOfTry = enclosingtryfinally;
|
||||
sc->tfOfTry = enclosinghandler;
|
||||
|
||||
sc = sc->push();
|
||||
sc->tf = this;
|
||||
@@ -3399,6 +3408,7 @@ VolatileStatement::VolatileStatement(Loc loc, Statement *statement)
|
||||
: Statement(loc)
|
||||
{
|
||||
this->statement = statement;
|
||||
this->enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *VolatileStatement::syntaxCopy()
|
||||
@@ -3410,7 +3420,13 @@ Statement *VolatileStatement::syntaxCopy()
|
||||
|
||||
Statement *VolatileStatement::semantic(Scope *sc)
|
||||
{
|
||||
statement = statement ? statement->semantic(sc) : NULL;
|
||||
if (statement)
|
||||
{
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
sc->tfOfTry = new EnclosingVolatile(this);
|
||||
statement = statement->semantic(sc);
|
||||
sc->tfOfTry = enclosinghandler;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -3457,7 +3473,7 @@ GotoStatement::GotoStatement(Loc loc, Identifier *ident)
|
||||
this->ident = ident;
|
||||
this->label = NULL;
|
||||
this->tf = NULL;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
}
|
||||
|
||||
Statement *GotoStatement::syntaxCopy()
|
||||
@@ -3471,7 +3487,7 @@ Statement *GotoStatement::semantic(Scope *sc)
|
||||
|
||||
//printf("GotoStatement::semantic()\n");
|
||||
tf = sc->tf;
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
label = fd->searchLabel(ident);
|
||||
if (!label->statement && sc->fes)
|
||||
{
|
||||
@@ -3515,7 +3531,7 @@ LabelStatement::LabelStatement(Loc loc, Identifier *ident, Statement *statement)
|
||||
this->ident = ident;
|
||||
this->statement = statement;
|
||||
this->tf = NULL;
|
||||
this->enclosingtryfinally = NULL;
|
||||
this->enclosinghandler = NULL;
|
||||
this->lblock = NULL;
|
||||
this->isReturnLabel = 0;
|
||||
this->llvmBB = NULL;
|
||||
@@ -3539,7 +3555,7 @@ Statement *LabelStatement::semantic(Scope *sc)
|
||||
else
|
||||
ls->statement = this;
|
||||
tf = sc->tf;
|
||||
enclosingtryfinally = sc->tfOfTry;
|
||||
enclosinghandler = sc->tfOfTry;
|
||||
sc = sc->push();
|
||||
sc->scopesym = sc->enclosing->scopesym;
|
||||
sc->callSuper |= CSXlabel;
|
||||
|
||||
@@ -50,6 +50,8 @@ struct HdrGenState;
|
||||
struct InterState;
|
||||
struct CaseStatement;
|
||||
struct LabelStatement;
|
||||
struct VolatileStatement;
|
||||
struct SynchronizedStatement;
|
||||
|
||||
enum TOK;
|
||||
|
||||
@@ -77,6 +79,35 @@ struct block;
|
||||
#endif
|
||||
struct code;
|
||||
|
||||
// LLVMDC this is used for tracking try-finally, synchronized and volatile scopes
|
||||
// definitions in gen/llvmhelpers.cpp
|
||||
struct EnclosingHandler : Object
|
||||
{
|
||||
virtual void emitCode(IRState* p) = 0;
|
||||
virtual EnclosingHandler* getEnclosing() = 0;
|
||||
};
|
||||
struct EnclosingTryFinally : EnclosingHandler
|
||||
{
|
||||
TryFinallyStatement* tf;
|
||||
void emitCode(IRState* p);
|
||||
EnclosingHandler* getEnclosing();
|
||||
EnclosingTryFinally(TryFinallyStatement* _tf) : tf(_tf) {}
|
||||
};
|
||||
struct EnclosingVolatile : EnclosingHandler
|
||||
{
|
||||
VolatileStatement* v;
|
||||
void emitCode(IRState* p);
|
||||
EnclosingHandler* getEnclosing();
|
||||
EnclosingVolatile(VolatileStatement* _tf) : v(_tf) {}
|
||||
};
|
||||
struct EnclosingSynchro : EnclosingHandler
|
||||
{
|
||||
SynchronizedStatement* s;
|
||||
void emitCode(IRState* p);
|
||||
EnclosingHandler* getEnclosing();
|
||||
EnclosingSynchro(SynchronizedStatement* _tf) : s(_tf) {}
|
||||
};
|
||||
|
||||
struct Statement : Object
|
||||
{
|
||||
Loc loc;
|
||||
@@ -196,7 +227,7 @@ struct CompoundStatement : Statement
|
||||
struct UnrolledLoopStatement : Statement
|
||||
{
|
||||
Statements *statements;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
UnrolledLoopStatement(Loc loc, Statements *statements);
|
||||
Statement *syntaxCopy();
|
||||
@@ -241,7 +272,7 @@ struct WhileStatement : Statement
|
||||
{
|
||||
Expression *condition;
|
||||
Statement *body;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
WhileStatement(Loc loc, Expression *c, Statement *b);
|
||||
Statement *syntaxCopy();
|
||||
@@ -263,7 +294,7 @@ struct DoStatement : Statement
|
||||
{
|
||||
Statement *body;
|
||||
Expression *condition;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
DoStatement(Loc loc, Statement *b, Expression *c);
|
||||
Statement *syntaxCopy();
|
||||
@@ -287,7 +318,7 @@ struct ForStatement : Statement
|
||||
Expression *condition;
|
||||
Expression *increment;
|
||||
Statement *body;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body);
|
||||
Statement *syntaxCopy();
|
||||
@@ -312,7 +343,7 @@ struct ForeachStatement : Statement
|
||||
Arguments *arguments; // array of Argument*'s
|
||||
Expression *aggr;
|
||||
Statement *body;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
VarDeclaration *key;
|
||||
VarDeclaration *value;
|
||||
@@ -409,7 +440,7 @@ struct SwitchStatement : Statement
|
||||
Expression *condition;
|
||||
Statement *body;
|
||||
DefaultStatement *sdefault;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
Array gotoCases; // array of unresolved GotoCaseStatement's
|
||||
Array *cases; // array of CaseStatement's
|
||||
@@ -484,7 +515,7 @@ struct DefaultStatement : Statement
|
||||
struct GotoDefaultStatement : Statement
|
||||
{
|
||||
SwitchStatement *sw;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
GotoDefaultStatement(Loc loc);
|
||||
Statement *syntaxCopy();
|
||||
@@ -500,7 +531,7 @@ struct GotoCaseStatement : Statement
|
||||
{
|
||||
Expression *exp; // NULL, or which case to goto
|
||||
CaseStatement *cs; // case statement it resolves to
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
SwitchStatement *sw;
|
||||
|
||||
GotoCaseStatement(Loc loc, Expression *exp);
|
||||
@@ -525,7 +556,7 @@ struct SwitchErrorStatement : Statement
|
||||
struct ReturnStatement : Statement
|
||||
{
|
||||
Expression *exp;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
ReturnStatement(Loc loc, Expression *exp);
|
||||
Statement *syntaxCopy();
|
||||
@@ -546,7 +577,7 @@ struct ReturnStatement : Statement
|
||||
struct BreakStatement : Statement
|
||||
{
|
||||
Identifier *ident;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
BreakStatement(Loc loc, Identifier *ident);
|
||||
Statement *syntaxCopy();
|
||||
@@ -564,7 +595,7 @@ struct BreakStatement : Statement
|
||||
struct ContinueStatement : Statement
|
||||
{
|
||||
Identifier *ident;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
ContinueStatement(Loc loc, Identifier *ident);
|
||||
Statement *syntaxCopy();
|
||||
@@ -583,6 +614,7 @@ struct SynchronizedStatement : Statement
|
||||
{
|
||||
Expression *exp;
|
||||
Statement *body;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
SynchronizedStatement(Loc loc, Expression *exp, Statement *body);
|
||||
Statement *syntaxCopy();
|
||||
@@ -599,6 +631,7 @@ struct SynchronizedStatement : Statement
|
||||
elem *esync;
|
||||
SynchronizedStatement(Loc loc, elem *esync, Statement *body);
|
||||
void toIR(IRState *irs);
|
||||
llvm::Value* llsync;
|
||||
};
|
||||
|
||||
struct WithStatement : Statement
|
||||
@@ -656,7 +689,7 @@ struct TryFinallyStatement : Statement
|
||||
{
|
||||
Statement *body;
|
||||
Statement *finalbody;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody);
|
||||
Statement *syntaxCopy();
|
||||
@@ -705,6 +738,7 @@ struct ThrowStatement : Statement
|
||||
struct VolatileStatement : Statement
|
||||
{
|
||||
Statement *statement;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
VolatileStatement(Loc loc, Statement *statement);
|
||||
Statement *syntaxCopy();
|
||||
@@ -723,7 +757,7 @@ struct GotoStatement : Statement
|
||||
Identifier *ident;
|
||||
LabelDsymbol *label;
|
||||
TryFinallyStatement *tf;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
GotoStatement(Loc loc, Identifier *ident);
|
||||
Statement *syntaxCopy();
|
||||
@@ -741,7 +775,7 @@ struct LabelStatement : Statement
|
||||
Identifier *ident;
|
||||
Statement *statement;
|
||||
TryFinallyStatement *tf;
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
block *lblock; // back end
|
||||
int isReturnLabel;
|
||||
|
||||
@@ -798,7 +832,7 @@ struct AsmStatement : Statement
|
||||
|
||||
struct AsmBlockStatement : CompoundStatement
|
||||
{
|
||||
TryFinallyStatement *enclosingtryfinally;
|
||||
EnclosingHandler* enclosinghandler;
|
||||
|
||||
AsmBlockStatement(Loc loc, Statements *s);
|
||||
Statements *flatten(Scope *sc);
|
||||
|
||||
Reference in New Issue
Block a user