summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Rustan Leino <leino@microsoft.com>2011-06-21 16:10:23 -0700
committerGravatar Rustan Leino <leino@microsoft.com>2011-06-21 16:10:23 -0700
commitf3e3f93b28dc40622157b6c04d514092669aa610 (patch)
tree0e1d9a5a3cf1406cc26cce988d6dd2599179bb23
parenteb838d646d3e30688e729cedf44f3968979a0f5b (diff)
parentda900fd75d17b681eb5895daeceec3a0f35d90ce (diff)
Merge
-rw-r--r--BCT/BytecodeTranslator/ExpressionTraverser.cs25
-rw-r--r--BCT/BytecodeTranslator/MetadataTraverser.cs11
-rw-r--r--BCT/BytecodeTranslator/Sink.cs4
-rw-r--r--BCT/BytecodeTranslator/StatementTraverser.cs7
-rw-r--r--BCT/BytecodeTranslator/TraverserFactory.cs6
5 files changed, 42 insertions, 11 deletions
diff --git a/BCT/BytecodeTranslator/ExpressionTraverser.cs b/BCT/BytecodeTranslator/ExpressionTraverser.cs
index 7edd62bf..b53eccef 100644
--- a/BCT/BytecodeTranslator/ExpressionTraverser.cs
+++ b/BCT/BytecodeTranslator/ExpressionTraverser.cs
@@ -1155,6 +1155,7 @@ namespace BytecodeTranslator
/// If it isn't either of these short forms then emit the proper expression!
/// </summary>
public override void Visit(IConditional conditional) {
+ /*
#region Try and reconstruct And, Or, Not expressions
if (conditional.Type.TypeCode == PrimitiveTypeCode.Boolean) {
CompileTimeConstant ctc = conditional.ResultIfFalse as CompileTimeConstant;
@@ -1207,6 +1208,7 @@ namespace BytecodeTranslator
}
}
#endregion
+
#region Just translate it as an if-then-else expression
base.Visit(conditional);
var ifFalse = TranslatedExpressions.Pop();
@@ -1218,7 +1220,30 @@ namespace BytecodeTranslator
);
return;
#endregion
+ */
+
+ StatementTraverser thenStmtTraverser = this.StmtTraverser.factory.MakeStatementTraverser(this.sink, this.StmtTraverser.PdbReader, this.contractContext);
+ ExpressionTraverser thenExprTraverser = this.StmtTraverser.factory.MakeExpressionTraverser(this.sink, thenStmtTraverser, this.contractContext);
+ StatementTraverser elseStmtTraverser = this.StmtTraverser.factory.MakeStatementTraverser(this.sink, this.StmtTraverser.PdbReader, this.contractContext);
+ ExpressionTraverser elseExprTraverser = this.StmtTraverser.factory.MakeExpressionTraverser(this.sink, elseStmtTraverser, this.contractContext);
+ thenExprTraverser.Visit(conditional.ResultIfTrue);
+ elseExprTraverser.Visit(conditional.ResultIfFalse);
+
+ this.Visit(conditional.Condition);
+ Bpl.Expr conditionExpr = this.TranslatedExpressions.Pop();
+
+ Bpl.IfCmd ifcmd = new Bpl.IfCmd(conditional.Token(),
+ conditionExpr,
+ thenStmtTraverser.StmtBuilder.Collect(conditional.ResultIfTrue.Token()),
+ null,
+ elseStmtTraverser.StmtBuilder.Collect(conditional.ResultIfFalse.Token())
+ );
+
+ this.StmtTraverser.StmtBuilder.Add(ifcmd);
+ var ifFalse = elseExprTraverser.TranslatedExpressions.Pop();
+ var ifTrue = thenExprTraverser.TranslatedExpressions.Pop();
+ TranslatedExpressions.Push(new Bpl.NAryExpr(conditional.Token(), new Bpl.IfThenElse(conditional.Token()), new Bpl.ExprSeq(conditionExpr, ifTrue, ifFalse)));
}
private bool BooleanValueOfCompileTimeConstant(CompileTimeConstant ctc) {
diff --git a/BCT/BytecodeTranslator/MetadataTraverser.cs b/BCT/BytecodeTranslator/MetadataTraverser.cs
index 45206ddb..1298d4e1 100644
--- a/BCT/BytecodeTranslator/MetadataTraverser.cs
+++ b/BCT/BytecodeTranslator/MetadataTraverser.cs
@@ -104,7 +104,7 @@ namespace BytecodeTranslator {
var proc = this.sink.FindOrCreateProcedureForDefaultStructCtor(typeDefinition);
this.sink.BeginMethod(typeDefinition);
- var stmtTranslator = this.factory.MakeStatementTraverser(this.sink, this.PdbReader, false, new List<Tuple<ITryCatchFinallyStatement, StatementTraverser.TryCatchFinallyContext>>());
+ var stmtTranslator = this.factory.MakeStatementTraverser(this.sink, this.PdbReader, false);
var stmts = new List<IStatement>();
foreach (var f in typeDefinition.Fields) {
@@ -207,7 +207,7 @@ namespace BytecodeTranslator {
this.sink.BeginMethod(typeDefinition);
- var stmtTranslator = this.factory.MakeStatementTraverser(this.sink, this.PdbReader, false, new List<Tuple<ITryCatchFinallyStatement, StatementTraverser.TryCatchFinallyContext>>());
+ var stmtTranslator = this.factory.MakeStatementTraverser(this.sink, this.PdbReader, false);
var stmts = new List<IStatement>();
foreach (var f in typeDefinition.Fields) {
@@ -277,15 +277,10 @@ namespace BytecodeTranslator {
this.sink.BeginMethod(method);
var decl = procInfo.Decl;
var proc = decl as Bpl.Procedure;
-
- if (proc.Name.StartsWith("Microsoft.Devices.Camera.$get_AvailableResolutions")) {
-
- }
-
var formalMap = procInfo.FormalMap;
try {
- StatementTraverser stmtTraverser = this.factory.MakeStatementTraverser(this.sink, this.PdbReader, false, new List<Tuple<ITryCatchFinallyStatement, StatementTraverser.TryCatchFinallyContext>>());
+ StatementTraverser stmtTraverser = this.factory.MakeStatementTraverser(this.sink, this.PdbReader, false);
#region Add assignments from In-Params to local-Params
diff --git a/BCT/BytecodeTranslator/Sink.cs b/BCT/BytecodeTranslator/Sink.cs
index c19bc173..22daf7da 100644
--- a/BCT/BytecodeTranslator/Sink.cs
+++ b/BCT/BytecodeTranslator/Sink.cs
@@ -549,7 +549,7 @@ namespace BytecodeTranslator {
try {
foreach (IPrecondition pre in contract.Preconditions) {
- var stmtTraverser = this.factory.MakeStatementTraverser(this, null, true, new List<Tuple<ITryCatchFinallyStatement, StatementTraverser.TryCatchFinallyContext>>());
+ var stmtTraverser = this.factory.MakeStatementTraverser(this, null, true);
ExpressionTraverser exptravers = this.factory.MakeExpressionTraverser(this, stmtTraverser, true);
exptravers.Visit(pre.Condition); // TODO
// Todo: Deal with Descriptions
@@ -558,7 +558,7 @@ namespace BytecodeTranslator {
}
foreach (IPostcondition post in contract.Postconditions) {
- var stmtTraverser = this.factory.MakeStatementTraverser(this, null, true, new List<Tuple<ITryCatchFinallyStatement, StatementTraverser.TryCatchFinallyContext>>());
+ var stmtTraverser = this.factory.MakeStatementTraverser(this, null, true);
ExpressionTraverser exptravers = this.factory.MakeExpressionTraverser(this, stmtTraverser, true);
exptravers.Visit(post.Condition);
// Todo: Deal with Descriptions
diff --git a/BCT/BytecodeTranslator/StatementTraverser.cs b/BCT/BytecodeTranslator/StatementTraverser.cs
index 09b0b13b..31771f9c 100644
--- a/BCT/BytecodeTranslator/StatementTraverser.cs
+++ b/BCT/BytecodeTranslator/StatementTraverser.cs
@@ -54,6 +54,13 @@ namespace BytecodeTranslator
internal readonly Stack<IExpression> operandStack = new Stack<IExpression>();
#region Constructors
+ public StatementTraverser(Sink sink, PdbReader/*?*/ pdbReader, bool contractContext) {
+ this.sink = sink;
+ this.factory = sink.Factory;
+ PdbReader = pdbReader;
+ this.contractContext = contractContext;
+ this.nestedTryCatchFinallyStatements = new List<Tuple<ITryCatchFinallyStatement, TryCatchFinallyContext>>();
+ }
public StatementTraverser(Sink sink, PdbReader/*?*/ pdbReader, bool contractContext, List<Tuple<ITryCatchFinallyStatement,TryCatchFinallyContext>> nestedTryCatchFinallyStatements) {
this.sink = sink;
this.factory = sink.Factory;
diff --git a/BCT/BytecodeTranslator/TraverserFactory.cs b/BCT/BytecodeTranslator/TraverserFactory.cs
index 9fb51527..4685427f 100644
--- a/BCT/BytecodeTranslator/TraverserFactory.cs
+++ b/BCT/BytecodeTranslator/TraverserFactory.cs
@@ -24,7 +24,11 @@ namespace BytecodeTranslator {
{
return new MetadataTraverser(sink, sourceLocationProviders);
}
- public virtual StatementTraverser MakeStatementTraverser(Sink sink, PdbReader/*?*/ pdbReader, bool contractContext, List<Tuple<ITryCatchFinallyStatement,StatementTraverser.TryCatchFinallyContext>> nestedTryCatchFinallyStatements) {
+ public virtual StatementTraverser MakeStatementTraverser(Sink sink, PdbReader/*?*/ pdbReader, bool contractContext) {
+ return new StatementTraverser(sink, pdbReader, contractContext);
+ }
+ public virtual StatementTraverser MakeStatementTraverser(Sink sink, PdbReader/*?*/ pdbReader, bool contractContext,
+ List<Tuple<ITryCatchFinallyStatement,StatementTraverser.TryCatchFinallyContext>> nestedTryCatchFinallyStatements) {
return new StatementTraverser(sink, pdbReader, contractContext, nestedTryCatchFinallyStatements);
}
public virtual ExpressionTraverser MakeExpressionTraverser(Sink sink, StatementTraverser/*?*/ statementTraverser, bool contractContext) {