public static bool TryGetCloneFunction(this FunctionModuleContext moduleContext, NIType valueType, out LLVMValueRef cloneFunction) { cloneFunction = default(LLVMValueRef); var functionBuilder = Signatures.CreateCopyType.DefineFunctionFromExisting(); functionBuilder.Name = "Clone"; functionBuilder.ReplaceGenericParameters(valueType, NIType.Unset); NIType signature = functionBuilder.CreateType(); NIType innerType; if (valueType == NITypes.String) { cloneFunction = moduleContext.FunctionImporter.GetImportedCommonFunction(CommonModules.StringCloneName); return(true); } if (valueType.TryDestructureSharedType(out innerType)) { cloneFunction = moduleContext.GetSpecializedFunctionWithSignature(signature, FunctionCompiler.BuildSharedCloneFunction); return(true); } if (valueType.TryDestructureVectorType(out innerType)) { cloneFunction = moduleContext.GetSpecializedFunctionWithSignature(signature, FunctionCompiler.BuildVectorCloneFunction); return(true); } if (valueType.TypeHasCloneTrait()) { throw new NotSupportedException("Clone function not found for type: " + valueType); } return(false); }
public static LLVMValueRef GetPromisePollFunction(this FunctionModuleContext moduleContext, NIType type) { NIType innerType; if (type.TryDestructureYieldPromiseType(out innerType)) { NIType signature = Signatures.PromisePollType.ReplaceGenericParameters(type, innerType, NIType.Unset); return(moduleContext.GetSpecializedFunctionWithSignature(signature, FunctionCompiler.BuildYieldPromisePollFunction)); } if (type.TryDestructureMethodCallPromiseType(out innerType)) { NIType signature = Signatures.PromisePollType.ReplaceGenericParameters(type, innerType, NIType.Unset); return(moduleContext.GetSpecializedFunctionWithSignature(signature, FunctionCompiler.BuildMethodCallPromisePollFunction)); } if (type.TryDestructureNotifierReaderPromiseType(out innerType)) { NIType signature = Signatures.PromisePollType.ReplaceGenericParameters(type, innerType.CreateOption(), NIType.Unset); return(moduleContext.GetSpecializedFunctionWithSignature(signature, FunctionCompiler.BuildNotifierReaderPromisePollFunction)); } throw new NotSupportedException("Cannot find poll function for type " + type); }
public static LLVMValueRef GetIteratorNextFunction(this FunctionModuleContext moduleContext, NIType iteratorType, NIType iteratorNextSignature) { if (iteratorType == DataTypes.RangeIteratorType) { return(moduleContext.FunctionImporter.GetImportedCommonFunction(CommonModules.RangeIteratorNextName)); } if (iteratorType.IsStringSplitIteratorType()) { return(moduleContext.FunctionImporter.GetImportedCommonFunction(CommonModules.StringSplitIteratorNextName)); } NIType innerType; if (iteratorType.TryDestructureSliceIteratorType(out innerType) || iteratorType.TryDestructureSliceMutableIteratorType(out innerType)) { return(moduleContext.GetSpecializedFunctionWithSignature( iteratorNextSignature, FunctionCompiler.CreateSliceIteratorNextFunction)); } throw new NotSupportedException("Missing Iterator::Next method for type " + iteratorType); }
internal static void CreateSliceIteratorNextFunction(FunctionModuleContext moduleContext, NIType iteratorNextSignature, LLVMValueRef sliceToIteratorFunction) { NIType elementType = iteratorNextSignature.GetGenericParameters().First().GetGenericParameters().First(); NIType sliceIndexSignature = Signatures.SliceIndexType.ReplaceGenericParameters(elementType, NIType.Unset, NIType.Unset, NIType.Unset); LLVMBasicBlockRef entryBlock = sliceToIteratorFunction.AppendBasicBlock("entry"); var builder = new IRBuilder(); builder.PositionBuilderAtEnd(entryBlock); // For now, just call SliceToIndex and increment the index LLVMValueRef sliceIteratorRef = sliceToIteratorFunction.GetParam(0u), optionItemPtr = sliceToIteratorFunction.GetParam(1u), sliceRefPtr = builder.CreateStructGEP(sliceIteratorRef, 0u, "sliceRefPtr"), sliceRef = builder.CreateLoad(sliceRefPtr, "sliceRef"), indexPtr = builder.CreateStructGEP(sliceIteratorRef, 1u, "indexPtr"), sliceIndexFunction = moduleContext.GetSpecializedFunctionWithSignature(sliceIndexSignature, CreateSliceIndexFunction); builder.CreateCall(sliceIndexFunction, new LLVMValueRef[] { indexPtr, sliceRef, optionItemPtr }, string.Empty); LLVMValueRef index = builder.CreateLoad(indexPtr, "index"), incrementedIndex = builder.CreateAdd(index, moduleContext.LLVMContext.AsLLVMValue(1), "incrementedIndex"); builder.CreateStore(incrementedIndex, indexPtr); builder.CreateRetVoid(); }