summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar qadeer <qadeer@microsoft.com>2011-07-04 19:47:17 -0700
committerGravatar qadeer <qadeer@microsoft.com>2011-07-04 19:47:17 -0700
commitab8a9e36e0b56734cfdd50806dc26add866eb0d8 (patch)
tree5906d5e62c8e9311cf1cf3135ad4997a60e42606
parent29997a5dd73bfe92292caf1c26fea6b04082a7c9 (diff)
1. generating a separate dipatchcontinuation label for each trycatchfinally statement; this should help in reducing the "loopiness" of the generated code.
2. added overrides for loop statements and continue statement; they just throw exception right now
-rw-r--r--BCT/BytecodeTranslator/Sink.cs10
-rw-r--r--BCT/BytecodeTranslator/StatementTraverser.cs38
2 files changed, 34 insertions, 14 deletions
diff --git a/BCT/BytecodeTranslator/Sink.cs b/BCT/BytecodeTranslator/Sink.cs
index 22daf7da..8629190d 100644
--- a/BCT/BytecodeTranslator/Sink.cs
+++ b/BCT/BytecodeTranslator/Sink.cs
@@ -923,7 +923,7 @@ namespace BytecodeTranslator {
}
return v;
}
- Dictionary<ITryCatchFinallyStatement, int> tryCatchFinallyIdentifiers;
+ public Dictionary<ITryCatchFinallyStatement, int> tryCatchFinallyIdentifiers;
public string FindOrCreateCatchLabel(ITryCatchFinallyStatement stmt) {
int id;
if (!tryCatchFinallyIdentifiers.TryGetValue(stmt, out id)) {
@@ -948,6 +948,14 @@ namespace BytecodeTranslator {
}
return "continuation" + id;
}
+ public string FindOrCreateDispatchContinuationLabel(ITryCatchFinallyStatement stmt) {
+ int id;
+ if (!tryCatchFinallyIdentifiers.TryGetValue(stmt, out id)) {
+ id = tryCatchFinallyIdentifiers.Count;
+ tryCatchFinallyIdentifiers[stmt] = id;
+ }
+ return "DispatchContinuation" + id;
+ }
MostNestedTryStatementTraverser mostNestedTryStatementTraverser;
public ITryCatchFinallyStatement MostNestedTryStatement(IName label) {
return mostNestedTryStatementTraverser.MostNestedTryStatement(label);
diff --git a/BCT/BytecodeTranslator/StatementTraverser.cs b/BCT/BytecodeTranslator/StatementTraverser.cs
index b0821dcd..0dc7c5ab 100644
--- a/BCT/BytecodeTranslator/StatementTraverser.cs
+++ b/BCT/BytecodeTranslator/StatementTraverser.cs
@@ -95,16 +95,18 @@ namespace BytecodeTranslator
}
public void GenerateDispatchContinuation() {
- // Iterate over all labels in sink.cciLabels and generate dispatch based on sink.LabelVariable
- this.StmtBuilder.AddLabelCmd("DispatchContinuation");
- Bpl.IfCmd elseIfCmd = new Bpl.IfCmd(Bpl.Token.NoToken, Bpl.Expr.Literal(true), TranslationHelper.BuildStmtList(new Bpl.AssumeCmd(Bpl.Token.NoToken, Bpl.Expr.Literal(false))), null, null);
- Bpl.IdentifierExpr labelExpr = Bpl.Expr.Ident(this.sink.LabelVariable);
- foreach (IName name in sink.cciLabels.Keys) {
- Bpl.GotoCmd gotoCmd = new Bpl.GotoCmd(Bpl.Token.NoToken, new Bpl.StringSeq(name.Value));
- Bpl.Expr targetExpr = Bpl.Expr.Literal(sink.cciLabels[name]);
- elseIfCmd = new Bpl.IfCmd(Bpl.Token.NoToken, Bpl.Expr.Binary(Bpl.BinaryOperator.Opcode.Eq, labelExpr, targetExpr), TranslationHelper.BuildStmtList(gotoCmd), elseIfCmd, null);
+ foreach (ITryCatchFinallyStatement stmt in sink.tryCatchFinallyIdentifiers.Keys) {
+ // Iterate over all labels in sink.cciLabels and generate dispatch based on sink.LabelVariable
+ this.StmtBuilder.AddLabelCmd(sink.FindOrCreateDispatchContinuationLabel(stmt));
+ Bpl.IfCmd elseIfCmd = new Bpl.IfCmd(Bpl.Token.NoToken, Bpl.Expr.Literal(true), TranslationHelper.BuildStmtList(new Bpl.AssumeCmd(Bpl.Token.NoToken, Bpl.Expr.Literal(false))), null, null);
+ Bpl.IdentifierExpr labelExpr = Bpl.Expr.Ident(this.sink.LabelVariable);
+ foreach (IName name in sink.cciLabels.Keys) {
+ Bpl.GotoCmd gotoCmd = new Bpl.GotoCmd(Bpl.Token.NoToken, new Bpl.StringSeq(name.Value));
+ Bpl.Expr targetExpr = Bpl.Expr.Literal(sink.cciLabels[name]);
+ elseIfCmd = new Bpl.IfCmd(Bpl.Token.NoToken, Bpl.Expr.Binary(Bpl.BinaryOperator.Opcode.Eq, labelExpr, targetExpr), TranslationHelper.BuildStmtList(gotoCmd), elseIfCmd, null);
+ }
+ this.StmtBuilder.Add(elseIfCmd);
}
- this.StmtBuilder.Add(elseIfCmd);
}
#endregion
@@ -227,7 +229,6 @@ namespace BytecodeTranslator
/// <param name="expressionStatement"></param>
/// <remarks> TODO: might be wrong for the general case</remarks>
public override void Visit(IExpressionStatement expressionStatement) {
-
ExpressionTraverser etrav = this.factory.MakeExpressionTraverser(this.sink, this, this.contractContext);
etrav.Visit(expressionStatement.Expression);
}
@@ -238,7 +239,12 @@ namespace BytecodeTranslator
/// <remarks>(mschaef) Not Implemented</remarks>
/// <param name="breakStatement"></param>
public override void Visit(IBreakStatement breakStatement) {
- StmtBuilder.Add(new Bpl.BreakCmd(breakStatement.Token(), "I dont know"));
+ throw new TranslationException("Break statements are not handled");
+ //StmtBuilder.Add(new Bpl.BreakCmd(breakStatement.Token(), "I dont know"));
+ }
+
+ public override void Visit(IContinueStatement continueStatement) {
+ throw new TranslationException("Continue statements are not handled");
}
/// <summary>
@@ -357,10 +363,16 @@ namespace BytecodeTranslator
#region Looping Statements
public override void Visit(IWhileDoStatement whileDoStatement) {
- throw new NotImplementedException("While Statements are not implemented");
+ throw new TranslationException("WhileDo statements are not handled");
}
+ public override void Visit(IForEachStatement forEachStatement) {
+ throw new TranslationException("ForEach statements are not handled");
+ }
+ public override void Visit(IForStatement forStatement) {
+ throw new TranslationException("For statements are not handled");
+ }
#endregion
@@ -451,7 +463,7 @@ namespace BytecodeTranslator
StmtBuilder.Add(TranslationHelper.BuildAssignCmd(Bpl.Expr.Ident(this.sink.FinallyStackCounterVariable), Bpl.Expr.Ident(savedFinallyStackCounterVariable)));
nestedTryCatchFinallyStatements.RemoveAt(nestedTryCatchFinallyStatements.Count - 1);
}
- Bpl.GotoCmd dispatchCmd = new Bpl.GotoCmd(Bpl.Token.NoToken, new Bpl.StringSeq("DispatchContinuation"));
+ Bpl.GotoCmd dispatchCmd = new Bpl.GotoCmd(Bpl.Token.NoToken, new Bpl.StringSeq(this.sink.FindOrCreateDispatchContinuationLabel(tryCatchFinallyStatement)));
Bpl.GotoCmd continuationCmd = new Bpl.GotoCmd(Bpl.Token.NoToken, new Bpl.StringSeq(this.sink.FindOrCreateContinuationLabel(tryCatchFinallyStatement)));
Bpl.IfCmd ifCmd = new Bpl.IfCmd(
Bpl.Token.NoToken,