private void EmitUserDefinedLiftedLogicalShortCircuit(EmitContext ec) { ILGenerator ig = ec.ig; bool flag = base.NodeType == ExpressionType.AndAlso; Label label = ig.DefineLabel(); Label label2 = ig.DefineLabel(); Label label3 = ig.DefineLabel(); Label label4 = ig.DefineLabel(); LocalBuilder local = ec.EmitStored(left); ec.EmitNullableHasValue(local); ig.Emit(OpCodes.Brfalse, (!flag) ? label : label3); ec.EmitNullableGetValueOrDefault(local); ec.EmitCall((!flag) ? GetTrueOperator() : GetFalseOperator()); ig.Emit(OpCodes.Brtrue, label2); ig.MarkLabel(label); LocalBuilder local2 = ec.EmitStored(right); ec.EmitNullableHasValue(local2); ig.Emit(OpCodes.Brfalse, label3); ec.EmitNullableGetValueOrDefault(local); ec.EmitNullableGetValueOrDefault(local2); ec.EmitCall(method); ec.EmitNullableNew(base.Type); ig.Emit(OpCodes.Br, label4); ig.MarkLabel(label2); ec.EmitLoad(local); ig.Emit(OpCodes.Br, label4); ig.MarkLabel(label3); LocalBuilder local3 = ig.DeclareLocal(base.Type); ec.EmitNullableInitialize(local3); ig.MarkLabel(label4); }
private void EmitUserDefinedLogicalShortCircuit(EmitContext ec) { ILGenerator ig = ec.ig; bool flag = base.NodeType == ExpressionType.AndAlso; Label label = ig.DefineLabel(); LocalBuilder local = ec.EmitStored(left); ec.EmitLoad(local); ig.Emit(OpCodes.Dup); ec.EmitCall((!flag) ? GetTrueOperator() : GetFalseOperator()); ig.Emit(OpCodes.Brtrue, label); ec.Emit(right); ec.EmitCall(method); ig.MarkLabel(label); }
void EmitLiftedToNullUserDefinedOperator(EmitContext ec) { var ig = ec.ig; var ret = ig.DefineLabel(); var done = ig.DefineLabel(); var left = ec.EmitStored(this.left); var right = ec.EmitStored(this.right); ec.EmitNullableHasValue(left); ec.EmitNullableHasValue(right); ig.Emit(OpCodes.And); ig.Emit(OpCodes.Brfalse, ret); ec.EmitNullableGetValueOrDefault(left); ec.EmitNullableGetValueOrDefault(right); ec.EmitCall(method); ec.EmitNullableNew(Type); ig.Emit(OpCodes.Br, done); ig.MarkLabel(ret); var temp = ig.DeclareLocal(Type); ec.EmitNullableInitialize(temp); ig.MarkLabel(done); }
void EmitUserDefinedLiftedOperator(EmitContext ec) { var local = ec.EmitStored(operand); ec.EmitNullableGetValue(local); ec.EmitCall(method); }
private void EmitUserDefinedOperator(EmitContext ec) { if (!IsLifted) { ExpressionType nodeType = base.NodeType; if (nodeType == ExpressionType.AndAlso || nodeType == ExpressionType.OrElse) { EmitUserDefinedLogicalShortCircuit(ec); return; } left.Emit(ec); right.Emit(ec); ec.EmitCall(method); } else if (IsLiftedToNull) { ExpressionType nodeType = base.NodeType; if (nodeType == ExpressionType.AndAlso || nodeType == ExpressionType.OrElse) { EmitUserDefinedLiftedLogicalShortCircuit(ec); } else { EmitLiftedToNullUserDefinedOperator(ec); } } else { EmitLiftedUserDefinedOperator(ec); } }
private void EmitUserDefinedOperator(EmitContext ec) { if (!this.IsLifted) { ExpressionType nodeType = base.NodeType; if (nodeType != ExpressionType.AndAlso && nodeType != ExpressionType.OrElse) { this.left.Emit(ec); this.right.Emit(ec); ec.EmitCall(this.method); } else { this.EmitUserDefinedLogicalShortCircuit(ec); } } else if (this.IsLiftedToNull) { ExpressionType nodeType = base.NodeType; if (nodeType != ExpressionType.AndAlso && nodeType != ExpressionType.OrElse) { this.EmitLiftedToNullUserDefinedOperator(ec); } else { this.EmitUserDefinedLiftedLogicalShortCircuit(ec); } } else { this.EmitLiftedUserDefinedOperator(ec); } }
private void EmitUserDefinedLiftedOperator(EmitContext ec) { LocalBuilder local = ec.EmitStored(this.operand); ec.EmitNullableGetValue(local); ec.EmitCall(this.method); }
void EmitUserDefinedLiftedLogicalShortCircuit(EmitContext ec) { var ig = ec.ig; var and = NodeType == ExpressionType.AndAlso; var left_is_null = ig.DefineLabel(); var ret_left = ig.DefineLabel(); var ret_null = ig.DefineLabel(); var done = ig.DefineLabel(); var left = ec.EmitStored(this.left); ec.EmitNullableHasValue(left); ig.Emit(OpCodes.Brfalse, and ? ret_null : left_is_null); ec.EmitNullableGetValueOrDefault(left); ec.EmitCall(and ? GetFalseOperator() : GetTrueOperator()); ig.Emit(OpCodes.Brtrue, ret_left); ig.MarkLabel(left_is_null); var right = ec.EmitStored(this.right); ec.EmitNullableHasValue(right); ig.Emit(OpCodes.Brfalse, ret_null); ec.EmitNullableGetValueOrDefault(left); ec.EmitNullableGetValueOrDefault(right); ec.EmitCall(method); ec.EmitNullableNew(Type); ig.Emit(OpCodes.Br, done); ig.MarkLabel(ret_left); ec.EmitLoad(left); ig.Emit(OpCodes.Br, done); ig.MarkLabel(ret_null); var ret = ig.DeclareLocal(Type); ec.EmitNullableInitialize(ret); ig.MarkLabel(done); }
private void EmitPropertyAccess(EmitContext ec, PropertyInfo property) { MethodInfo getMethod = property.GetGetMethod(true); if (!getMethod.IsStatic) { ec.EmitLoadSubject(this.expression); } ec.EmitCall(getMethod); }
void EmitUserDefinedLogicalShortCircuit(EmitContext ec) { var ig = ec.ig; var and = NodeType == ExpressionType.AndAlso; var done = ig.DefineLabel(); var left = ec.EmitStored(this.left); ec.EmitLoad(left); ig.Emit(OpCodes.Dup); ec.EmitCall(and ? GetFalseOperator() : GetTrueOperator()); ig.Emit(OpCodes.Brtrue, done); ec.Emit(this.right); ec.EmitCall(method); ig.MarkLabel(done); }
void EmitPropertyAccess(EmitContext ec, PropertyInfo property) { var getter = property.GetGetMethod(true); if (!getter.IsStatic) { ec.EmitLoadSubject(expression); } ec.EmitCall(getter); }
private void EmitPropertyAssignment(EmitContext ec, PropertyInfo property, LocalBuilder local) { MethodInfo setMethod = property.GetSetMethod(true); if (setMethod == null) { throw new InvalidOperationException(); } ec.EmitLoadSubject(local); this.expression.Emit(ec); ec.EmitCall(setMethod); }
private LocalBuilder EmitLoadProperty(EmitContext ec, PropertyInfo property) { MethodInfo getMethod = property.GetGetMethod(nonPublic: true); if (getMethod == null) { throw new NotSupportedException(); } LocalBuilder localBuilder = ec.ig.DeclareLocal(property.PropertyType); ec.EmitCall(getMethod); ec.ig.Emit(OpCodes.Stloc, localBuilder); return(localBuilder); }
private void EmitConvertFromNullable(EmitContext ec) { if (IsBoxing()) { ec.Emit(operand); EmitBox(ec); return; } ec.EmitCall(operand, operand.Type.GetMethod("get_Value")); if (operand.Type.GetNotNullableType() != base.Type) { EmitPrimitiveConversion(ec, operand.Type.GetNotNullableType(), base.Type); } }
LocalBuilder EmitLoadProperty(EmitContext ec, PropertyInfo property) { var getter = property.GetGetMethod(true); if (getter == null) { throw new NotSupportedException(); } var store = ec.ig.DeclareLocal(property.PropertyType); ec.EmitCall(getter); ec.ig.Emit(OpCodes.Stloc, store); return(store); }
void EmitLiftedUserDefinedOperator(EmitContext ec) { var ig = ec.ig; var ret_true = ig.DefineLabel(); var ret_false = ig.DefineLabel(); var done = ig.DefineLabel(); var left = ec.EmitStored(this.left); var right = ec.EmitStored(this.right); ec.EmitNullableHasValue(left); ec.EmitNullableHasValue(right); switch (NodeType) { case ExpressionType.Equal: ig.Emit(OpCodes.Bne_Un, ret_false); ec.EmitNullableHasValue(left); ig.Emit(OpCodes.Brfalse, ret_true); break; case ExpressionType.NotEqual: ig.Emit(OpCodes.Bne_Un, ret_true); ec.EmitNullableHasValue(left); ig.Emit(OpCodes.Brfalse, ret_false); break; default: ig.Emit(OpCodes.And); ig.Emit(OpCodes.Brfalse, ret_false); break; } ec.EmitNullableGetValueOrDefault(left); ec.EmitNullableGetValueOrDefault(right); ec.EmitCall(method); ig.Emit(OpCodes.Br, done); ig.MarkLabel(ret_true); ig.Emit(OpCodes.Ldc_I4_1); ig.Emit(OpCodes.Br, done); ig.MarkLabel(ret_false); ig.Emit(OpCodes.Ldc_I4_0); ig.Emit(OpCodes.Br, done); ig.MarkLabel(done); }
void EmitUserDefinedOperator(EmitContext ec) { if (!IsLifted) { ec.Emit(operand); ec.EmitCall(method); } else if (IsLiftedToNull) { EmitUserDefinedLiftedToNullOperator(ec); } else { EmitUserDefinedLiftedOperator(ec); } }
private void EmitUserDefinedOperator(EmitContext ec) { if (!this.IsLifted) { ec.Emit(this.operand); ec.EmitCall(this.method); } else if (this.IsLiftedToNull) { this.EmitUserDefinedLiftedToNullOperator(ec); } else { this.EmitUserDefinedLiftedOperator(ec); } }
private void EmitLiftedUserDefinedOperator(EmitContext ec) { ILGenerator ig = ec.ig; Label label = ig.DefineLabel(); Label label2 = ig.DefineLabel(); Label label3 = ig.DefineLabel(); LocalBuilder local = ec.EmitStored(this.left); LocalBuilder local2 = ec.EmitStored(this.right); ec.EmitNullableHasValue(local); ec.EmitNullableHasValue(local2); ExpressionType nodeType = base.NodeType; if (nodeType != ExpressionType.Equal) { if (nodeType != ExpressionType.NotEqual) { ig.Emit(OpCodes.And); ig.Emit(OpCodes.Brfalse, label2); } else { ig.Emit(OpCodes.Bne_Un, label); ec.EmitNullableHasValue(local); ig.Emit(OpCodes.Brfalse, label2); } } else { ig.Emit(OpCodes.Bne_Un, label2); ec.EmitNullableHasValue(local); ig.Emit(OpCodes.Brfalse, label); } ec.EmitNullableGetValueOrDefault(local); ec.EmitNullableGetValueOrDefault(local2); ec.EmitCall(this.method); ig.Emit(OpCodes.Br, label3); ig.MarkLabel(label); ig.Emit(OpCodes.Ldc_I4_1); ig.Emit(OpCodes.Br, label3); ig.MarkLabel(label2); ig.Emit(OpCodes.Ldc_I4_0); ig.Emit(OpCodes.Br, label3); ig.MarkLabel(label3); }
private void EmitUserDefinedLiftedToNullOperator(EmitContext ec) { ILGenerator ig = ec.ig; LocalBuilder local = ec.EmitStored(operand); Label label = ig.DefineLabel(); Label label2 = ig.DefineLabel(); ec.EmitNullableHasValue(local); ig.Emit(OpCodes.Brfalse, label); ec.EmitNullableGetValueOrDefault(local); ec.EmitCall(method); ec.EmitNullableNew(base.Type); ig.Emit(OpCodes.Br, label2); ig.MarkLabel(label); LocalBuilder local2 = ig.DeclareLocal(base.Type); ec.EmitNullableInitialize(local2); ig.MarkLabel(label2); }
private void EmitLiftedUserDefinedOperator(EmitContext ec) { ILGenerator ig = ec.ig; Label label = ig.DefineLabel(); Label label2 = ig.DefineLabel(); Label label3 = ig.DefineLabel(); LocalBuilder local = ec.EmitStored(left); LocalBuilder local2 = ec.EmitStored(right); ec.EmitNullableHasValue(local); ec.EmitNullableHasValue(local2); switch (base.NodeType) { case ExpressionType.Equal: ig.Emit(OpCodes.Bne_Un, label2); ec.EmitNullableHasValue(local); ig.Emit(OpCodes.Brfalse, label); break; case ExpressionType.NotEqual: ig.Emit(OpCodes.Bne_Un, label); ec.EmitNullableHasValue(local); ig.Emit(OpCodes.Brfalse, label2); break; default: ig.Emit(OpCodes.And); ig.Emit(OpCodes.Brfalse, label2); break; } ec.EmitNullableGetValueOrDefault(local); ec.EmitNullableGetValueOrDefault(local2); ec.EmitCall(method); ig.Emit(OpCodes.Br, label3); ig.MarkLabel(label); ig.Emit(OpCodes.Ldc_I4_1); ig.Emit(OpCodes.Br, label3); ig.MarkLabel(label2); ig.Emit(OpCodes.Ldc_I4_0); ig.Emit(OpCodes.Br, label3); ig.MarkLabel(label3); }
void EmitUserDefinedOperator(EmitContext ec) { if (!IsLifted) { switch (NodeType) { case ExpressionType.AndAlso: case ExpressionType.OrElse: EmitUserDefinedLogicalShortCircuit(ec); break; default: left.Emit(ec); right.Emit(ec); ec.EmitCall(method); break; } } else if (IsLiftedToNull) { switch (NodeType) { case ExpressionType.AndAlso: case ExpressionType.OrElse: EmitUserDefinedLiftedLogicalShortCircuit(ec); break; default: EmitLiftedToNullUserDefinedOperator(ec); break; } } else { EmitLiftedUserDefinedOperator(ec); } }
private void EmitUserDefinedLiftedToNullOperator(EmitContext ec) { var ig = ec.ig; var local = ec.EmitStored(operand); var ret = ig.DefineLabel(); var done = ig.DefineLabel(); ec.EmitNullableHasValue(local); ig.Emit(OpCodes.Brfalse, ret); ec.EmitNullableGetValueOrDefault(local); ec.EmitCall(method); ec.EmitNullableNew(Type); ig.Emit(OpCodes.Br, done); ig.MarkLabel(ret); var temp = ig.DeclareLocal(Type); ec.EmitNullableInitialize(temp); ig.MarkLabel(done); }
internal void Emit(EmitContext ec, LocalBuilder local) { ec.EmitCall(local, arguments, add_method); EmitPopIfNeeded(ec); }
internal override void Emit(EmitContext ec) { ec.EmitCall(expression, arguments, expression.Type.GetInvokeMethod()); }
internal override void Emit(EmitContext ec) { ec.EmitCall(this.obj, this.arguments, this.method); }
internal override void Emit(EmitContext ec) { ec.EmitCall(obj, arguments, method); }