本文整理汇总了C#中Jurassic.Compiler.ILGenerator.Subtract方法的典型用法代码示例。如果您正苦于以下问题:C# ILGenerator.Subtract方法的具体用法?C# ILGenerator.Subtract怎么用?C# ILGenerator.Subtract使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Jurassic.Compiler.ILGenerator
的用法示例。
在下文中一共展示了ILGenerator.Subtract方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GenerateCode
/// <summary>
/// Generates CIL for the expression.
/// </summary>
/// <param name="generator"> The generator to output the CIL to. </param>
/// <param name="optimizationInfo"> Information about any optimizations that should be performed. </param>
public override void GenerateCode(ILGenerator generator, OptimizationInfo optimizationInfo)
{
// If a return value is not expected, generate only the side-effects.
/*if (optimizationInfo.SuppressReturnValue == true)
{
this.GenerateSideEffects(generator, optimizationInfo);
return;
}*/
// Special case the addition operator.
if (this.OperatorType == OperatorType.Add)
{
GenerateAdd(generator, optimizationInfo);
return;
}
// Special case the instanceof operator.
if (this.OperatorType == OperatorType.InstanceOf)
{
GenerateInstanceOf(generator, optimizationInfo);
return;
}
// Special case the in operator.
if (this.OperatorType == OperatorType.In)
{
GenerateIn(generator, optimizationInfo);
return;
}
// Special case the relational operators.
if (this.OperatorType == OperatorType.LessThan ||
this.OperatorType == OperatorType.LessThanOrEqual ||
this.OperatorType == OperatorType.GreaterThan ||
this.OperatorType == OperatorType.GreaterThanOrEqual)
{
GenerateRelational(generator, optimizationInfo);
return;
}
// Special case the logical operators.
if (this.OperatorType == OperatorType.LogicalAnd ||
this.OperatorType == OperatorType.LogicalOr)
{
GenerateLogical(generator, optimizationInfo);
return;
}
// Load the left hand side onto the stack.
this.Left.GenerateCode(generator, optimizationInfo);
// Convert the left argument.
switch (this.OperatorType)
{
// Arithmetic operations.
case OperatorType.Subtract:
case OperatorType.Multiply:
case OperatorType.Divide:
case OperatorType.Modulo:
EmitConversion.ToNumber(generator, this.Left.ResultType);
break;
// Bitwise operations.
case OperatorType.BitwiseAnd:
case OperatorType.BitwiseOr:
case OperatorType.BitwiseXor:
case OperatorType.LeftShift:
case OperatorType.SignedRightShift:
case OperatorType.UnsignedRightShift:
EmitConversion.ToInt32(generator, this.Left.ResultType);
break;
// Equality operations.
case OperatorType.Equal:
case OperatorType.StrictlyEqual:
case OperatorType.NotEqual:
case OperatorType.StrictlyNotEqual:
EmitConversion.ToAny(generator, this.Left.ResultType);
break;
}
// Load the right hand side onto the stack.
this.Right.GenerateCode(generator, optimizationInfo);
// Convert the right argument.
switch (this.OperatorType)
{
// Arithmetic operations.
case OperatorType.Subtract:
case OperatorType.Multiply:
case OperatorType.Divide:
case OperatorType.Modulo:
EmitConversion.ToNumber(generator, this.Right.ResultType);
break;
//.........这里部分代码省略.........
示例2: GenerateIncrementOrDecrement
/// <summary>
/// Generates CIL for an increment or decrement expression.
/// </summary>
/// <param name="generator"> The generator to output the CIL to. </param>
/// <param name="optimizationInfo"> Information about any optimizations that should be performed. </param>
/// <param name="target"> The target to modify. </param>
/// <param name="postfix"> <c>true</c> if this is the postfix version of the operator;
/// <c>false</c> otherwise. </param>
/// <param name="increment"> <c>true</c> if this is the increment operator; <c>false</c> if
/// this is the decrement operator. </param>
private void GenerateIncrementOrDecrement(ILGenerator generator, OptimizationInfo optimizationInfo, IReferenceExpression target, bool postfix, bool increment)
{
// Note: increment and decrement can produce a number that is out of range if the
// target is of type Int32. The only time this should happen is for a loop variable
// where the range has been carefully checked to make sure an out of range condition
// cannot happen.
// Evaluate the left hand side only once.
target.GenerateReference(generator, optimizationInfo);
target.DuplicateReference(generator, optimizationInfo); // For the GenerateSet, later on.
// Get the target value.
target.GenerateGet(generator, optimizationInfo, true);
// Convert it to a number.
if (target.Type != PrimitiveType.Int32)
EmitConversion.ToNumber(generator, target.Type);
// If this is PostIncrement or PostDecrement, store the value so it can be returned later.
var result = generator.CreateTemporaryVariable(target.Type == PrimitiveType.Int32 ? PrimitiveType.Int32 : PrimitiveType.Number);
if (postfix == true)
{
generator.Duplicate();
generator.StoreVariable(result);
}
// Load the increment constant.
if (target.Type == PrimitiveType.Int32)
generator.LoadInt32(1);
else
generator.LoadDouble(1.0);
// Add or subtract the constant to the target value.
if (increment == true)
generator.Add();
else
generator.Subtract();
// If this is PreIncrement or PreDecrement, store the value so it can be returned later.
if (postfix == false)
{
generator.Duplicate();
generator.StoreVariable(result);
}
// Store the value.
target.GenerateSet(generator, optimizationInfo, target.Type == PrimitiveType.Int32 ? PrimitiveType.Int32 : PrimitiveType.Number, optimizationInfo.StrictMode);
// Restore the expression result.
generator.LoadVariable(result);
generator.ReleaseTemporaryVariable(result);
}
示例3: ToInteger
/// <summary>
/// Pops the value on the stack, converts it to an integer, then pushes the integer result
/// onto the stack.
/// </summary>
/// <param name="generator"> The IL generator. </param>
/// <param name="fromType"> The type to convert from. </param>
public static void ToInteger(ILGenerator generator, PrimitiveType fromType)
{
// Check that a conversion is actually necessary.
if (fromType == PrimitiveType.Int32 || fromType == PrimitiveType.UInt32 || fromType == PrimitiveType.Bool)
return;
switch (fromType)
{
case PrimitiveType.Undefined:
case PrimitiveType.Null:
// Converting from undefined or null produces 0.
generator.Pop();
generator.LoadInt32(0);
break;
case PrimitiveType.Number:
// Converting from a number produces the following:
// Any number between -2147483648 and +2147483647 -> itself
// Any number smaller than -2147483648 -> -2147483648
// Any number larger than +2147483647 -> +2147483647
// NaN -> 0
// bool isPositiveInfinity = input > 2147483647.0
var isPositiveInfinity = generator.CreateTemporaryVariable(typeof(bool));
generator.Duplicate();
generator.LoadDouble(2147483647.0);
generator.CompareGreaterThan();
generator.StoreVariable(isPositiveInfinity);
// bool notNaN = input == input
var notNaN = generator.CreateTemporaryVariable(typeof(bool));
generator.Duplicate();
generator.Duplicate();
generator.CompareEqual();
generator.StoreVariable(notNaN);
// input = (int)input
// Infinity -> -2147483648
// -Infinity -> -2147483648
// NaN -> -2147483648
generator.ConvertToInteger();
// input = input & -((int)notNaN)
generator.LoadVariable(notNaN);
generator.Negate();
generator.BitwiseAnd();
// input = input - (int)isPositiveInfinity
generator.LoadVariable(isPositiveInfinity);
generator.Subtract();
// The temporary variables are no longer needed.
generator.ReleaseTemporaryVariable(notNaN);
generator.ReleaseTemporaryVariable(isPositiveInfinity);
break;
case PrimitiveType.String:
case PrimitiveType.ConcatenatedString:
case PrimitiveType.Any:
case PrimitiveType.Object:
// Otherwise, fall back to calling TypeConverter.ToInteger()
generator.Call(ReflectionHelpers.TypeConverter_ToInteger);
break;
default:
throw new NotImplementedException(string.Format("Unsupported primitive type: {0}", fromType));
}
}