本文整理汇总了C#中Pchp.CodeAnalysis.CodeGen.CodeGenerator.EmitCall方法的典型用法代码示例。如果您正苦于以下问题:C# CodeGenerator.EmitCall方法的具体用法?C# CodeGenerator.EmitCall怎么用?C# CodeGenerator.EmitCall使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Pchp.CodeAnalysis.CodeGen.CodeGenerator
的用法示例。
在下文中一共展示了CodeGenerator.EmitCall方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: EmitLoadTypeInfo
/// <summary>
/// Emits load of <c>PhpTypeInfo</c>.
/// </summary>
/// <param name="cg">Code generator instance.</param>
/// <param name="throwOnError">Emits PHP error in case type is not declared.</param>
/// <remarks>Emits <c>NULL</c> in case type is not declared.</remarks>
internal void EmitLoadTypeInfo(CodeGenerator cg, bool throwOnError = false)
{
Debug.Assert(cg != null);
Debug.Assert(throwOnError == false, "Not Implemented!"); // TODO: if (throwOnError) { if (DUP == null) PhpException.TypeNotDeclared(<typename>)
if (this.ResolvedType != null)
{
// CALL GetPhpTypeInfo<T>()
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Dynamic.GetPhpTypeInfo_T.Symbol.Construct(this.ResolvedType));
}
else
{
// CALL <ctx>.GetDeclaredType(<typename>)
cg.EmitLoadContext();
this.EmitClassName(cg);
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Context.GetDeclaredType_string);
}
}
示例2: EmitLoadStatics
/// <summary>
/// Emits load of statics holder.
/// </summary>
internal TypeSymbol EmitLoadStatics(CodeGenerator cg)
{
var statics = TryGetStatics();
if (statics != null && statics.GetMembers().OfType<IFieldSymbol>().Any())
{
// Template: <ctx>.GetStatics<_statics>()
cg.EmitLoadContext();
return cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.Context.GetStatic_T.Symbol.Construct(statics))
.Expect(statics);
}
return null;
}
示例3: 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)
//.........这里部分代码省略.........
示例4: EmitSub
/// <summary>
/// Emits subtraction operator.
/// </summary>
internal static TypeSymbol EmitSub(CodeGenerator cg, TypeSymbol xtype, BoundExpression right, TypeSymbol resultTypeOpt = null)
{
var il = cg.Builder;
xtype = cg.EmitConvertIntToLong(xtype); // int|bool -> int64
TypeSymbol ytype;
switch (xtype.SpecialType)
{
case SpecialType.System_Int64:
ytype = cg.EmitConvertIntToLong(cg.Emit(right));
if (ytype.SpecialType == SpecialType.System_Int64)
{
// i8 - i8 : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_long_long)
.Expect(cg.CoreTypes.PhpNumber);
}
else if (ytype.SpecialType == SpecialType.System_Double)
{
// i8 - r8 : r8
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_long_double)
.Expect(cg.CoreTypes.Double);
}
else if (ytype == cg.CoreTypes.PhpNumber)
{
// i8 - number : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_long_number)
.Expect(cg.CoreTypes.PhpNumber);
}
else
{
ytype = cg.EmitConvertToPhpValue(ytype, 0);
// i8 - value : value
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_long_value)
.Expect(cg.CoreTypes.PhpNumber);
}
case SpecialType.System_Double:
ytype = cg.EmitConvertNumberToDouble(right); // bool|int|long|number -> double
if (ytype.SpecialType == SpecialType.System_Double)
{
// r8 - r8 : r8
il.EmitOpCode(ILOpCode.Sub);
return cg.CoreTypes.Double;
}
throw new NotImplementedException($"Sub(double, {ytype.Name})");
default:
if (xtype == cg.CoreTypes.PhpNumber)
{
ytype = cg.EmitConvertIntToLong(cg.Emit(right));
if (ytype.SpecialType == SpecialType.System_Int64)
{
// number - i8 : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_number_long)
.Expect(cg.CoreTypes.PhpNumber);
}
else if (ytype.SpecialType == SpecialType.System_Double)
{
// number - r8 : double
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_number_double)
.Expect(SpecialType.System_Double);
}
else if (ytype == cg.CoreTypes.PhpNumber)
{
// number - number : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_number_number)
.Expect(cg.CoreTypes.PhpNumber);
}
throw new NotImplementedException($"Sub(PhpNumber, {ytype.Name})");
}
else if (xtype == cg.CoreTypes.PhpValue)
{
ytype = cg.EmitConvertIntToLong(cg.Emit(right));
if (ytype.SpecialType == SpecialType.System_Int64)
{
// value - i8 : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_value_long)
.Expect(cg.CoreTypes.PhpNumber);
}
else if (ytype.SpecialType == SpecialType.System_Double)
{
// value - r8 : r8
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_value_double)
.Expect(SpecialType.System_Double);
}
else if (ytype == cg.CoreTypes.PhpNumber)
{
// value - number : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_value_number)
.Expect(cg.CoreTypes.PhpNumber);
}
else if (ytype == cg.CoreTypes.PhpValue)
{
// value - value : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Subtract_value_value)
//.........这里部分代码省略.........
示例5: Emit
internal override TypeSymbol Emit(CodeGenerator cg)
{
cg.EmitConvert(this.Variable, cg.CoreTypes.PhpValue);
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.IsEmpty_PhpValue)
.Expect(SpecialType.System_Boolean);
}
示例6: if
void IBoundReference.EmitStore(CodeGenerator cg, TypeSymbol valueType)
{
// Template: array[index]
var isphparr = (this.Array.ResultType == cg.CoreTypes.PhpArray); // whether the target is instance of PhpArray, otherwise it is an IPhpArray and we have to use .callvirt
if (Access.IsWriteRef)
{
// PhpAlias
if (valueType != cg.CoreTypes.PhpAlias)
{
cg.EmitConvertToPhpValue(valueType, 0);
cg.Emit_PhpValue_MakeAlias();
}
// .SetItemAlias(key, alias) or .AddValue(PhpValue.Create(alias))
if (this.Index != null)
{
if (isphparr)
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpArray.SetItemAlias_IntStringKey_PhpAlias);
else
cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.IPhpArray.SetItemAlias_IntStringKey_PhpAlias);
}
else
{
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpValue.Create_PhpAlias);
if (isphparr)
cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.IPhpArray.AddValue_PhpValue);
else
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpArray.AddValue_PhpValue);
}
}
else if (Access.IsUnset)
{
if (this.Index == null)
throw new InvalidOperationException();
// .RemoveKey(key)
if (isphparr)
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpArray.RemoveKey_IntStringKey);
else
cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.IPhpArray.RemoveKey_IntStringKey);
}
else
{
Debug.Assert(Access.IsWrite);
cg.EmitConvertToPhpValue(valueType, 0);
// .SetItemValue(key, value) or .AddValue(value)
if (this.Index != null)
{
if (isphparr)
cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.IPhpArray.SetItemValue_IntStringKey_PhpValue);
else
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpArray.SetItemValue_IntStringKey_PhpValue);
}
else
{
if (isphparr)
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpArray.AddValue_PhpValue);
else
cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.IPhpArray.AddValue_PhpValue);
}
}
}
示例7: EmitArrayPrepare
void EmitArrayPrepare(CodeGenerator cg, InstanceCacheHolder instanceOpt)
{
InstanceCacheHolder.EmitInstance(instanceOpt, cg, Array);
if (Array.ResultType.IsOfType(cg.CoreTypes.IPhpArray))
{
// ok
}
else if (Array.ResultType == cg.CoreTypes.PhpValue)
{
// Convert.ToArray()
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.ToArray_PhpValue);
}
else if (Array.ResultType == cg.CoreTypes.String)
{
// new PhpString(string)
cg.EmitCall(ILOpCode.Newobj, cg.CoreMethods.Ctors.PhpString_string);
}
else if (Array.ResultType == cg.CoreTypes.Void)
{
// TODO: uninitialized value, report error
Debug.WriteLine("Use of uninitialized value.");
cg.EmitCall(ILOpCode.Newobj, cg.CoreMethods.Ctors.PhpString);
}
else
{
throw new NotImplementedException(); // TODO: emit convert as PhpArray
}
}
示例8: EmitCallsiteCall
internal override TypeSymbol EmitCallsiteCall(CodeGenerator cg)
{
if (_name.IsDirect)
{
return base.EmitCallsiteCall(cg);
}
else
{
Debug.Assert(_name.NameExpression != null);
// faster to emit PhpCallback.Invoke
// NameExpression.AsCallback().Invoke(Context, PhpValue[])
cg.EmitConvert(_name.NameExpression, cg.CoreTypes.IPhpCallable); // (IPhpCallable)Name
cg.EmitLoadContext(); // Context
cg.Emit_NewArray(cg.CoreTypes.PhpValue, _arguments.Select(a => a.Value).ToArray()); // PhpValue[]
return cg.EmitCall(ILOpCode.Callvirt, cg.CoreTypes.IPhpCallable.Symbol.LookupMember<MethodSymbol>("Invoke"));
}
}
示例9: EmitDirectCall
internal virtual TypeSymbol EmitDirectCall(CodeGenerator cg, ILOpCode opcode, MethodSymbol method)
{
// TODO: emit check the routine is declared
// <ctx>.AssertFunctionDeclared
var arguments = _arguments.Select(a => a.Value).ToImmutableArray();
return cg.EmitCall(opcode, method, this.Instance, arguments);
}
示例10:
void IBoundReference.EmitStore(CodeGenerator cg, TypeSymbol valueType)
{
var rtype = cg.CoreTypes.IPhpArray;
cg.EmitConvert(valueType, 0, rtype);
var tmp = cg.GetTemporaryLocal(rtype);
cg.Builder.EmitLocalStore(tmp);
// NOTE: since PHP7, variables are assigned from left to right
var vars = this.Variables;
for (int i = 0; i < vars.Length; i++)
{
var target = vars[i];
if (target == null)
continue;
var boundtarget = target.BindPlace(cg);
boundtarget.EmitStorePrepare(cg);
// LOAD IPhpArray.GetItemValue(IntStringKey{i})
cg.Builder.EmitLocalLoad(tmp);
cg.EmitIntStringKey(i);
var itemtype = cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.IPhpArray.GetItemValue_IntStringKey);
// STORE vars[i]
boundtarget.EmitStore(cg, itemtype);
}
//
cg.ReturnTemporaryLocal(tmp);
}
示例11: EmitBitNot
TypeSymbol EmitBitNot(CodeGenerator cg)
{
var il = cg.Builder;
var t = cg.Emit(this.Operand);
switch (t.SpecialType)
{
case SpecialType.System_Double:
case SpecialType.System_Int32:
// r8|i4 -> i8
il.EmitOpCode(ILOpCode.Conv_i8);
goto case SpecialType.System_Int64;
case SpecialType.System_Int64:
il.EmitOpCode(ILOpCode.Not); // ~i64 : i64
return cg.CoreTypes.Long;
case SpecialType.System_Boolean:
throw new NotImplementedException(); // Err
default:
if (t == cg.CoreTypes.PhpArray)
{
// ERR
}
// ~ PhpValue
cg.EmitConvert(t, Operand.TypeRefMask, cg.CoreTypes.PhpValue);
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.BitwiseNot_PhpValue);
}
}
示例12: EmitMinus
TypeSymbol EmitMinus(CodeGenerator cg)
{
// Template: 0L - Operand
var il = cg.Builder;
var t = cg.Emit(this.Operand);
switch (t.SpecialType)
{
case SpecialType.System_Double:
// -r8
il.EmitOpCode(ILOpCode.Neg);
return t;
case SpecialType.System_Int32:
// -(i8)i4
il.EmitOpCode(ILOpCode.Conv_i8); // i4 -> i8
il.EmitOpCode(ILOpCode.Neg); // result will fit into long for sure
return cg.CoreTypes.Long;
case SpecialType.System_Int64:
// PhpNumber.Minus(i8) : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Negation_long)
.Expect(cg.CoreTypes.PhpNumber);
default:
if (t != cg.CoreTypes.PhpNumber)
{
cg.EmitConvertToPhpNumber(t, 0);
}
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Negation)
.Expect(cg.CoreTypes.PhpNumber);
}
}
示例13: EmitPow
internal static TypeSymbol EmitPow(CodeGenerator cg, TypeSymbol xtype, FlowAnalysis.TypeRefMask xtype_hint, BoundExpression right)
{
var il = cg.Builder;
TypeSymbol ytype;
xtype = cg.EmitConvertIntToLong(xtype); // int|bool -> long
switch (xtype.SpecialType)
{
case SpecialType.System_Int64:
ytype = cg.EmitConvertIntToLong(cg.Emit(right)); // int|bool -> long
if (ytype.SpecialType == SpecialType.System_Int64)
{
// i8 ** i8 : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_long_long);
}
else if (ytype.SpecialType == SpecialType.System_Double)
{
// i8 ** r8 : r8
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_long_double);
}
else if (ytype == cg.CoreTypes.PhpNumber)
{
// i8 ** number : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_long_number);
}
// y -> PhpValue
cg.EmitConvert(ytype, right.TypeRefMask, cg.CoreTypes.PhpValue);
ytype = cg.CoreTypes.PhpValue;
// i8 ** value : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_long_value);
case SpecialType.System_Double:
ytype = cg.EmitConvertNumberToDouble(right); // int|bool|long|number -> double
if (ytype.SpecialType == SpecialType.System_Double)
{
// r8 ** r8 : r8
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_double_double);
}
// y -> PhpValue
cg.EmitConvert(ytype, right.TypeRefMask, cg.CoreTypes.PhpValue);
ytype = cg.CoreTypes.PhpValue;
// r8 ** value : r8
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_double_value);
default:
if (xtype == cg.CoreTypes.PhpNumber)
{
ytype = cg.EmitConvertIntToLong(cg.Emit(right)); // int|bool -> long
if (ytype == cg.CoreTypes.Double)
{
// number ** r8 : r8
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_number_double);
}
if (ytype.SpecialType == SpecialType.System_Int64)
{
// y -> number
ytype = cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Create_Long);
}
if (ytype == cg.CoreTypes.PhpNumber)
{
// number ** number : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_number_number);
}
// y -> PhpValue
ytype = cg.EmitConvertToPhpValue(ytype, right.TypeRefMask);
// number ** value : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_number_value);
}
// x -> PhpValue
xtype = cg.EmitConvertToPhpValue(xtype, xtype_hint);
cg.EmitConvert(right, cg.CoreTypes.PhpValue);
ytype = cg.CoreTypes.PhpValue;
// value ** value : number
return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Pow_value_value);
}
}
示例14: EmitAppend
static TypeSymbol EmitAppend(CodeGenerator cg, TypeSymbol xtype, BoundExpression y)
{
if (xtype == cg.CoreTypes.PhpString)
{
// x.Append(y); return x;
cg.Builder.EmitOpCode(ILOpCode.Dup);
cg.EmitConvert(y, cg.CoreTypes.String);
cg.EmitCall(ILOpCode.Callvirt, cg.CoreMethods.PhpString.Append_String);
//
return xtype;
}
else
{
// concat(x, y)
cg.EmitConvert(xtype, 0, cg.CoreTypes.String);
cg.EmitConvert(y, cg.CoreTypes.String);
return cg.EmitCall(ILOpCode.Newobj, cg.CoreMethods.Ctors.PhpString_string_string);
}
}
示例15: BuildCallsiteCreate
internal override void BuildCallsiteCreate(CodeGenerator cg, TypeSymbol returntype)
{
cg.Builder.EmitStringConstant(CallsiteName);
cg.Builder.EmitStringConstant(_nameOpt.HasValue ? _nameOpt.Value.ToString() : null);
cg.EmitLoadToken(returntype, null);
cg.Builder.EmitIntConstant(0);
cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Dynamic.CallBinderFactory_Function);
}