/// <summary> /// </summary> /// <param name="type"> /// </param> /// <param name="llvmWriter"> /// </param> public static void WriteUnboxMethod(this IType type, LlvmWriter llvmWriter) { var writer = llvmWriter.Output; var method = new SynthesizedUnboxMethod(type); writer.WriteLine("; Unbox method"); var opCode = OpCodePart.CreateNop; var normalType = type.ToNormal(); var isStruct = normalType.IsStructureType(); if (isStruct) { opCode.Result = new FullyDefinedReference("%agg.result", normalType); } llvmWriter.WriteMethodStart(method, null); llvmWriter.WriteLlvmLoad( opCode, type.ToClass(), new FullyDefinedReference(llvmWriter.GetThisName(), llvmWriter.ThisType), true, true); writer.WriteLine(string.Empty); var resultPresents = llvmWriter.WriteUnboxObject(opCode, normalType); writer.Write("ret "); if (!isStruct) { if (normalType.IsEnum) { normalType.GetEnumUnderlyingType().WriteTypePrefix(llvmWriter); } else { normalType.WriteTypePrefix(llvmWriter); } writer.Write(" "); if (resultPresents) { llvmWriter.WriteResult(opCode.Result); } else { writer.WriteLine(" undef"); } } else { writer.WriteLine(" void"); } llvmWriter.WriteMethodEnd(method, null); }
/// <summary> /// </summary> /// <param name="type"> /// </param> /// <param name="llvmWriter"> /// </param> /// <param name="opCode"> /// </param> public static void WriteCallUnboxObjectMethod(this IType type, LlvmWriter llvmWriter, OpCodePart opCode) { var writer = llvmWriter.Output; var method = new SynthesizedUnboxMethod(type); writer.WriteLine(string.Empty); writer.WriteLine("; call Unbox Object method"); llvmWriter.WriteCall(opCode, method, false, true, false, null, llvmWriter.tryScopes.Count > 0 ? llvmWriter.tryScopes.Peek() : null); }