// 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); } }
/// <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); } }
/// <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 }
/// <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))); }
/// <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); } }
/// <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 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); } }
public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(nameof(ExpressionStart), ExpressionStart.ToFormatString()); info.AddValue(nameof(TagCreationOptions), TagCreationOptions); SerializeBinaryCore(info, context); }