void SILGenFunction::emitProlog(AnyFunctionRef TheClosure, ArrayRef<ParameterList*> paramPatterns, Type resultType) { unsigned ArgNo = emitProlog(paramPatterns, resultType, TheClosure.getAsDeclContext()); // Emit the capture argument variables. These are placed last because they // become the first curry level of the SIL function. auto captureInfo = SGM.Types.getLoweredLocalCaptures(TheClosure); for (auto capture : captureInfo.getCaptures()) { if (capture.isDynamicSelfMetadata()) { auto selfMetatype = MetatypeType::get( captureInfo.getDynamicSelfType()->getSelfType(), MetatypeRepresentation::Thick) ->getCanonicalType(); SILType ty = SILType::getPrimitiveObjectType(selfMetatype); SILValue val = new (SGM.M) SILArgument(F.begin(), ty); (void) val; return; } emitCaptureArguments(*this, capture, ++ArgNo); } }
void SILGenFunction::emitProlog(AnyFunctionRef TheClosure, ArrayRef<ParameterList*> paramPatterns, Type resultType) { unsigned ArgNo = emitProlog(paramPatterns, resultType, TheClosure.getAsDeclContext()); // Emit the capture argument variables. These are placed last because they // become the first curry level of the SIL function. auto captureInfo = SGM.Types.getLoweredLocalCaptures(TheClosure); for (auto capture : captureInfo.getCaptures()) emitCaptureArguments(*this, capture, ++ArgNo); }
void SILGenFunction::emitProlog(AnyFunctionRef TheClosure, ArrayRef<ParameterList*> paramPatterns, Type resultType, bool throws) { uint16_t ArgNo = emitProlog(paramPatterns, resultType, TheClosure.getAsDeclContext(), throws); // Emit the capture argument variables. These are placed last because they // become the first curry level of the SIL function. auto captureInfo = SGM.Types.getLoweredLocalCaptures(TheClosure); for (auto capture : captureInfo.getCaptures()) { if (capture.isDynamicSelfMetadata()) { auto selfMetatype = MetatypeType::get( captureInfo.getDynamicSelfType()); SILType ty = getLoweredType(selfMetatype); SILValue val = F.begin()->createFunctionArgument(ty); (void) val; return; } emitCaptureArguments(*this, TheClosure, capture, ++ArgNo); } }
void SILGenFunction::emitProlog(AnyFunctionRef TheClosure, ParameterList *paramList, ParamDecl *selfParam, Type resultType, bool throws) { uint16_t ArgNo = emitProlog(paramList, selfParam, resultType, TheClosure.getAsDeclContext(), throws); // Emit an unreachable instruction if a parameter type is // uninhabited if (paramList) { for (auto *param : *paramList) { if (param->getType()->isStructurallyUninhabited()) { SILLocation unreachableLoc(param); unreachableLoc.markAsPrologue(); B.createUnreachable(unreachableLoc); break; } } } // Emit the capture argument variables. These are placed last because they // become the first curry level of the SIL function. auto captureInfo = SGM.Types.getLoweredLocalCaptures(TheClosure); for (auto capture : captureInfo.getCaptures()) { if (capture.isDynamicSelfMetadata()) { auto selfMetatype = MetatypeType::get( captureInfo.getDynamicSelfType()); SILType ty = getLoweredType(selfMetatype); SILValue val = F.begin()->createFunctionArgument(ty); (void) val; return; } emitCaptureArguments(*this, TheClosure, capture, ++ArgNo); } }