From 2200db8988494dd7667300b8fb58e2d1dd2aa728 Mon Sep 17 00:00:00 2001 From: Mike Barnett Date: Mon, 14 Nov 2011 10:41:32 -0800 Subject: For some reason, these didn't get into the last commit. --- BCT/BytecodeTranslator/ExpressionTraverser.cs | 42 ++++++++++++++++++++------- BCT/BytecodeTranslator/StatementTraverser.cs | 2 +- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/BCT/BytecodeTranslator/ExpressionTraverser.cs b/BCT/BytecodeTranslator/ExpressionTraverser.cs index 8e5170b2..47c68419 100644 --- a/BCT/BytecodeTranslator/ExpressionTraverser.cs +++ b/BCT/BytecodeTranslator/ExpressionTraverser.cs @@ -33,6 +33,27 @@ namespace BytecodeTranslator private bool contractContext; + private Bpl.Expr FindOrCreateTypeReferenceInCodeContext(ITypeReference typeReference) { + return this.sink.FindOrCreateTypeReference(typeReference, true); + + IGenericTypeParameter gtp = typeReference as IGenericTypeParameter; + if (gtp != null) { + var selectorName = gtp.Name.Value; + selectorName = TranslationHelper.TurnStringIntoValidIdentifier(selectorName); + var typeName = TypeHelper.GetTypeName(gtp.DefiningType, NameFormattingOptions.DocumentationId); + typeName = TranslationHelper.TurnStringIntoValidIdentifier(typeName); + var funcName = String.Format("{0}#{1}", selectorName, typeName); + Bpl.IToken tok = Bpl.Token.NoToken; + var identExpr = Bpl.Expr.Ident(new Bpl.LocalVariable(tok, new Bpl.TypedIdent(tok, funcName, this.sink.Heap.TypeType))); + var funcCall = new Bpl.FunctionCall(identExpr); + var thisArg = new Bpl.IdentifierExpr(tok, this.sink.ThisVariable); + var dynType = this.sink.Heap.DynamicType(thisArg); + var nary = new Bpl.NAryExpr(Bpl.Token.NoToken, funcCall, new Bpl.ExprSeq(dynType)); + return nary; + } + return this.sink.FindOrCreateTypeReference(typeReference); + } + #region Constructors ///// @@ -473,7 +494,7 @@ namespace BytecodeTranslator new Bpl.AssumeCmd(tok, Bpl.Expr.Binary(Bpl.BinaryOperator.Opcode.Eq, this.sink.Heap.DynamicType(locExpr), - this.sink.FindOrCreateTypeReference(typ) + this.FindOrCreateTypeReferenceInCodeContext(typ) ) ) ); @@ -637,7 +658,7 @@ namespace BytecodeTranslator new Bpl.AssumeCmd(methodCallToken, Bpl.Expr.Binary(Bpl.BinaryOperator.Opcode.Eq, this.sink.Heap.DynamicType(thisExpr), - this.sink.FindOrCreateTypeReference(methodCall.MethodToCall.ResolvedMethod.ContainingTypeDefinition) + this.FindOrCreateTypeReferenceInCodeContext(methodCall.MethodToCall.ResolvedMethod.ContainingTypeDefinition) ) ) ); @@ -701,13 +722,13 @@ namespace BytecodeTranslator List consolidatedTypeArguments = new List(); Sink.GetConsolidatedTypeArguments(consolidatedTypeArguments, methodToCall.ContainingType); foreach (ITypeReference typeReference in consolidatedTypeArguments) { - inexpr.Add(sink.FindOrCreateTypeReference(typeReference)); + inexpr.Add(this.FindOrCreateTypeReferenceInCodeContext(typeReference)); } } IGenericMethodInstanceReference methodInstanceReference = methodToCall as IGenericMethodInstanceReference; if (methodInstanceReference != null) { foreach (ITypeReference typeReference in methodInstanceReference.GenericArguments) { - inexpr.Add(sink.FindOrCreateTypeReference(typeReference)); + inexpr.Add(this.FindOrCreateTypeReferenceInCodeContext(typeReference)); } } @@ -945,7 +966,7 @@ namespace BytecodeTranslator new Bpl.AssumeCmd(token, Bpl.Expr.Binary(Bpl.BinaryOperator.Opcode.Eq, this.sink.Heap.DynamicType(Bpl.Expr.Ident(a)), - this.sink.FindOrCreateTypeReference(createObjectInstance.Type) + this.FindOrCreateTypeReferenceInCodeContext(createObjectInstance.Type) ) ) ); @@ -953,6 +974,7 @@ namespace BytecodeTranslator TranslatedExpressions.Push(Bpl.Expr.Ident(a)); } + public override void TraverseChildren(ICreateArray createArrayInstance) { Bpl.IToken cloc = createArrayInstance.Token(); @@ -1002,13 +1024,13 @@ namespace BytecodeTranslator List consolidatedTypeArguments = new List(); Sink.GetConsolidatedTypeArguments(consolidatedTypeArguments, methodToCall.ContainingType); foreach (ITypeReference typeReference in consolidatedTypeArguments) { - typeParameterExprs.Add(sink.FindOrCreateTypeReference(typeReference)); + typeParameterExprs.Add(this.FindOrCreateTypeReferenceInCodeContext(typeReference)); } } IGenericMethodInstanceReference methodInstanceReference = methodToCall as IGenericMethodInstanceReference; if (methodInstanceReference != null) { foreach (ITypeReference typeReference in methodInstanceReference.GenericArguments) { - typeParameterExprs.Add(sink.FindOrCreateTypeReference(typeReference)); + typeParameterExprs.Add(this.FindOrCreateTypeReferenceInCodeContext(typeReference)); } } Bpl.Expr typeParameterExpr = @@ -1448,7 +1470,7 @@ namespace BytecodeTranslator public override void TraverseChildren(ICastIfPossible castIfPossible) { base.Traverse(castIfPossible.ValueToCast); var exp = TranslatedExpressions.Pop(); - var e = this.sink.FindOrCreateTypeReference(castIfPossible.TargetType); + var e = this.FindOrCreateTypeReferenceInCodeContext(castIfPossible.TargetType); var callAs = new Bpl.NAryExpr( castIfPossible.Token(), new Bpl.FunctionCall(this.sink.Heap.AsFunction), @@ -1458,7 +1480,7 @@ namespace BytecodeTranslator return; } public override void TraverseChildren(ICheckIfInstance checkIfInstance) { - var e = this.sink.FindOrCreateTypeReference(checkIfInstance.TypeToCheck); + var e = this.FindOrCreateTypeReferenceInCodeContext(checkIfInstance.TypeToCheck); //var callTypeOf = new Bpl.NAryExpr( // checkIfInstance.Token(), // new Bpl.FunctionCall(this.sink.Heap.TypeOfFunction), @@ -1644,7 +1666,7 @@ namespace BytecodeTranslator } public override void TraverseChildren(ITypeOf typeOf) { - var e = this.sink.FindOrCreateTypeReference(typeOf.TypeToGet); + var e = this.FindOrCreateTypeReferenceInCodeContext(typeOf.TypeToGet); var callTypeOf = new Bpl.NAryExpr( typeOf.Token(), new Bpl.FunctionCall(this.sink.Heap.TypeOfFunction), diff --git a/BCT/BytecodeTranslator/StatementTraverser.cs b/BCT/BytecodeTranslator/StatementTraverser.cs index 7a9340db..424064ff 100644 --- a/BCT/BytecodeTranslator/StatementTraverser.cs +++ b/BCT/BytecodeTranslator/StatementTraverser.cs @@ -512,7 +512,7 @@ namespace BytecodeTranslator List typeReferences = new List(); this.sink.nestedTryCatchFinallyStatements.Add(new Tuple(tryCatchFinallyStatement, Sink.TryCatchFinallyContext.InCatch)); foreach (ICatchClause catchClause in tryCatchFinallyStatement.CatchClauses) { - typeReferences.Insert(0, this.sink.FindOrCreateTypeReference(catchClause.ExceptionType)); + typeReferences.Insert(0, this.sink.FindOrCreateTypeReference(catchClause.ExceptionType, true)); StatementTraverser catchTraverser = this.factory.MakeStatementTraverser(this.sink, this.PdbReader, this.contractContext); if (catchClause.ExceptionContainer != Dummy.LocalVariable) { Bpl.Variable catchClauseVariable = this.sink.FindOrCreateLocalVariable(catchClause.ExceptionContainer); -- cgit v1.2.3