// Emits the address of the expression, returning the write back if necessary
        //
        // For properties, we want to write back into the property if it's
        // passed byref.
        private WriteBack EmitAddressWriteBack(Expression node, Type type)
        {
            ExpressionStart startEmitted = EmitExpressionStart(node);

            WriteBack result = null;

            if (type == node.Type)
            {
                switch (node.NodeType)
                {
                case ExpressionType.MemberAccess:
                    result = AddressOfWriteBack((MemberExpression)node);
                    break;

                case ExpressionType.Index:
                    result = AddressOfWriteBack((IndexExpression)node);
                    break;
                }
            }
            if (result == null)
            {
                EmitAddress(node, type, false);
            }

            EmitExpressionEnd(startEmitted);

            return(result);
        }
 private void EmitExpressionEnd(ExpressionStart emitted)
 {
     if (emitted == ExpressionStart.LabelBlock)
     {
         PopLabelBlock(_labelBlock.Kind);
     }
 }
Esempio n. 3
0
 /// <inheritdoc />
 public override int GetHashCode()
 {
     unchecked
     {
         int hashCode = ExpressionStart.GetHashCode();
         hashCode = (hashCode * 397) ^ (TagCreationOptions.Any() ? TagCreationOptions.Select(f => f.GetHashCode()).Aggregate((e, f) => e ^ f) : 0);
         return(hashCode);
     }
 }
Esempio n. 4
0
        /// <inheritdoc />
        void IDocumentItem.SerializeXmlCore(XmlWriter writer)
        {
            writer.WriteStartElement(GetSerializedMarkerName(GetType()));
            writer.WriteAttributeString(nameof(ExpressionStart), ExpressionStart.ToFormatString() ?? string.Empty);
            SerializeXml(writer);
            writer.WriteOptions(TagCreationOptions, nameof(TagCreationOptions));

            writer.WriteEndElement();             //GetType().Name
        }
Esempio n. 5
0
        /// <inheritdoc />
        public bool Equals(DocumentItemBase other)
        {
            if (other is null)
            {
                return(false);
            }

            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            return(Children.SequenceEqual(other.Children) &&
                   (ExpressionStart.Equals(other.ExpressionStart)));
        }
Esempio n. 6
0
        /// <inheritdoc />
        public bool Equals(DocumentItemBase other)
        {
            if (ReferenceEquals(null, other))
            {
                return(false);
            }

            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            return(Children.SequenceEqual(other.Children) &&
                   (ReferenceEquals(ExpressionStart, other.ExpressionStart) ||
                    ExpressionStart.Equals(other.ExpressionStart)) &&
                   string.Equals(Kind, other.Kind));
        }
        // We don't want "ref" parameters to modify values of expressions
        // except where it would in IL: locals, args, fields, and array elements
        // (Unbox is an exception, it's intended to emit a ref to the orignal
        // boxed value)
        private void EmitAddress(Expression node, Type type, bool emitStart)
        {
            Debug.Assert(node != null);
            ExpressionStart startEmitted = emitStart ? EmitExpressionStart(node) : ExpressionStart.None;

            switch (node.NodeType)
            {
            default:
                EmitExpressionAddress(node, type);
                break;

            case ExpressionType.ArrayIndex:
                AddressOf((BinaryExpression)node, type);
                break;

            case ExpressionType.Parameter:
                AddressOf((ParameterExpression)node, type);
                break;

            case ExpressionType.MemberAccess:
                AddressOf((MemberExpression)node, type);
                break;

            case ExpressionType.Unbox:
                AddressOf((UnaryExpression)node, type);
                break;

            case ExpressionType.Call:
                AddressOf((MethodCallExpression)node, type);
                break;

            case ExpressionType.Index:
                AddressOf((IndexExpression)node, type);
                break;
            }

            if (emitStart)
            {
                EmitExpressionEnd(startEmitted);
            }
        }
Esempio n. 8
0
        /// <inheritdoc />
        public virtual bool Equals(DocumentItemBase other)
        {
            if (other is null)
            {
                return(false);
            }

            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            if (!ExpressionStart.Equals(other.ExpressionStart))
            {
                return(false);
            }
            if (Equals(TagCreationOptions, other.TagCreationOptions))
            {
                return(true);
            }

            return(TagCreationOptions?.SequenceEqual(other.TagCreationOptions) ?? false);
        }
        /// <summary>
        /// Emits an expression and discards the result.  For some nodes this emits
        /// more optimial code then EmitExpression/Pop
        /// </summary>
        private void EmitExpressionAsVoid(Expression node)
        {
            Debug.Assert(node != null);

            ExpressionStart startEmitted = EmitExpressionStart(node);

            switch (node.NodeType)
            {
            case ExpressionType.Assign:
                EmitAssign((BinaryExpression)node, EmitAs.Void);
                break;

            case ExpressionType.Block:
                Emit((BlockExpression)node, EmitAs.Void);
                break;

            case ExpressionType.Throw:
                EmitThrow((UnaryExpression)node, EmitAs.Void);
                break;

            case ExpressionType.Constant:
            case ExpressionType.Default:
            case ExpressionType.Parameter:
                // no-op
                break;

            default:
                EmitExpression(node, false);
                if (node.Type != typeof(void))
                {
                    _ilg.Emit(OpCodes.Pop);
                }
                break;
            }
            EmitExpressionEnd(startEmitted);
        }
 private void EmitExpressionEnd(ExpressionStart emitted) {
     if (emitted == ExpressionStart.LabelBlock) {
         PopLabelBlock(_labelBlock.Kind);
     }
 }
        private void EmitExpression(Expression node, bool emitStart)
        {
            Debug.Assert(node != null);

            ExpressionStart startEmitted = emitStart ? EmitExpressionStart(node) : ExpressionStart.None;

            switch (node.NodeType)
            {
                #region Generated Expression Compiler

            // *** BEGIN GENERATED CODE ***
            // generated by function: gen_compiler from: generate_tree.py

            case ExpressionType.Add:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.AddChecked:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.And:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.AndAlso:
                EmitAndAlsoBinaryExpression(node);
                break;

            case ExpressionType.ArrayLength:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.ArrayIndex:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Call:
                EmitMethodCallExpression(node);
                break;

            case ExpressionType.Coalesce:
                EmitCoalesceBinaryExpression(node);
                break;

            case ExpressionType.Conditional:
                EmitConditionalExpression(node);
                break;

            case ExpressionType.Constant:
                EmitConstantExpression(node);
                break;

            case ExpressionType.Convert:
                EmitConvertUnaryExpression(node);
                break;

            case ExpressionType.ConvertChecked:
                EmitConvertUnaryExpression(node);
                break;

            case ExpressionType.Divide:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Equal:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.ExclusiveOr:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.GreaterThan:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.GreaterThanOrEqual:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Invoke:
                EmitInvocationExpression(node);
                break;

            case ExpressionType.Lambda:
                EmitLambdaExpression(node);
                break;

            case ExpressionType.LeftShift:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.LessThan:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.LessThanOrEqual:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.ListInit:
                EmitListInitExpression(node);
                break;

            case ExpressionType.MemberAccess:
                EmitMemberExpression(node);
                break;

            case ExpressionType.MemberInit:
                EmitMemberInitExpression(node);
                break;

            case ExpressionType.Modulo:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Multiply:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.MultiplyChecked:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Negate:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.UnaryPlus:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.NegateChecked:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.New:
                EmitNewExpression(node);
                break;

            case ExpressionType.NewArrayInit:
                EmitNewArrayExpression(node);
                break;

            case ExpressionType.NewArrayBounds:
                EmitNewArrayExpression(node);
                break;

            case ExpressionType.Not:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.NotEqual:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Or:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.OrElse:
                EmitOrElseBinaryExpression(node);
                break;

            case ExpressionType.Parameter:
                EmitParameterExpression(node);
                break;

            case ExpressionType.Power:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Quote:
                EmitQuoteUnaryExpression(node);
                break;

            case ExpressionType.RightShift:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.Subtract:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.SubtractChecked:
                EmitBinaryExpression(node);
                break;

            case ExpressionType.TypeAs:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.TypeIs:
                EmitTypeBinaryExpression(node);
                break;

            case ExpressionType.Assign:
                EmitAssignBinaryExpression(node);
                break;

            case ExpressionType.Block:
                EmitBlockExpression(node);
                break;

            case ExpressionType.DebugInfo:
                EmitDebugInfoExpression(node);
                break;

            case ExpressionType.Decrement:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.Dynamic:
                EmitDynamicExpression(node);
                break;

            case ExpressionType.Default:
                EmitEmptyExpression(node);
                break;

            case ExpressionType.Extension:
                EmitExtensionExpression(node);
                break;

            case ExpressionType.Goto:
                EmitGotoExpression(node);
                break;

            case ExpressionType.Increment:
                EmitUnaryExpression(node);
                break;

            case ExpressionType.Index:
                EmitIndexExpression(node);
                break;

            case ExpressionType.Label:
                EmitLabelExpression(node);
                break;

            case ExpressionType.RuntimeVariables:
                EmitRuntimeVariablesExpression(node);
                break;

            case ExpressionType.Loop:
                EmitLoopExpression(node);
                break;

            case ExpressionType.Switch:
                EmitSwitchExpression(node);
                break;

            case ExpressionType.Throw:
                EmitThrowUnaryExpression(node);
                break;

            case ExpressionType.Try:
                EmitTryExpression(node);
                break;

            case ExpressionType.Unbox:
                EmitUnboxUnaryExpression(node);
                break;

                // *** END GENERATED CODE ***

                #endregion

            default:
                throw Assert.Unreachable;
            }

            if (emitStart)
            {
                EmitExpressionEnd(startEmitted);
            }
        }
Esempio n. 12
0
 public void GetObjectData(SerializationInfo info, StreamingContext context)
 {
     info.AddValue(nameof(ExpressionStart), ExpressionStart.ToFormatString());
     info.AddValue(nameof(TagCreationOptions), TagCreationOptions);
     SerializeBinaryCore(info, context);
 }