/// <summary> /// Create code to box the given source value into the given type. /// </summary> public static RLRange Box(this IRLBuilder builder, ISourceLocation sequencePoint, RegisterSpec source, XTypeReference type, DexTargetPackage targetPackage, IRegisterAllocator frame) { if (type.IsPrimitive) { if (type.IsByte()) { builder.Add(sequencePoint, RCode.Int_to_byte, source.Register, source.Register); } else if (type.IsUInt16()) { builder.Add(sequencePoint, RCode.Int_to_short, source.Register, source.Register); } // Call appropriate valueOf method var boxedType = type.Module.TypeSystem.Object; var r = frame.AllocateTemp(boxedType.GetReference(targetPackage)); var call = builder.Add(sequencePoint, RCode.Invoke_static, type.GetBoxValueOfMethod(), source.Registers); var last = builder.Add(sequencePoint, RCode.Move_result_object, r); return(new RLRange(call, last, r)); } if (type.IsGenericParameter) { var nop = builder.Add(sequencePoint, RCode.Nop); return(new RLRange(nop, source)); } XTypeDefinition typeDef; if (type.TryResolve(out typeDef) && (typeDef.IsEnum)) { // Call appropriate valueOf method /*var boxedType = type.Module.TypeSystem.Object; * var r = frame.AllocateTemp(boxedType.GetReference(target, nsConverter)); * var call = builder.Add(sequencePoint, RCode.Invoke_static, typeDef.GetEnumUnderlyingType().GetBoxValueOfMethod(), source.Registers); * var last = builder.Add(sequencePoint, RCode.Move_result_object, r); * return new RLRange(call, last, r);*/ } // Just cast var checkCast = builder.Add(sequencePoint, RCode.Check_cast, type.GetReference(targetPackage), source); return(new RLRange(checkCast, source)); }