public TypeSymbol EmitConvertToPhpValue(TypeSymbol from, TypeRefMask fromHint) { // Nullable<T> -> HasValue ? T : NULL if (from.IsNullableType()) { from = EmitNullableCastToNull(from, false); // (HasValue ? Value : NULL) } var conv = DeclaringCompilation.ClassifyCommonConversion(from, CoreTypes.PhpValue.Symbol); if (conv.IsImplicit) { this.EmitConversion(conv, from, CoreTypes.PhpValue.Symbol); } else { // some conversion we did not implement as operator yet: if (from.IsReferenceType) { EmitCall(ILOpCode.Call, CoreMethods.PhpValue.FromClass_Object) .Expect(CoreTypes.PhpValue); } else if (from.SpecialType == SpecialType.System_Void) { // PhpValue.Void Emit_PhpValue_Void(); } else { throw ExceptionUtilities.NotImplementedException(this, $"{from.Name} -> PhpValue"); } } // return(CoreTypes.PhpValue); }