diff dmd/statement.h @ 309:d59c363fccad trunk

[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.
author lindquist
date Sat, 28 Jun 2008 11:37:53 +0200
parents 2b72433d5c8c
children aaade6ded589
line wrap: on
line diff
--- a/dmd/statement.h	Sat Jun 28 05:57:16 2008 +0200
+++ b/dmd/statement.h	Sat Jun 28 11:37:53 2008 +0200
@@ -50,6 +50,8 @@
 struct InterState;
 struct CaseStatement;
 struct LabelStatement;
+struct VolatileStatement;
+struct SynchronizedStatement;
 
 enum TOK;
 
@@ -77,6 +79,35 @@
 #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 UnrolledLoopStatement : Statement
 {
     Statements *statements;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     UnrolledLoopStatement(Loc loc, Statements *statements);
     Statement *syntaxCopy();
@@ -241,7 +272,7 @@
 {
     Expression *condition;
     Statement *body;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     WhileStatement(Loc loc, Expression *c, Statement *b);
     Statement *syntaxCopy();
@@ -263,7 +294,7 @@
 {
     Statement *body;
     Expression *condition;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     DoStatement(Loc loc, Statement *b, Expression *c);
     Statement *syntaxCopy();
@@ -287,7 +318,7 @@
     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 @@
     Arguments *arguments;	// array of Argument*'s
     Expression *aggr;
     Statement *body;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     VarDeclaration *key;
     VarDeclaration *value;
@@ -409,7 +440,7 @@
     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 GotoDefaultStatement : Statement
 {
     SwitchStatement *sw;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     GotoDefaultStatement(Loc loc);
     Statement *syntaxCopy();
@@ -500,7 +531,7 @@
 {
     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 ReturnStatement : Statement
 {
     Expression *exp;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     ReturnStatement(Loc loc, Expression *exp);
     Statement *syntaxCopy();
@@ -546,7 +577,7 @@
 struct BreakStatement : Statement
 {
     Identifier *ident;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     BreakStatement(Loc loc, Identifier *ident);
     Statement *syntaxCopy();
@@ -564,7 +595,7 @@
 struct ContinueStatement : Statement
 {
     Identifier *ident;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     ContinueStatement(Loc loc, Identifier *ident);
     Statement *syntaxCopy();
@@ -583,6 +614,7 @@
 {
     Expression *exp;
     Statement *body;
+    EnclosingHandler* enclosinghandler;
 
     SynchronizedStatement(Loc loc, Expression *exp, Statement *body);
     Statement *syntaxCopy();
@@ -599,6 +631,7 @@
     elem *esync;
     SynchronizedStatement(Loc loc, elem *esync, Statement *body);
     void toIR(IRState *irs);
+    llvm::Value* llsync;
 };
 
 struct WithStatement : Statement
@@ -656,7 +689,7 @@
 {
     Statement *body;
     Statement *finalbody;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody);
     Statement *syntaxCopy();
@@ -705,6 +738,7 @@
 struct VolatileStatement : Statement
 {
     Statement *statement;
+    EnclosingHandler* enclosinghandler;
 
     VolatileStatement(Loc loc, Statement *statement);
     Statement *syntaxCopy();
@@ -723,7 +757,7 @@
     Identifier *ident;
     LabelDsymbol *label;
     TryFinallyStatement *tf;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     GotoStatement(Loc loc, Identifier *ident);
     Statement *syntaxCopy();
@@ -741,7 +775,7 @@
     Identifier *ident;
     Statement *statement;
     TryFinallyStatement *tf;
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
     block *lblock;		// back end
     int isReturnLabel;
 
@@ -798,7 +832,7 @@
 
 struct AsmBlockStatement : CompoundStatement
 {
-    TryFinallyStatement *enclosingtryfinally;
+    EnclosingHandler* enclosinghandler;
 
     AsmBlockStatement(Loc loc, Statements *s);
     Statements *flatten(Scope *sc);