/// <summary> /// </summary> /// <param name="typeIn"> /// </param> /// <param name="llvmWriter"> /// </param> public static void WriteBoxMethod(this IType typeIn, LlvmWriter llvmWriter) { var writer = llvmWriter.Output; var classType = typeIn.ToClass(); var normalType = typeIn.ToNormal(); var method = new SynthesizedBoxMethod(classType); writer.WriteLine("; Box method"); var isStruct = classType.ToNormal().IsStructureType(); var opCode = OpCodePart.CreateNop; llvmWriter.WriteMethodStart(method, null); llvmWriter.WriteNewMethodBody(opCode, normalType, true); var newObjectResult = opCode.Result; opCode.Result = null; if (!isStruct) { llvmWriter.WriteLlvmLoad(opCode, normalType, new FullyDefinedReference(llvmWriter.GetArgVarName("value", 0), normalType)); writer.WriteLine(string.Empty); } llvmWriter.WriteBoxObject(opCode, classType, newObjectResult, true); writer.Write("ret "); classType.WriteTypePrefix(writer); writer.Write(" "); llvmWriter.WriteResult(opCode.Result); llvmWriter.WriteMethodEnd(method, null); }
/// <summary> /// </summary> /// <param name="type"> /// </param> /// <param name="llvmWriter"> /// </param> /// <param name="opCode"> /// </param> public static void WriteCallBoxObjectMethod(this IType type, LlvmWriter llvmWriter, OpCodePart opCode) { var writer = llvmWriter.Output; var method = new SynthesizedBoxMethod(type); writer.WriteLine(string.Empty); writer.WriteLine("; call Box Object method"); llvmWriter.WriteCall(opCode, method, false, false, false, null, llvmWriter.tryScopes.Count > 0 ? llvmWriter.tryScopes.Peek() : null); opCode.Result = opCode.Result.ToClassType(); }