示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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();
        }