本文整理汇总了C#中Pchp.CodeAnalysis.CodeGen.CodeGenerator.EmitLogicNegation方法的典型用法代码示例。如果您正苦于以下问题:C# CodeGenerator.EmitLogicNegation方法的具体用法?C# CodeGenerator.EmitLogicNegation怎么用?C# CodeGenerator.EmitLogicNegation使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Pchp.CodeAnalysis.CodeGen.CodeGenerator
的用法示例。
在下文中一共展示了CodeGenerator.EmitLogicNegation方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: EmitEquality
/// <summary>
/// Emits check for values equality.
/// Lefts <c>bool</c> on top of evaluation stack.
/// </summary>
internal static TypeSymbol EmitEquality(CodeGenerator cg, TypeSymbol xtype, BoundExpression right)
{
TypeSymbol ytype;
switch (xtype.SpecialType)
{
case SpecialType.System_Boolean:
// bool == y.ToBoolean()
cg.EmitConvert(right, cg.CoreTypes.Boolean);
cg.Builder.EmitOpCode(ILOpCode.Ceq);
return cg.CoreTypes.Boolean;
case SpecialType.System_Int32:
// i4 -> i8
cg.Builder.EmitOpCode(ILOpCode.Conv_i8);
goto case SpecialType.System_Int64;
case SpecialType.System_Int64:
ytype = cg.Emit(right);
//
if (ytype.SpecialType == SpecialType.System_Int32)
{
cg.Builder.EmitOpCode(ILOpCode.Conv_i8); // i4 -> i8
ytype = cg.CoreTypes.Long;
}
//
if (ytype.SpecialType == SpecialType.System_Int64)
{
// i8 == i8
cg.Builder.EmitOpCode(ILOpCode.Ceq);
return cg.CoreTypes.Boolean;
}
else if (ytype.SpecialType == SpecialType.System_Double)
{
// i8 == r8
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.Ceq_long_double)
.Expect(SpecialType.System_Boolean);
}
else if (ytype.SpecialType == SpecialType.System_Boolean)
{
// i8 == bool
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.Ceq_long_bool)
.Expect(SpecialType.System_Boolean);
}
else if (ytype.SpecialType == SpecialType.System_String)
{
// i8 == string
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.Ceq_long_string)
.Expect(SpecialType.System_Boolean);
}
// value
ytype = cg.EmitConvertToPhpValue(ytype, 0);
// compare(i8, value) == 0
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.Compare_long_value);
cg.EmitLogicNegation();
return cg.CoreTypes.Boolean;
case SpecialType.System_Double:
ytype = cg.EmitConvertNumberToDouble(right); // bool|long|int -> double
if (ytype.SpecialType == SpecialType.System_Double)
{
// r8 == r8
cg.Builder.EmitOpCode(ILOpCode.Ceq);
return cg.CoreTypes.Boolean;
}
else if (ytype.SpecialType == SpecialType.System_String)
{
// r8 == string
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.Ceq_double_string)
.Expect(SpecialType.System_Boolean);
}
// value
ytype = cg.EmitConvertToPhpValue(ytype, 0);
// compare(double, value) == 0
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.Compare_double_value);
cg.EmitLogicNegation();
return cg.CoreTypes.Boolean;
case SpecialType.System_String:
ytype = cg.Emit(right);
if (ytype.SpecialType == SpecialType.System_Int32)
//.........这里部分代码省略.........
示例2: Emit
//.........这里部分代码省略.........
#endregion
#region Boolean and Bitwise Operations
case Operations.And:
returned_type = EmitBinaryBooleanOperation(cg, true);
break;
case Operations.Or:
returned_type = EmitBinaryBooleanOperation(cg, false);
break;
case Operations.Xor:
returned_type = EmitBinaryXor(cg);
break;
case Operations.BitAnd:
returned_type = EmitBitAnd(cg, Left, Right);
break;
case Operations.BitOr:
returned_type = EmitBitOr(cg, Left, Right);
break;
case Operations.BitXor:
//returned_typecode = EmitBitOperation(node, codeGenerator, Operators.BitOp.Xor);
//break;
throw new NotImplementedException();
#endregion
#region Comparing Operations
case Operations.Equal:
returned_type = EmitEquality(cg);
break;
case Operations.NotEqual:
EmitEquality(cg);
cg.EmitLogicNegation();
returned_type = cg.CoreTypes.Boolean;
break;
case Operations.GreaterThan:
returned_type = EmitLtGt(cg, false);
break;
case Operations.LessThan:
returned_type = EmitLtGt(cg, true);
break;
case Operations.GreaterThanOrEqual:
// template: !(LessThan)
returned_type = EmitLtGt(cg, true);
cg.EmitLogicNegation();
break;
case Operations.LessThanOrEqual:
// template: !(GreaterThan)
returned_type = EmitLtGt(cg, false);
cg.EmitLogicNegation();
break;
case Operations.Identical:
// Left === Right
returned_type = EmitStrictEquality(cg);
break;
case Operations.NotIdentical:
// ! (Left === Right)
returned_type = EmitStrictEquality(cg);
cg.EmitLogicNegation();
break;
#endregion
default:
throw ExceptionUtilities.Unreachable;
}
//
switch (Access.Flags)
{
case AccessMask.Read:
// Result is read, do nothing.
Debug.Assert(returned_type.SpecialType != SpecialType.System_Void);
break;
case AccessMask.None:
// Result is not read, pop the result
cg.EmitPop(returned_type);
returned_type = cg.CoreTypes.Void;
break;
}
//
return returned_type;
}