public EmitConvertToString ( TypeSymbol from, TypeRefMask fromHint ) : void | ||
from | TypeSymbol | |
fromHint | TypeRefMask | |
Résultat | void |
/// <summary> /// Emits <c>+</c> operator suitable for actual operands. /// </summary> internal static TypeSymbol EmitAdd(CodeGenerator cg, TypeSymbol xtype, BoundExpression Right, TypeSymbol resultTypeOpt = null) { var il = cg.Builder; xtype = cg.EmitConvertIntToLong(xtype); // int|bool -> long // if (xtype == cg.CoreTypes.PhpNumber) { var ytype = cg.EmitConvertIntToLong(cg.Emit(Right)); // int|bool -> long if (ytype == cg.CoreTypes.PhpNumber) { // number + number : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_number_number) .Expect(cg.CoreTypes.PhpNumber); } else if (ytype.SpecialType == SpecialType.System_Double) { // number + r8 : r8 return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_number_double) .Expect(SpecialType.System_Double); } else if (ytype.SpecialType == SpecialType.System_Int64) { // number + long : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_number_long) .Expect(cg.CoreTypes.PhpNumber); } else if (ytype == cg.CoreTypes.PhpValue) { // number + value : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_number_value) .Expect(cg.CoreTypes.PhpNumber); } // throw new NotImplementedException($"Add(number, {ytype.Name})"); } else if (xtype.SpecialType == SpecialType.System_Double) { var ytype = cg.EmitConvertNumberToDouble(Right); // bool|int|long|number -> double if (ytype.SpecialType == SpecialType.System_Double) { // r8 + r8 : r8 il.EmitOpCode(ILOpCode.Add); return cg.CoreTypes.Double; } else if (ytype == cg.CoreTypes.PhpValue) { // r8 + value : r8 return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_double_value) .Expect(SpecialType.System_Double); } // throw new NotImplementedException($"Add(double, {ytype.Name})"); } else if (xtype.SpecialType == SpecialType.System_Int64) { var ytype = cg.EmitConvertIntToLong(cg.Emit(Right)); // int|bool -> long if (ytype.SpecialType == SpecialType.System_Int64) { if (resultTypeOpt != null) { if (resultTypeOpt.SpecialType == SpecialType.System_Int64) { // (long)(i8 + i8 : number) il.EmitOpCode(ILOpCode.Add); return cg.CoreTypes.Long; } } // i8 + i8 : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_long_long) .Expect(cg.CoreTypes.PhpNumber); } else if (ytype.SpecialType == SpecialType.System_Double) { // i8 + r8 : r8 return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_long_double) .Expect(SpecialType.System_Double); } else if (ytype == cg.CoreTypes.PhpNumber) { // i8 + number : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_long_number) .Expect(cg.CoreTypes.PhpNumber); } else if (ytype == cg.CoreTypes.PhpValue) { // i8 + value : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_long_value) .Expect(cg.CoreTypes.PhpNumber); } // throw new NotImplementedException($"Add(int64, {ytype.Name})"); } else if (xtype == cg.CoreTypes.PhpValue) { var ytype = cg.EmitConvertIntToLong(cg.Emit(Right)); // int|bool -> long // PhpString -> String if (ytype == cg.CoreTypes.PhpString) { cg.EmitConvertToString(ytype, 0); // continue ... } if (ytype.SpecialType == SpecialType.System_Int64) { // value + i8 : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_value_long) .Expect(cg.CoreTypes.PhpNumber); } else if (ytype.SpecialType == SpecialType.System_Double) { // value + r8 : r8 return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_value_double) .Expect(SpecialType.System_Double); } else if (ytype == cg.CoreTypes.String) { // value + string : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_value_string) .Expect(cg.CoreTypes.PhpNumber); } else if (ytype == cg.CoreTypes.PhpNumber) { // value + number : number return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_value_number) .Expect(cg.CoreTypes.PhpNumber); } else if (ytype == cg.CoreTypes.PhpValue) { // value + value : value return cg.EmitCall(ILOpCode.Call, cg.CoreMethods.PhpNumber.Add_value_value) .Expect(cg.CoreTypes.PhpValue); } // throw new NotImplementedException($"Add(PhpValue, {ytype.Name})"); } // throw new NotImplementedException($"Add({xtype.Name}, ...)"); }