Ejemplo n.º 1
0
        public override BoundStatement CreateBlockPrologue(BoundBlock original, out Symbols.LocalSymbol synthesizedLocal)
        {
            var previous = base.CreateBlockPrologue(original, out synthesizedLocal);

            if (original.Syntax.Kind() == SyntaxKind.Block && !original.WasCompilerGenerated)
            {
                var oBspan = ((BlockSyntax)original.Syntax).OpenBraceToken.Span;
                return(new BoundSequencePointWithSpan(original.Syntax, previous, oBspan));
            }
            else if (previous != null)
            {
                return(new BoundSequencePoint(original.Syntax, previous));
            }

            return(null);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Return a node that is associated with open brace of the block. Ok to return null.
 /// </summary>
 public virtual BoundStatement CreateBlockPrologue(BoundBlock original, out Symbols.LocalSymbol synthesizedLocal)
 {
     synthesizedLocal = null;
     return(null);
 }
Ejemplo n.º 3
0
 internal abstract ConstantValue GetConstantValue(SyntaxNode node, LocalSymbol inProgress, DiagnosticBag diagnostics = null);
Ejemplo n.º 4
0
 internal override ConstantValue GetConstantValue(SyntaxNode node, LocalSymbol inProgress, DiagnosticBag diagnostics)
 {
     return(_originalVariable.GetConstantValue(node, inProgress, diagnostics));
 }
Ejemplo n.º 5
0
        internal override void GenerateMethodBody(TypeCompilationState compilationState, DiagnosticBag diagnostics)
        {
            SyntheticBoundNodeFactory F = new SyntheticBoundNodeFactory(this, this.GetNonNullSyntaxNode(), compilationState, diagnostics);

            F.CurrentFunction = this;

            try
            {
                LocalSymbol i        = F.SynthesizedLocal(F.SpecialType(SpecialType.System_Int32));
                LocalSymbol hashCode = F.SynthesizedLocal(F.SpecialType(SpecialType.System_UInt32));

                LabelSymbol again = F.GenerateLabel("again");
                LabelSymbol start = F.GenerateLabel("start");

                ParameterSymbol text = this.Parameters[0];

                //  This method should be kept consistent with ComputeStringHash

                //uint hashCode = 0;
                //if (text != null)
                //{
                //    hashCode = unchecked((uint)2166136261);

                //    int i = 0;
                //    goto start;

                //again:
                //    hashCode = (text[i] ^ hashCode) * 16777619;
                //    i = i + 1;

                //start:
                //    if (i < text.Length)
                //        goto again;

                //}
                //return hashCode;

                var body = F.Block(
                    ImmutableArray.Create <LocalSymbol>(hashCode, i),
                    F.If(
                        F.Binary(BinaryOperatorKind.ObjectNotEqual, F.SpecialType(SpecialType.System_Boolean),
                                 F.Parameter(text),
                                 F.Null(text.Type.TypeSymbol)),
                        F.Block(
                            F.Assignment(F.Local(hashCode), F.Literal((uint)2166136261)),
                            F.Assignment(F.Local(i), F.Literal(0)),
                            F.Goto(start),
                            F.Label(again),
                            F.Assignment(
                                F.Local(hashCode),
                                F.Binary(BinaryOperatorKind.Multiplication, hashCode.Type.TypeSymbol,
                                         F.Binary(BinaryOperatorKind.Xor, hashCode.Type.TypeSymbol,
                                                  F.Convert(hashCode.Type.TypeSymbol,
                                                            F.Call(
                                                                F.Parameter(text),
                                                                F.SpecialMethod(SpecialMember.core_String__item),
                                                                F.Local(i)),
                                                            Conversion.ImplicitNumeric),
                                                  F.Local(hashCode)),
                                         F.Literal(16777619))),
                            F.Assignment(
                                F.Local(i),
                                F.Binary(BinaryOperatorKind.Addition, i.Type.TypeSymbol,
                                         F.Local(i),
                                         F.Literal(1))),
                            F.Label(start),
                            F.If(
                                F.Binary(BinaryOperatorKind.LessThan, F.SpecialType(SpecialType.System_Boolean),
                                         F.Local(i),
                                         F.Call(F.Parameter(text), F.SpecialMethod(SpecialMember.core_String__size))),
                                F.Goto(again)))),
                    F.Return(F.Local(hashCode))
                    );

                // NOTE: we created this block in its most-lowered form, so analysis is unnecessary
                F.CloseMethod(body);
            }
            catch (SyntheticBoundNodeFactory.MissingPredefinedMember ex)
            {
                diagnostics.Add(ex.Diagnostic);
                F.CloseMethod(F.ThrowNull());
            }
        }
Ejemplo n.º 6
0
 internal override ConstantValue GetConstantValue(SyntaxNode node, LocalSymbol inProgress, DiagnosticBag diagnostics)
 {
     return(null);
 }
Ejemplo n.º 7
0
 public override BoundStatement CreateBlockPrologue(BoundBlock original, out Symbols.LocalSymbol synthesizedLocal)
 {
     return(Previous.CreateBlockPrologue(original, out synthesizedLocal));
 }