/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . kon an . llvm . objc export Ċ Ċ import Ġllvm .* Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . all Parameters Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . all Parameters Count Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . simple Functions Ċ import Ġorg . jetbrains . kotlin . backend . kon an .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . Class Layout Builder Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . Over ridden Function Info Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . all Over ridden Functions Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . is Abstract Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . llvm .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . llvm . objc . Obj C Code Generator Ċ import Ġorg . jetbrains . kotlin . backend . kon an . llvm . objc . Obj C Data Generator Ċ import Ġorg . jetbrains . kotlin . backend . kon an . objc export .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . serialization . resolve Fake Override Maybe Abstract Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . descriptors . kon an . Compiled K lib Module Origin Ċ import Ġorg . jetbrains . kotlin . descriptors . kon an . Current K lib Module Origin Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Ir Built Ins Over Descriptors Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Class Reference Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Var arg Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Constructor Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . is Nothing Ċ import Ġorg . jetbrains . kotlin . ir . types . is Unit Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . kon an . Foreign Exception Mode Ċ import Ġorg . jetbrains . kotlin . kon an . target . Apple Configur ables Ċ import Ġorg . jetbrains . kotlin . kon an . target . Link er Output Kind Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . utils . DFS Ċ Ċ internal Ġfun ĠType Bridge . make Nothing () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠReference Bridge , Ġis ĠBlock Pointer Bridge Ġ-> Ġk Null Int 8 Ptr ĊĠĠĠ Ġis ĠValueType Bridge Ġ-> ĠLLVM Const Null ( this . obj C ValueType . llvm Type ) !! Ċ } Ċ Ċ internal Ġclass ĠObj C Export Function Generation Context ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠObj C Export Function Generation Context Builder Ċ ) Ġ: ĠFunction Generation Context ( builder ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġobj C Export Code gen Ġ= Ġbuilder . obj C Export Code gen ĊĊĠĠĠ Ġ// ĠNote : Ġwe Ġcould Ġgenerate Ġsingle Ġ" ep ilog ue " Ġand Ġmake Ġall Ġ[ ret ] s Ġjust Ġbranch Ġto Ġit Ġ( like Ġ[ Default Function Generation Context ]), ĊĠĠĠ Ġ// Ġbut Ġthis Ġwould Ġbe Ġuseless Ġfor Ġmost Ġof Ġthe Ġusage s , Ġwhich Ġhave Ġonly Ġone Ġ[ ret ]. ĊĠĠĠ Ġ// ĠRem aining Ġusage s Ġcan Ġbe Ġoptimized Ġad Ġh oc . ĊĊĠĠĠ Ġoverride Ġfun Ġret ( value : ĠLLVM Value Ref ?): ĠLLVM Value Ref Ġ= Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġret Void () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġret Value ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġautore lease s Ġand Ġreturns Ġ[ value ]. ĊĠĠĠĠ Ġ* ĠIt Ġis Ġequivalent Ġto Ġ` ret ( autore lease ( value )) `, Ġbut Ġoptim izes Ġthe Ġautore lease Ġout Ġif Ġthe Ġcaller Ġis Ġprepared Ġfor Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġthe ĠC lang Ġdocumentation Ġand Ġthe ĠObj - C Ġruntime Ġsource Ġcode Ġfor Ġmore Ġdetails : ĊĠĠĠĠ Ġ* Ġhttps :// clang . llvm . org / docs / Automatic Reference Count ing . html # arc - runtime - objc - autore le aser eturn value ĊĠĠĠĠ Ġ* Ġhttps :// github . com / opensource - apple / objc 4 / blob / cd 5 e 6 2 a 5 5 9 7 ea 7 a 3 1 dc cef 0 8 9 3 1 7 abb 3 a 6 6 1 c 1 5 4 / runtime / objc - object . h # L 9 3 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġautore lease And Ret ( value : ĠLLVM Value Ref ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Return () ĊĠĠĠĠĠĠĠ Ġ// ĠNote : Ġit Ġis Ġimportant Ġto Ġmake Ġthis Ġcall Ġtail Ġ( otherwise Ġthe Ġelim ination Ġmagic Ġwon 't Ġwork ), ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġit Ġshould Ġgo Ġafter Ġother Ġ" ep ilog ue " Ġinstructions , Ġand Ġthat 's Ġwhy Ġwe Ġcouldn 't Ġjust Ġuse ĊĠĠĠĠĠĠĠ Ġ// Ġret ( autore lease ( value )) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcall ( obj C Export Code gen . objc Aut ore lease ReturnValue , ĠlistOf ( value )) ĊĠĠĠĠĠĠĠ ĠLLVM Set Tail Call ( result , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġraw Ret ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Returns () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing . ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠObj C Export Function Generation Context Builder ( ĊĠĠĠĠĠĠĠ Ġfunction Type : ĠLLVM Type Ref , ĊĠĠĠĠĠĠĠ Ġfunction Name : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġobj C Export Code gen : ĠObj C Export Code Generator Base Ċ ) Ġ: ĠFunction Generation Context Builder < Obj C Export Function Generation Context >( ĊĠĠĠĠĠĠĠ Ġfunction Type , ĊĠĠĠĠĠĠĠ Ġfunction Name , ĊĠĠĠĠĠĠĠ Ġobj C Export Code gen . codegen Ċ ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġbuild () Ġ= ĠObj C Export Function Generation Context ( this ) Ċ } Ċ Ċ internal Ġinline Ġfun ĠObj C Export Code Generator Base . function Generator ( ĊĠĠĠĠĠĠĠ Ġfunction Type : ĠLLVM Type Ref , ĊĠĠĠĠĠĠĠ Ġfunction Name : ĠString , ĊĠĠĠĠĠĠĠ Ġconfigure : ĠObj C Export Function Generation Context Builder . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠObj C Export Function Generation Context Builder Ġ= ĠObj C Export Function Generation Context Builder ( ĊĠĠĠĠĠĠĠ Ġfunction Type , ĊĠĠĠĠĠĠĠ Ġfunction Name , ĊĠĠĠĠĠĠĠ Ġthis Ċ ). apply ( configure ) Ċ Ċ internal Ġopen Ġclass ĠObj C Export Code Generator Base ( codegen : ĠCode Generator ) Ġ: ĠObj C Code Generator ( codegen ) Ġ{ ĊĠĠĠ Ġval Ġsymbols Ġget () Ġ= Ġcontext . ir . symbols ĊĠĠĠ Ġval Ġruntime Ġget () Ġ= Ġcodegen . runtime ĊĠĠĠ Ġval Ġstatic Data Ġget () Ġ= Ġcodegen . static Data ĊĊĠĠĠ Ġval Ġr tti Generator Ġ= ĠR TT IG ener ator ( context ) ĊĊĠĠĠ Ġprivate Ġval Ġobj c Terminate : ĠLLVM Value Ref Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . llvm . external Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" objc _ terminate ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Type ( void Type , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCurrent K lib Module Origin ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Function NoUn wind ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġr tti Generator . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġcurrently Ġb rid ges Ġdon 't Ġhave Ġany Ġcustom Ġ` landing pad ` s , ĊĠĠĠ Ġ// Ġso Ġit Ġis Ġcorrect Ġto Ġuse Ġ[ call At Function Scope ] Ġhere . ĊĠĠĠ Ġ// ĠHowever , Ġexception Ġhandling Ġprobably Ġshould Ġbe Ġref actored ĊĠĠĠ Ġ// Ġ( e . g . Ġmoved Ġfrom Ġ` Ir To Bit code . kt ` Ġto Ġ[ Function Generation Context ]). ĊĠĠĠ Ġfun ĠFunction Generation Context . call From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction : ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs : ĠList < LLVM Value Ref >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime : ĠL ifetime Ġ= ĠL ifetime . IR RE LE V ANT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Native : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠLLVM Value Ref Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġit Ġis Ġrequired Ġonly Ġfor ĠKotlin - to - Objective - C Ġb rid ges . ĊĠĠĠĠĠĠĠ Ġthis . forwarding Foreign Exceptions Terminated With Ġ= Ġobj c Terminate ĊĊĠĠĠĠĠĠĠ Ġval Ġswitch State To Native Ġ= Ġto Native Ġ&& Ġcontext . config . memory Model Ġ== ĠMemory Model . EXPERIMENT AL ĊĠĠĠĠĠĠĠ Ġval Ġexception Handler : ĠException Handler ĊĊĠĠĠĠĠĠĠ Ġif Ġ( switch State To Native ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Thread State ( Thread State . Native ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġthis Ġis Ġsub optimal . ĠWe Ġshould Ġfor bid ĠKotlin Ġexceptions Ġthrown Ġfrom Ġnative Ġcode , Ġand Ġuse Ġsimple Ġfatal Ġhandler Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler Ġ= Ġfiltering ExceptionHandler ( ExceptionHandler . Caller , ĠForeign Exception Mode . default , Ġswitch Thread State Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler Ġ= ĠException Handler . Caller ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcall ( function , Ġargs , Ġresult Lifetime , Ġexception Handler ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( switch State To Native ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Thread State ( Thread State . Runnable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFunction Generation Context . kotlin Reference ToLocal Obj C ( value : ĠLLVM Value Ref ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( context . llvm . Kotlin _ Obj C Export _ ref ToLocal Obj C , ĠlistOf ( value )) ĊĊĠĠĠ Ġfun ĠFunction Generation Context . kotlin Reference To Ret ained Obj C ( value : ĠLLVM Value Ref ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( context . llvm . Kotlin _ Obj C Export _ ref To Ret ained Obj C , ĠlistOf ( value )) ĊĊĠĠĠ Ġfun ĠFunction Generation Context . obj C Reference To Kotlin ( value : ĠLLVM Value Ref , Ġresult Lifetime : ĠL ifetime ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( context . llvm . Kotlin _ Obj C Export _ ref From Obj C , ĠlistOf ( value ), Ġresult Lifetime ) ĊĊĠĠĠ Ġprivate Ġval Ġblock To Kotlin Function Converter Cache Ġ= Ġmutable Map Of < Block Pointer Bridge , ĠLLVM Value Ref >() ĊĊĠĠĠ Ġinternal Ġfun Ġblock To Kotlin Function Converter ( bridge : ĠBlock Pointer Bridge ): ĠLLVM Value Ref Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock To Kotlin Function Converter Cache . get Or Put ( bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Block To Kotlin Function Converter ( bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġblock Generator Ġ= ĠBlock Generator ( this . codegen ) ĊĠĠĠ Ġprivate Ġval Ġfunction To Ret ained Block Converter Cache Ġ= Ġmutable Map Of < Block Pointer Bridge , ĠLLVM Value Ref >() ĊĊĠĠĠ Ġinternal Ġfun Ġkotlin Function To Ret ained Block Converter ( bridge : ĠBlock Pointer Bridge ): ĠLLVM Value Ref Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction To Ret ained Block Converter Cache . get Or Put ( bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Generator . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Convert Function To Ret ained Block ( bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠObj C Export Block Code Generator ( codegen : ĠCode Generator ) Ġ: ĠObj C Export Code Generator Base ( codegen ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMust Ġbe Ġgenerated Ġalong Ġwith Ġstdlib : ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠEnum er ates Ġ[ BuiltIn F ict it ious Function Ir Class Factory ] Ġbuilt Ġclasses , Ġwhich Ġmay Ġbe Ġincomplete Ġotherwise . ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 . ĠMod ifies Ġstdlib Ġglobal Ġinitial izers . ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . ĠDefines Ġruntime - declared Ġglobals . ĊĠĠĠĠĠĠĠ Ġrequire ( context . pro duced Ll vm Module Contains Std lib ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġemit Function Converters () ĊĠĠĠĠĠĠĠ Ġemit Block To Kotlin Function Converters () ĊĠĠĠĠĠĠĠ Ġdispose () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠObj C Export Code Generator ( ĊĠĠĠĠĠĠĠ Ġcodegen : ĠCode Generator , ĊĠĠĠĠĠĠĠ Ġval Ġn amer : ĠObj C Export N amer , ĊĠĠĠĠĠĠĠ Ġval Ġmapper : ĠObj C Export Mapper Ċ ) Ġ: ĠObj C Export Code Generator Base ( codegen ) Ġ{ ĊĊĠĠĠ Ġval Ġselectors To Define Ġ= Ġmutable Map Of < String , ĠMethod Bridge >() ĊĊĠĠĠ Ġval Ġexternal Global Initial izers Ġ= Ġmutable Map Of < LLVM Value Ref , ĠConst Value >() ĊĊĠĠĠ Ġinternal Ġval Ġcontinuation To Ret ained Completion Converter : ĠLLVM Value Ref Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Continuation To Ret ained Completion Converter ( block Generator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFunction Generation Context . gen SendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType : ĠLLVM Type Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver : ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswitch To Native : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠLLVM Value Ref , ĊĠĠĠ Ġ): ĠLLVM Value Ref Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġobj c Msg Send Type Ġ= Ġfunction Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( int 8 Type Ptr , Ġint 8 Type Ptr ) Ġ+ Ġargs . map Ġ{ Ġit . type Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcall From Bridge ( msg Sender ( objc Msg Send Type ), ĠlistOf ( receiver , Ġgen Selector ( selector )) Ġ+ Ġargs , Ġto Native Ġ= Ġswitch To Native ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFunction Generation Context . kotlin To Obj C ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type : ĠObj C ValueType ĊĠĠĠ Ġ): ĠLLVM Value Ref Ġ= Ġwhen Ġ( valueType ) Ġ{ ĊĠĠĠĠĠĠĠ ĠObj C ValueType . BOOL Ġ-> Ġz ext ( value , Ġint 8 Type ) Ġ// ĠTODO : Ġz ext Ġbehaviour Ġmay Ġbe Ġstrange Ġon Ġbit Ġtypes . ĊĊĠĠĠĠĠĠĠ ĠObj C ValueType . UN ICH AR , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . CHAR , ĠObj C ValueType . SHORT , ĠObj C ValueType . INT , ĠObj C ValueType . LONG _ LONG , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . UNSIGNED _ CHAR , ĠObj C ValueType . UNSIGNED _ SHORT , ĠObj C ValueType . UNSIGNED _ INT , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . UNSIGNED _ LONG _ LONG , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . FLOAT , ĠObj C ValueType . DOUBLE , ĠObj C ValueType . POINTER Ġ-> Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFunction Generation Context . obj C To Kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type : ĠObj C ValueType ĊĠĠĠ Ġ): ĠLLVM Value Ref Ġ= Ġwhen Ġ( valueType ) Ġ{ ĊĠĠĠĠĠĠĠ ĠObj C ValueType . BOOL Ġ-> Ġicmp Ne ( value , ĠInt 8 ( 0 ). llvm ) ĊĊĠĠĠĠĠĠĠ ĠObj C ValueType . UN ICH AR , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . CHAR , ĠObj C ValueType . SHORT , ĠObj C ValueType . INT , ĠObj C ValueType . LONG _ LONG , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . UNSIGNED _ CHAR , ĠObj C ValueType . UNSIGNED _ SHORT , ĠObj C ValueType . UNSIGNED _ INT , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . UNSIGNED _ LONG _ LONG , ĊĠĠĠĠĠĠĠ ĠObj C ValueType . FLOAT , ĠObj C ValueType . DOUBLE , ĠObj C ValueType . POINTER Ġ-> Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFunction Generation Context . obj C Block Pointer To Kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Bridge : ĠBlock Pointer Bridge , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime : ĠL ifetime ĊĠĠĠ Ġ) Ġ= Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock To Kotlin Function Converter ( type Bridge ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( value ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun ĠFunction Generation Context . kotlin Function To Obj C Block Pointer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Bridge : ĠBlock Pointer Bridge , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠLLVM Value Ref ĊĠĠĠ Ġ) Ġ= Ġcall From Bridge ( objc Aut ore lease , ĠlistOf ( kotlin Function To Ret ained Obj C Block Pointer ( type Bridge , Ġvalue ))) ĊĊĠĠĠ Ġinternal Ġfun ĠFunction Generation Context . kotlin Function To Ret ained Obj C Block Pointer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Bridge : ĠBlock Pointer Bridge , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠLLVM Value Ref ĊĠĠĠ Ġ) Ġ= Ġcall From Bridge ( kotlin Function To Ret ained Block Converter ( type Bridge ), ĠlistOf ( value )) ĊĊĠĠĠ Ġfun ĠFunction Generation Context . kotlin ToLocal Obj C ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Bridge : ĠType Bridge ĊĠĠĠ Ġ): ĠLLVM Value Ref Ġ= Ġif Ġ( LLVM TypeOf ( value ) Ġ== Ġvoid Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Bridge . make Nothing () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type Bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReference Bridge Ġ-> Ġkotlin Reference ToLocal Obj C ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Pointer Bridge Ġ-> Ġkotlin Function To Obj C Block Pointer ( type Bridge , Ġvalue ) Ġ// ĠTODO : Ġuse Ġstack - allocated Ġblock Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValueType Bridge Ġ-> Ġkotlin To Obj C ( value , Ġtype Bridge . obj C ValueType ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFunction Generation Context . obj C To Kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Bridge : ĠType Bridge , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime : ĠL ifetime ĊĠĠĠ Ġ): ĠLLVM Value Ref Ġ= Ġwhen Ġ( type Bridge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠReference Bridge Ġ-> Ġobj C Reference To Kotlin ( value , Ġresult Lifetime ) ĊĠĠĠĠĠĠĠ Ġis ĠBlock Pointer Bridge Ġ-> Ġobj C Block Pointer To Kotlin ( value , Ġtype Bridge , Ġresult Lifetime ) ĊĠĠĠĠĠĠĠ Ġis ĠValueType Bridge Ġ-> Ġobj C To Kotlin ( value , Ġtype Bridge . obj C ValueType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFunction Generation Context . init Runtime IfNeeded () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . needs Runtime Init Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun ĠFunction Generation Context . convert Kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen Value : Ġ( Lifetime ) Ġ-> ĠLLVM Value Ref , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Type : ĠIr Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type : ĠIr Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime : ĠL ifetime ĊĠĠĠ Ġ): ĠLLVM Value Ref Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġconversion Ġ= Ġsymbols . getType Conversion ( actual Type , Ġexpected Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġgen Value ( result Lifetime ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġgen Value ( Lifetime . ARGUMENT ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcall From Bridge ( conversion . owner . llvm Function , ĠlistOf ( value ), Ġresult Lifetime ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Type Adapters For Kotlin Types ( spec : ĠObj C Export Code Spec ?): ĠList < Obj C Type Adapter > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġspec ?. types . or Empty () Ġ+ Ġobj C Class For Any ĊĊĠĠĠĠĠĠĠ Ġval Ġall Reverse Adapters Ġ= Ġcreate Reverse Adapters ( types ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtypes . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreverse Adapters Ġ= Ġall Reverse Adapters . getValue ( it ). adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj C Class For Any Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Type Adapter ( it , ĠsuperClass Ġ= Ġnull , Ġreverse Adapters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Class For Kotlin Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġit . super Class Not Any Ġ?: Ġobj C Class For Any ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Generator . emit Empty Class ( it . binary Name , ĠsuperClass . binary Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġit Ġis Ġgenerated Ġonly Ġto Ġbe Ġvisible Ġfor Ġlinker . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMethods Ġwill Ġbe Ġadded Ġat Ġruntime . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Type Adapter ( it , ĠsuperClass , Ġreverse Adapters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Protocol For Kotlin Interface Ġ-> Ġcreate Type Adapter ( it , ĠsuperClass Ġ= Ġnull , Ġreverse Adapters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Type Adapters ( spec : ĠObj C Export Code Spec ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj C Type Adapters Ġ= Ġmutable ListOf < Obj C Type Adapter >() ĊĊĠĠĠĠĠĠĠ Ġobj C Type Adapters Ġ+= Ġgenerate Type Adapters For Kotlin Types ( spec ) ĊĊĠĠĠĠĠĠĠ Ġspec ?. files ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj C Type Adapters Ġ+= Ġcreate Type Adapter For File Class ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Generator . emit Empty Class ( it . binary Name , Ġn amer . kotlin Any Name . binary Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġemit Type Adapters ( obj C Type Adapters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġgenerate ( spec : ĠObj C Export Code Spec ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Type Adapters ( spec ) ĊĊĠĠĠĠĠĠĠ ĠNS Number Kind . values (). map NotNull Ġ{ Ġit . mapped Kotlin Class Id Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Generator . export Class ( nam er . number Box Name ( it ). binary Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata Generator . export Class ( nam er . mutable SetName . binary Name ) ĊĠĠĠĠĠĠĠ Ġdata Generator . export Class ( nam er . mutable Map Name . binary Name ) ĊĠĠĠĠĠĠĠ Ġdata Generator . export Class ( nam er . kotlin Any Name . binary Name ) ĊĊĠĠĠĠĠĠĠ Ġemit Special Classes Convert ions () ĊĊĠĠĠĠĠĠĠ Ġ// ĠReplace Ġruntime Ġglobal Ġwith Ġweak Ġlink age : ĊĠĠĠĠĠĠĠ Ġreplace External Weak Or Common Global ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kotlin _ Obj C Interop _ unique Prefix ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . static Data . c StringLiteral ( nam er . top Level Name Prefix ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . standard Ll vm Symbols Origin ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġemit Selectors Holder () ĊĊĠĠĠĠĠĠĠ Ġemit Static Initial izers () ĊĊĠĠĠĠĠĠĠ Ġemit Kt 4 2 2 5 4 Hint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Type Adapters ( obj C Type Adapters : ĠList < Obj C Type Adapter >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplaced Class Adapters Ġ= Ġmutable Map Of < String , ĠConst Pointer >() ĊĠĠĠĠĠĠĠ Ġval Ġplaced Interface Adapters Ġ= Ġmutable Map Of < String , ĠConst Pointer >() ĊĊĠĠĠĠĠĠĠ Ġobj C Type Adapters . forEach Ġ{ Ġadapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Adapter Ġ= Ġstatic Data . place Global ("", Ġadapter ). pointer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Class Ġ= Ġadapter . ir Class ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor To Adapter Ġ= Ġif Ġ( ir Class ?. is Interface Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaced Interface Adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠObjective - C Ġclass Ġfor ĠKotlin Ġclass Ġor Ġtop - level Ġdeclarations . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaced Class Adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor To Adapter [ adapter . obj C Name ] Ġ= Ġtype Adapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! context . llvm Module Specification . imports Kotlin Declarations From Other Shared Libraries ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Obj C Export TypeInfo ( ir Class , Ġtype Adapter Ġ= Ġtype Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOptimization : Ġavoid Ġgenerating Ġhuge Ġinitial izers ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandled Ġwith Ġ" Kotlin _ Obj C Export _ init Type Adapters " Ġbelow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġemit Sorted Adapters ( name To Adapter : ĠMap < String , ĠConst Pointer >, Ġprefix : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Adapters Ġ= Ġname To Adapter . toList (). sorted By Ġ{ Ġit . first Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sorted Adapters . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġsorted Adapters . first (). llvm Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Adapters Pointer Ġ= Ġstatic Data . place Global Const Array ("", Ġtype , Ġsorted Adapters ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġthis Ġglobals Ġreplace Ġruntime Ġglobals Ġwith Ġweak Ġlink age : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġcontext . standard Ll vm Symbols Origin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace External Weak Or Common Global ( prefix , Ġsorted Adapters Pointer , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace External Weak Or Common Global ("${ prefix } Num ", ĠInt 3 2 ( sorted Adapters . size ), Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġemit Sorted Adapters ( placed Class Adapters , Ġ" Kotlin _ Obj C Export _ sorted Class Adapters ") ĊĠĠĠĠĠĠĠ Ġemit Sorted Adapters ( placed Interface Adapters , Ġ" Kotlin _ Obj C Export _ sorted Protocol Adapters ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context . llvm Module Specification . imports Kotlin Declarations From Other Shared Libraries ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplace External Weak Or Common Global ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kotlin _ Obj C Export _ init Type Adapters ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt 1 ( true ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . standard Ll vm Symbols Origin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Static Initial izers () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( external Global Initial izers . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġgenerate Function No Runtime ( codegen , Ġfunction Type ( void Type , Ġfalse ), Ġ" init Obj C Export Globals ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Global Initial izers . forEach Ġ{ Ġ( global , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore ( value . llvm , Ġglobal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLLVM Set Link age ( initializer , ĠLL V ML ink age . LLVM Internal Link age ) ĊĊĠĠĠĠĠĠĠ Ġcontext . llvm . other Static Initial izers Ġ+= Ġinitializer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Kt 4 2 2 5 4 Hint () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( determine Link er Output ( context ) Ġ== ĠLink er Output Kind . STATIC _ LIBRARY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMight Ġbe Ġaffected Ġby Ġhttps :// yout rack . jetbrains . com / issue / KT - 4 2 2 5 4 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcode Ġbelow Ġgenerally Ġfollows Ġ[ replace External Weak Or Common Global ] Ġimplementation . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . llvm Module Specification . imports Kotlin Declarations From Other Object Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSo Ġthe Ġcompiler Ġuses Ġcaches . ĠIf Ġa Ġuser Ġis Ġlinking Ġtwo Ġsuch Ġstatic Ġframeworks Ġinto Ġa Ġsingle Ġbinary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġlinker Ġmight Ġfail Ġwith Ġa Ġlot Ġof Ġ" duplicate Ġsymbol " Ġerrors Ġdue Ġto ĠK T - 4 2 2 5 4 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdding Ġa Ġsimilar Ġsymbol Ġthat Ġwould Ġexplicitly Ġhint Ġto Ġtake Ġa Ġlook Ġat Ġthe ĠYou Track Ġissue Ġif Ġreported . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġfor Ġsome Ġreason Ġthis Ġsymbol Ġis Ġreported Ġas Ġthe Ġlast Ġone , Ġwhich Ġis Ġgood Ġfor Ġits Ġpurpose . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" See Ġhttps :// yout rack . jetbrains . com / issue / KT - 4 2 2 5 4 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġglobal Ġ= Ġstatic Data . place Global ( name , ĠInt 8 ( 0 ), Ġis Exported Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . llvm . used Globals Ġ+= Ġglobal . llvm Global ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLLVM Set Visibility ( global . llvm Global , ĠLLVM Visibility . LLVM Hidden Visibility ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġconsider Ġincluding Ġthis Ġinto ĠObj C Export Code Spec . ĊĠĠĠ Ġprivate Ġval Ġobj C Class For Any Ġ= ĠObj C Class For Kotlin Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn amer . kotlin Any Name . binary Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . any , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ= ĠlistOf (" equals ", Ġ" hashCode ", Ġ" toString "). map Ġ{ Ġname String Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠName . identifier ( name String ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Function Ġ= Ġsymbols . any . owner . simple Functions (). single Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġcontext . built Ins . any . un subst it uted Member Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Cont ributed Functions ( name , ĠNo Lookup Location . FROM _ BACKEND ). single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Method Ġ= Ġcreate Obj C Method Spec Base Method ( mapper , Ġn amer , Ġir Function . symbol , Ġdescriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Method For Kotlin Method ( base Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Methods Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsuperClass Not Any Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġemit Selectors Holder () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimp Type Ġ= Ġfunction Type ( void Type , Ġfalse , Ġint 8 Type Ptr , Ġint 8 Type Ptr ) ĊĠĠĠĠĠĠĠ Ġval Ġimp Ġ= Ġgenerate Function No Runtime ( codegen , Ġimp Type , Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġselectors To Define . map Ġ{ Ġ( selector , Ġbridge ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj C Data Generator . Method ( selector , Ġget Encoding ( bridge ), Ġconst Pointer ( imp )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Generator . emit Class ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ nam er . top Level Name Prefix } Kotlin Selectors Holder ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Name Ġ= Ġ" NSObject ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Methods Ġ= Ġmethods ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġimp Type Ġ= Ġpointer Type ( function Type ( void Type , Ġfalse )) ĊĊĠĠĠ Ġinternal Ġval Ġdirect Method Adapters Ġ= Ġmutable Map Of < Direct Adapter Request , ĠObj C To Kotlin Method Adapter >() ĊĊĠĠĠ Ġinternal Ġval Ġexception TypeInfo Arrays Ġ= Ġmutable Map Of < Ir Function , ĠConst Pointer >() ĊĠĠĠ Ġinternal Ġval Ġtype Info Arrays Ġ= Ġmutable Map Of < Set < Ir Class >, ĠConst Pointer >() ĊĊĠĠĠ Ġinner Ġclass ĠObj C To Kotlin Method Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoding : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimp : ĠConst Pointer ĊĠĠĠ Ġ) Ġ: ĠStruct ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġruntime . obj C To Kotlin Method Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . c StringLiteral ( selector ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . c StringLiteral ( encoding ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimp . bit cast ( imp Type ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinner Ġclass ĠKotlin To Obj C Method Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able Place : ĠClass Layout Builder . Interface Table Place , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Impl : ĠConst Pointer ĊĠĠĠ Ġ) Ġ: ĠStruct ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġruntime . kotlin To Obj C Method Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . c StringLiteral ( selector ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( it able Place . interface Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( it able Place . it able Size ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( it able Place . method Index ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( v table Index ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Impl ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinner Ġclass ĠObj C Type Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Class : ĠIr Class ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info : ĠConst Pointer ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table : ĠConst Pointer ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table Size : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able : ĠList < RT T IG ener ator . Interface Table Record >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able Size : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj C Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirect Adapters : ĠList < Obj C To Kotlin Method Adapter >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters : ĠList < Obj C To Kotlin Method Adapter >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual Adapters : ĠList < Obj C To Kotlin Method Adapter >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Adapters : ĠList < Kotlin To Obj C Method Adapter > ĊĠĠĠ Ġ) Ġ: ĠStruct ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġruntime . obj C Type Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( v table Size ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . place Global Const Array ("", Ġruntime . interface Table Record Type , Ġit able ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( it able Size ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . c StringLiteral ( obj C Name ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . place Global Const Array ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġruntime . obj C To Kotlin Method Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirect Adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( direct Adapters . size ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . place Global Const Array ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġruntime . obj C To Kotlin Method Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( class Adapters . size ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . place Global Const Array ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġruntime . obj C To Kotlin Method Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual Adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( virtual Adapters . size ), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Data . place Global Const Array ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġruntime . kotlin To Obj C Method Adapter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt 3 2 ( reverse Adapters . size ) ĊĠĠĠ Ġ) Ċ Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . replace External Weak Or Common Global ( ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġvalue : ĠConst Value , ĊĠĠĠĠĠĠĠ Ġorigin : ĠComp iled K lib Module Origin Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠTODO : ĠA Ġsimilar Ġmechanism Ġis Ġused Ġin Ġ` Ir To Bit code . override Runtime Global `. ĠConsider Ġmerging Ġthem . ĊĠĠĠ Ġif Ġ( context . llvm Module Specification . imports Kotlin Declarations From Other Shared Libraries ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġglobal Ġ= Ġcodegen . import Global ( name , Ġvalue . llvm Type , Ġorigin ) ĊĠĠĠĠĠĠĠ Ġexternal Global Initial izers [ global ] Ġ= Ġvalue ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . llvm Imports . add ( origin ) ĊĠĠĠĠĠĠĠ Ġval Ġglobal Ġ= Ġstatic Data . place Global ( name , Ġvalue , Ġis Exported Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context . llvm Module Specification . imports Kotlin Declarations From Other Object Files ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġactually Ġthis Ġis Ġrequired Ġonly Ġif Ġglobal 's Ġweak / common Ġdefinition Ġis Ġin Ġanother Ġobject Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġit Ġis Ġsimpler Ġto Ġdo Ġthis Ġfor Ġall Ġglobals , Ġconsidering Ġthat Ġall Ġusage s Ġcan 't Ġbe Ġremoved Ġby ĠD CE Ġanyway . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . llvm . used Globals Ġ+= Ġglobal . llvm Global ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLLVM Set Visibility ( global . llvm Global , ĠLLVM Visibility . LLVM Hidden Visibility ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSee Ġalso Ġ[ emit Kt 4 2 2 5 4 Hint ]. ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . set Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠ Ġir Class : ĠIr Class , ĊĠĠĠĠĠĠĠ ĠconvertTo Ret ained : ĠConst Pointer ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġobj C Class : ĠConst Pointer ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġtype Adapter : ĠConst Pointer ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġval Ġwritable TypeInfo Value Ġ= Ġbuild Writable TypeInfo Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠconvertTo Ret ained Ġ= ĠconvertTo Ret ained , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj C Class Ġ= Ġobj C Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Adapter Ġ= Ġtype Adapter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġif Ġ( codegen . is External ( ir Class )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNote : Ġthis Ġglobal Ġreplaces Ġthe Ġexternal Ġone Ġwith Ġcommon Ġlink age . ĊĠĠĠĠĠĠĠ Ġreplace External Weak Or Common Global ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . writable TypeInfo Symbol Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwritable TypeInfo Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . llvm Symbol Origin ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġset Own Writable TypeInfo ( ir Class , Ġwritable TypeInfo Value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator Base . set Own Writable TypeInfo ( ir Class : ĠIr Class , Ġwritable TypeInfo Value : ĠStruct ) Ġ{ ĊĠĠĠ Ġrequire (! codegen . is External ( ir Class )) ĊĠĠĠ Ġval Ġwrite able TypeInfo Global Ġ= Ġcontext . llvm Declarations . for Class ( ir Class ). writable TypeInfo Global !! ĊĠĠĠ Ġwrite able TypeInfo Global . set Link age ( LL V ML ink age . LLVM External Link age ) ĊĠĠĠ Ġwrite able TypeInfo Global . set Initializer ( writable TypeInfo Value ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator Base . build Writable TypeInfo Value ( ĊĠĠĠĠĠĠĠ ĠconvertTo Ret ained : ĠConst Pointer ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġobj C Class : ĠConst Pointer ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġtype Adapter : ĠConst Pointer ? Ġ= Ġnull Ċ ): ĠStruct Ġ{ ĊĠĠĠ Ġif Ġ( convertTo Ret ained Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( convertTo Ret ained . llvm Type Ġ== Ġpointer Type ( function Type ( int 8 Type Ptr , Ġfalse , Ġcodegen . k Obj Header Ptr ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġobj C Export Addition Ġ= ĠStruct ( runtime . type Info Obj C Export Addition , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠconvertTo Ret ained ?. bit cast ( int 8 Type Ptr ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj C Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Adapter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġwritable TypeInfo Type Ġ= Ġruntime . writable TypeInfo Type !! ĊĠĠĠ Ġreturn ĠStruct ( writable TypeInfo Type , Ġobj C Export Addition ) Ċ } Ċ Ċ private Ġval ĠObj C Export Code Generator . kotlin To Obj C FunctionType : ĠLLVM Type Ref ĊĠĠĠ Ġget () Ġ= Ġfunction Type ( int 8 Type Ptr , Ġfalse , Ġcodegen . k Obj Header Ptr ) Ċ Ċ private Ġval ĠObj C Export Code Generator Base . obj C To Kotlin FunctionType : ĠLLVM Type Ref ĊĠĠĠ Ġget () Ġ= Ġfunction Type ( codegen . k Obj Header Ptr , Ġfalse , Ġint 8 Type Ptr , Ġcodegen . k Obj Header Ptr Ptr ) Ċ Ċ private Ġfun ĠObj C Export Code Generator . emit Box Converters () Ġ{ ĊĠĠĠ Ġval Ġir Built Ins Ġ= Ġcontext . ir Built Ins ĊĊĠĠĠ Ġemit Box Converter ( ir Built Ins . boolean Class , ĠObj C ValueType . BOOL , Ġ" initWith Bool :") ĊĠĠĠ Ġemit Box Converter ( ir Built Ins . byte Class , ĠObj C ValueType . CHAR , Ġ" initWith Char :") ĊĠĠĠ Ġemit Box Converter ( ir Built Ins . short Class , ĠObj C ValueType . SHORT , Ġ" initWith Short :") ĊĠĠĠ Ġemit Box Converter ( ir Built Ins . int Class , ĠObj C ValueType . INT , Ġ" initWith Int :") ĊĠĠĠ Ġemit Box Converter ( ir Built Ins . long Class , ĠObj C ValueType . LONG _ LONG , Ġ" initWith Long Long :") ĊĠĠĠ Ġemit Box Converter ( symbols . u Byte !! , ĠObj C ValueType . UNSIGNED _ CHAR , Ġ" initWith Unsigned Char :") ĊĠĠĠ Ġemit Box Converter ( symbols . u Short !! , ĠObj C ValueType . UNSIGNED _ SHORT , Ġ" initWith Unsigned Short :") ĊĠĠĠ Ġemit Box Converter ( symbols . u Int !! , ĠObj C ValueType . UNSIGNED _ INT , Ġ" initWith Unsigned Int :") ĊĠĠĠ Ġemit Box Converter ( symbols . u Long !! , ĠObj C ValueType . UNSIGNED _ LONG _ LONG , Ġ" initWith Unsigned Long Long :") ĊĠĠĠ Ġemit Box Converter ( ir Built Ins . float Class , ĠObj C ValueType . FLOAT , Ġ" initWith Float :") ĊĠĠĠ Ġemit Box Converter ( ir Built Ins . double Class , ĠObj C ValueType . DOUBLE , Ġ" initWith Double :") Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . emit Box Converter ( ĊĠĠĠĠĠĠĠ Ġbox Class Symbol : ĠIr Class Symbol , ĊĠĠĠĠĠĠĠ Ġobj C ValueType : ĠObj C ValueType , ĊĠĠĠĠĠĠĠ Ġns Number Init Selector : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġval Ġbox Class Ġ= Ġbox Class Symbol . owner ĊĠĠĠ Ġval Ġname Ġ= Ġ"${ box Class . name } To NS Number " ĊĊĠĠĠ Ġval Ġconverter Ġ= Ġfunction Generator ( kotlin To Obj C FunctionType , Ġname ). generate Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun box Function Ġ= Ġcontext . getUn box Function ( box Class ). llvm Function ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Value Ġ= Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun box Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( param ( 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ifetime . IR RE LE V ANT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġkotlin To Obj C ( kotlin Value , Ġobj C ValueType ) ĊĊĠĠĠĠĠĠĠ Ġval Ġns Number Subclass Ġ= Ġgen Get Linked Class ( nam er . number Box Name ( box Class . class Id !! ). binary Name ) ĊĠĠĠĠĠĠĠ Ġval Ġswitch To Native Ġ= Ġfalse Ġ// ĠWe Ġconsider Ġthese Ġmethods Ġfast Ġenough . ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġcall From Bridge ( objc Alloc , ĠlistOf ( ns Number Subclass ), Ġto Native Ġ= Ġswitch To Native ) ĊĠĠĠĠĠĠĠ Ġret ( gen SendMessage ( int 8 Type Ptr , Ġinstance , Ġns Number Init Selector , Ġswitch To Native , Ġvalue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLLVM Set Link age ( converter , ĠLL V ML ink age . LL V MP rivate Link age ) ĊĠĠĠ Ġset Obj C Export TypeInfo ( box Class , Ġconst Pointer ( converter )) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . generate Continuation To Ret ained Completion Converter ( ĊĠĠĠĠĠĠĠ Ġblock Generator : ĠBlock Generator Ċ ): ĠLLVM Value Ref Ġ= Ġwith ( block Generator ) Ġ{ ĊĠĠĠ Ġgenerate Wrap Kotlin Object To Ret ained Block ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Type ( numberOf Parameters Ġ= Ġ 2 , Ġreturns Void Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Name Ġ= Ġ" convert Continuation ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Name Ġ= Ġ" invoke Completion " ĊĠĠĠ Ġ) Ġ{ Ġcontinuation , Ġarguments Ġ-> ĊĠĠĠĠĠĠĠ Ġcheck ( arguments . size Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcall From Bridge ( context . llvm . Kotlin _ Obj C Export _ resume Continuation , ĠlistOf ( continu ation ) Ġ+ Ġarguments ) ĊĠĠĠĠĠĠĠ Ġret ( null ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠTODO : Ġfind Ġout Ġwhat Ġto Ġuse Ġinstead Ġhere Ġand Ġin Ġthe Ġdependent Ġcode Ċ private Ġval ĠObj C Export Block Code Generator . mapped Function N Classes Ġget () Ġ= ĊĠĠĠ Ġ// Ġfailed Ġattempt Ġto Ġmigrate Ġto Ġdescriptor - less ĠIr Built Ins ĊĠĠĠ Ġ(( context . ir Built Ins Ġas ĠIr Built Ins Over Descriptors ). function Factory Ġas ĠBuilt In F ict it ious Function Ir Class Factory ). built Function N Classes ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . descriptor . is Mapped Function Class () Ġ} Ċ Ċ private Ġfun ĠObj C Export Block Code Generator . emit Function Converters () Ġ{ ĊĠĠĠ Ġrequire ( context . pro duced Ll vm Module Contains Std lib ) ĊĠĠĠ Ġmapped Function N Classes . forEach Ġ{ Ġfunction Class Ġ-> ĊĠĠĠĠĠĠĠ Ġval ĠconvertTo Ret ained Ġ= Ġkotlin Function To Ret ained Block Converter ( Block Pointer Bridge ( function Class . arity , Ġreturns Void Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠ Ġval Ġwritable TypeInfo Value Ġ= Ġbuild Writable TypeInfo Value ( convertTo Ret ained Ġ= Ġconst Pointer ( convertTo Ret ained )) ĊĠĠĠĠĠĠĠ Ġset Own Writable TypeInfo ( function Class . ir Class , Ġwritable TypeInfo Value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Block Code Generator . emit Block To Kotlin Function Converters () Ġ{ ĊĠĠĠ Ġrequire ( context . pro duced Ll vm Module Contains Std lib ) ĊĠĠĠ Ġval Ġfunction Classes By Ar ity Ġ= Ġmapped Function N Classes . associate By Ġ{ Ġit . arity Ġ} ĊĊĠĠĠ Ġval Ġar ity Limit Ġ= Ġ( function Classes By Ar ity . keys . max OrNull () Ġ?: Ġ- 1 ) Ġ+ Ġ 1 ĊĊĠĠĠ Ġval Ġconverter s Ġ= Ġ( 0 Ġuntil Ġar ity Limit ). map Ġ{ Ġar ity Ġ-> ĊĠĠĠĠĠĠĠ Ġfunction Classes By Ar ity [ arity ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbridge Ġ= ĠBlock Pointer Bridge ( numberOf Parameters Ġ= Ġar ity , Ġreturns Void Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Pointer ( block To Kotlin Function Converter ( bridge )) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠNull Pointer ( obj C To Kotlin FunctionType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġptr Ġ= Ġstatic Data . place Global Array ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Type ( obj C To Kotlin FunctionType ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverter s ĊĠĠĠ Ġ). pointer . getElement Ptr ( 0 ) ĊĊĠĠĠ Ġ// ĠNote : Ġdefining Ġglobals Ġdeclared Ġin Ġruntime . ĊĠĠĠ Ġstatic Data . place Global (" Kotlin _ Obj C Export _ block To Function Converters ", Ġptr , Ġis Exported Ġ= Ġtrue ) ĊĠĠĠ Ġstatic Data . place Global (" Kotlin _ Obj C Export _ block To Function Converters _ size ", ĠInt 3 2 ( arity Limit ), Ġis Exported Ġ= Ġtrue ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . emit Special Classes Convert ions () Ġ{ ĊĠĠĠ Ġset Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . string . owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Pointer ( context . llvm . Kotlin _ Obj C Export _ Create Ret ained NSString From K String ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġemit Collection Converters () ĊĊĠĠĠ Ġemit Box Converters () Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . emit Collection Converters () Ġ{ ĊĊĠĠĠ Ġfun Ġimport Converter ( name : ĠString ): ĠConst Pointer Ġ= Ġconst Pointer ( context . llvm . external Function ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin To Obj C FunctionType , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrent K lib Module Origin ĊĠĠĠ Ġ)) ĊĊĠĠĠ Ġset Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . list . owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Converter (" Kotlin _ Interop _ Create Ret ained NSArray From K List ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġset Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . mutable List . owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Converter (" Kotlin _ Interop _ Create Ret ained NS Mutable Array From K List ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġset Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . set . owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Converter (" Kotlin _ Interop _ Create Ret ained NS Set From K Set ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġset Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . mutable Set . owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Converter (" Kotlin _ Interop _ Create Ret ained Kotlin Mutable Set From K Set ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġset Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . map . owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Converter (" Kotlin _ Interop _ Create Ret ained NSDictionary From K Map ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġset Obj C Export TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . mutable Map . owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Converter (" Kotlin _ Interop _ Create Ret ained Kotlin Mutable Dictionary From K Map ") ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Function Generation Context Builder . setup Bridge Debug Info () Ġ{ ĊĠĠĠ Ġval Ġlocation Ġ= Ġsetup Bridge Debug Info ( this . obj C Export Code gen . context , Ġfunction ) ĊĠĠĠ Ġstart Location Ġ= Ġlocation ĊĠĠĠ Ġend Location Ġ= Ġlocation Ċ } Ċ Ċ private Ġinline Ġfun ĠObj C Export Code Generator . generate Obj C Imp By ( ĊĠĠĠĠĠĠĠ Ġmethod Bridge : ĠMethod Bridge , ĊĠĠĠĠĠĠĠ Ġdebug Info : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġgen Body : ĠObj C Export Function Generation Context . () Ġ-> ĠUnit Ċ ): ĠLLVM Value Ref Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġfunction Generator ( obj C FunctionType ( context , Ġmethod Bridge ), Ġ" objc 2 kotlin ") Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setup Bridge Debug Info () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġswitch To Runnable Ġ= Ġtrue ĊĠĠĠ Ġ}. generate Ġ{ ĊĠĠĠĠĠĠĠ Ġgen Body () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLLVM Set Link age ( result , ĠLL V ML ink age . LLVM Internal Link age ) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . generate Abstract Obj C Imp ( method Bridge : ĠMethod Bridge ): ĠLLVM Value Ref Ġ= ĊĠĠĠĠĠĠĠ Ġgenerate Obj C Imp By ( method Bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . llvm . Kotlin _ Obj C Export _ Abstract Method Called , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( param ( 0 ), Ġparam ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable () ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun ĠObj C Export Code Generator . generate Obj C Imp ( ĊĠĠĠĠĠĠĠ Ġtarget : ĠIr Function ?, ĊĠĠĠĠĠĠĠ Ġbase Method : ĠIr Function , ĊĠĠĠĠĠĠĠ Ġmethod Bridge : ĠMethod Bridge , ĊĠĠĠĠĠĠĠ Ġis Virtual : ĠBoolean Ġ= Ġfalse Ċ ) Ġ= Ġif Ġ( target Ġ== Ġnull ) Ġ{ ĊĠĠĠ Ġgenerate Abstract Obj C Imp ( method Bridge ) Ċ } Ġelse Ġ{ ĊĠĠĠ Ġgenerate Obj C Imp ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Bridge , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Direct Ġ= Ġ! is Virtual , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Method Ġ= Ġbase Method ĊĠĠĠ Ġ) Ġ{ Ġargs , Ġresult Lifetime , Ġexception Handler Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġllvm Target Ġ= Ġif Ġ(! is Virtual ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . llvm Function ( target ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Virtual Impl ( args . first (), Ġtarget ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall ( llvm Target , Ġargs , Ġresult Lifetime , Ġexception Handler ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . generate Obj C Imp ( ĊĠĠĠĠĠĠĠ Ġmethod Bridge : ĠMethod Bridge , ĊĠĠĠĠĠĠĠ Ġis Direct : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġbase Method : ĠIr Function ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcall Kotlin : ĠFunction Generation Context .( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs : ĠList < LLVM Value Ref >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime : ĠL ifetime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler : ĠException Handler ĊĠĠĠĠĠĠĠ Ġ) Ġ-> ĠLLVM Value Ref ? Ċ ): ĠLLVM Value Ref Ġ= Ġgenerate Obj C Imp By ( method Bridge , Ġdebug Info Ġ= Ġis Direct Ġ/* Ġsee Ġbelow Ġ*/) Ġ{ ĊĠĠĠ Ġ// ĠConsider ing Ġdirect Ġcalls Ġin lin able Ġabove . ĠIf Ġsuch Ġa Ġcall Ġis Ġin lined Ġinto Ġa Ġbridge Ġwith Ġno Ġdebug Ġinformation , ĊĠĠĠ Ġ// Ġll db Ġwill Ġnot Ġdecode Ġthe Ġin lined Ġframe Ġeven Ġif Ġthe Ġcal lee Ġhas Ġdebug Ġinformation . ĊĠĠĠ Ġ// ĠSo Ġgenerate Ġdummy Ġdebug Ġinformation Ġfor Ġbridge Ġin Ġthis Ġcase . ĊĠĠĠ Ġ// ĠTODO : Ġconsider Ġadding Ġdebug Ġinfo Ġto Ġother Ġb rid ges . ĊĊĠĠĠ Ġval ĠreturnType Ġ= Ġmethod Bridge . return Bridge ĊĊĠĠĠ Ġ// ĠTODO : Ġcall Ġ[ NSObject Ġinit ] Ġif Ġit Ġis Ġa Ġconstructor ? ĊĠĠĠ Ġ// ĠTODO : Ġcheck Ġfor Ġabstract Ġclass Ġif Ġit Ġis Ġa Ġconstructor . ĊĊĠĠĠ Ġif Ġ(! method Bridge . is Instance ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Runtime IfNeeded () Ġ// ĠFor Ġinstance Ġmethods Ġit Ġgets Ġcalled Ġwhen Ġalloc ating . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġerror Out Ptr : ĠLLVM Value Ref ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġcontinuation : ĠLLVM Value Ref ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġkotlin Args Ġ= Ġmethod Bridge . param B rid ges . map Indexed NotNull Ġ{ Ġindex , Ġparam Bridge Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġparam ( index ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( param Bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge Value Parameter . Mapped Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj C To Kotlin ( parameter , Ġparam Bridge . bridge , ĠL ifetime . ARGUMENT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Receiver . Static , ĠMethod Bridge Selector Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Receiver . Instance Ġ-> Ġobj C Reference To Kotlin ( parameter , ĠL ifetime . ARGUMENT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Receiver . Factory Ġ-> Ġnull Ġ// Ġactual Ġvalue Ġadded Ġby Ġ[ call Kotlin ]. ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Value Parameter . Error Out Parameter Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( error Out Ptr Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Out Ptr Ġ= Ġparameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Value Parameter . Suspend Completion Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . llvm . Kotlin _ Obj C Export _ create Continuation Argument , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( parameter , Ġgenerate Exception TypeInfo Array ( base Method !! )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ifetime . ARGUMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġconsider Ġmerging Ġthis Ġhandler Ġwith Ġfunction Ġcleanup . ĊĠĠĠ Ġval Ġexception Handler Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġerror Out Ptr Ġ!= Ġnull Ġ-> Ġkotlin ExceptionHandler Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . llvm . Kotlin _ Obj C Export _ Re throw Exception As N SError , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( exception , Ġerror Out Ptr !! , Ġgenerate Exception TypeInfo Array ( base Method !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnValue Ġ= Ġwhen Ġ( returnType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is ĠMethod Bridge . ReturnValue . WithError Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" bridge Ġwith Ġerror Ġparameter Ġhas Ġunexpected Ġreturn Ġtype : Ġ$ returnType ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . WithError . Success Ġ-> ĠInt 8 ( 0 ). llvm Ġ// Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . WithError . Zero For Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( returnType . success Bridge Ġ== ĠMethod Bridge . ReturnValue . Instance . Init Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRelease Ġinit Ġreceiver , Ġas Ġrequired Ġby Ġconvention . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( objc Release , ĠlistOf ( param ( 0 )), Ġto Native Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZero ( returnType . obj C Type ( context )). llvm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġret ( returnValue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontinuation Ġ!= Ġnull Ġ-> Ġkotlin ExceptionHandler Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠC alle e Ġhaven 't Ġsus pended , Ġso Ġit Ġisn 't Ġgoing Ġto Ġcall Ġthe Ġcompletion . ĠCall Ġit Ġhere : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir . symbols . obj C Export Resume Continuation With Exception . owner . llvm Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( continu ation !! , Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġcompletion Ġblock Ġcould Ġbe Ġcalled Ġdirectly Ġinstead , Ġbut Ġthis Ġimplementation Ġis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsimpler Ġand Ġavoids Ġduplication . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġkotlin ExceptionHandler Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( symbols . obj C Export Trap On Un declared Exception . owner . llvm Function , ĠlistOf ( exception )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtarget Result Ġ= Ġcall Kotlin ( kotlin Args , ĠL ifetime . ARGUMENT , Ġexception Handler ) ĊĊĠĠĠ Ġtail rec Ġfun Ġgen Return On Success ( return Bridge : ĠMethod Bridge . ReturnValue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠreturnValue : ĠLLVM Value Ref ? Ġ= Ġwhen Ġ( return Bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Void Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . HashCode Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin HashCode Ġ= Ġtarget Result !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( codegen . context . is 6 4 Bit NSInteger ()) Ġz ext ( kotlin HashCode , Ġint 6 4 Type ) Ġelse Ġkotlin HashCode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . Mapped Ġ-> Ġif Ġ( LLVM TypeOf ( target Result !! ) Ġ== Ġvoid Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Bridge . bridge . make Nothing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( return Bridge . bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReference Bridge Ġ-> Ġreturn Ġautore lease And Ret ( kotlin Reference To Ret ained Obj C ( target Result )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Pointer Bridge Ġ-> Ġreturn Ġautore lease And Ret ( kotlin Function To Ret ained Obj C Block Pointer ( return Bridge . bridge , Ġtarget Result )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValueType Bridge Ġ-> Ġkotlin To Obj C ( target Result , Ġreturn Bridge . bridge . obj C ValueType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . WithError . Success Ġ-> ĠInt 8 ( 1 ). llvm Ġ// Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . WithError . Zero For Error Ġ-> Ġreturn Ġgen Return On Success ( return Bridge . success Bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Init Result Ġ-> Ġparam ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Factory Result Ġ-> Ġreturn Ġautore lease And Ret ( kotlin Reference To Ret ained Obj C ( target Result !! )) Ġ// Ġprovided Ġby Ġ[ call Kotlin ] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Suspend Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoroutine Sus pended Ġ= Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . llvm Function ( context . ir . symbols . obj C Export Get Coroutine Sus pended . owner ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ifetime . STACK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Then ( icmp Ne ( target Result !! , Ġcoroutine Sus pended )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠC alle e Ġhaven 't Ġsus pended , Ġso Ġit Ġisn 't Ġgoing Ġto Ġcall Ġthe Ġcompletion . ĠCall Ġit Ġhere : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir . symbols . obj C Export Resume Continuation . owner . llvm Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( continu ation !! , Ġtarget Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġcompletion Ġblock Ġcould Ġbe Ġcalled Ġdirectly Ġinstead , Ġbut Ġthis Ġimplementation Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsimpler Ġand Ġavoids Ġduplication . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNote : Ġsome Ġbranches Ġabove Ġdon 't Ġreach Ġhere , Ġbecause Ġemit Ġtheir Ġown Ġoptimized Ġreturn Ġcode . ĊĠĠĠĠĠĠĠ Ġret ( returnValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġgen Return On Success ( returnType ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . generate Exception TypeInfo Array ( base Method : ĠIr Function ): ĠLLVM Value Ref Ġ= ĊĠĠĠĠĠĠĠ Ġexception TypeInfo Arrays . get Or Put ( base Method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġeffective Throws Classes ( base Method , Ġsymbols ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate TypeInfo Array ( types . toSet ()) ĊĠĠĠĠĠĠĠ Ġ}. llvm Ċ Ċ private Ġfun ĠObj C Export Code Generator . generate TypeInfo Array ( types : ĠSet < Ir Class >): ĠConst Pointer Ġ= ĊĠĠĠĠĠĠĠ Ġtype Info Arrays . get Or Put ( types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Infos Ġ= Ġtypes . map Ġ{ Ġwith ( codegen ) Ġ{ Ġit . type InfoPtr Ġ} Ġ} Ġ+ ĠNull Pointer ( codegen . k TypeInfo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . static Data . place Global Const Array ("", Ġcodegen . k TypeInfo Ptr , Ġtype Infos ) ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun Ġeffective Throws Classes ( method : ĠIr Function , Ġsymbols : ĠKon an Symbols ): ĠList < Ir Class > Ġ{ ĊĠĠĠ Ġif Ġ( method Ġis ĠIr Simple Function Ġ&& Ġmethod . over ridden Symbols . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġeffective Throws Classes ( method . over ridden Symbols . first (). owner , Ġsymbols ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġthrows Annotation Ġ= Ġmethod . annotations . find Annotation ( Kon an Fq Names . throws ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġif Ġ( method . is Suspend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( symbols . c ancellation Exception . owner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġfrontend Ġensures Ġthat Ġall Ġtop most Ġoverridden Ġmethods Ġhave Ġ( equal ) Ġ@ Throws Ġannotations . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHowever Ġdue Ġto Ġlinking Ġdifferent Ġversions Ġof Ġlibraries ĠIR Ġcould Ġend Ġup Ġnot Ġmeeting Ġthis Ġcondition . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandling Ġmissing Ġannotation Ġgrace fully : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġthrows Var arg Ġ= Ġthrows Annotation . getValue Argument ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠ Ġif Ġ( throws Var arg Ġ! is ĠIr Var arg ) Ġerror ( method . get Containing File (), Ġthrows Var arg , Ġ" unexpected Ġvar arg ") ĊĊĠĠĠ Ġreturn Ġthrows Var arg . elements . map Ġ{ ĊĠĠĠĠĠĠĠ Ġ( it Ġas ? ĠIr Class Reference )?. symbol ?. owner Ġas ? ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror ( method . get Containing File (), Ġit , Ġ" unexpected Ġ@ Throws Ġargument ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . generate Obj C Imp For Array Constructor ( ĊĠĠĠĠĠĠĠ Ġtarget : ĠIr Constructor , ĊĠĠĠĠĠĠĠ Ġmethod Bridge : ĠMethod Bridge Ċ ): ĠLLVM Value Ref Ġ= Ġgenerate Obj C Imp ( method Bridge , Ġis Direct Ġ= Ġtrue ) Ġ{ Ġargs , Ġresult Lifetime , Ġexception Handler Ġ-> ĊĠĠĠ Ġval Ġarray Instance Ġ= Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . llvm . alloc Array Function , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( target . construct ed Class . llvm TypeInfo Ptr , Ġargs . first ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime Ġ= ĠL ifetime . ARGUMENT ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcall ( target . llvm Function , ĠlistOf ( array Instance ) Ġ+ Ġargs , Ġresult Lifetime , Ġexception Handler ) ĊĠĠĠ Ġarray Instance Ċ } Ċ Ċ // ĠTODO : Ġcache Ġb rid ges . Ċ private Ġfun ĠObj C Export Code Generator . generate Kotlin To Obj CB ridge ( ĊĠĠĠĠĠĠĠ Ġir Function : ĠIr Function , ĊĠĠĠĠĠĠĠ Ġbase Method : ĠObj C Method Spec . Base Method < Ir Simple Function Symbol > Ċ ): ĠConst Pointer Ġ{ ĊĠĠĠ Ġval Ġbase Ir Function Ġ= Ġbase Method . symbol . owner ĊĊĠĠĠ Ġval Ġmethod Bridge Ġ= Ġbase Method . bridge ĊĊĠĠĠ Ġval Ġparameter To Base Ġ= Ġir Function . all Parameters . zip ( base Ir Function . all Parameters ). toMap () ĊĊĠĠĠ Ġval Ġobj c Msg Send Ġ= Ġmsg Sender ( obj C FunctionType ( context , Ġmethod Bridge )) ĊĊĠĠĠ Ġval Ġfunction Type Ġ= Ġcodegen . get Ll vm FunctionType ( ir Function ) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġfunction Generator ( function Type , Ġ" kotlin 2 objc "). generate Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġerror Out Ptr : ĠLLVM Value Ref ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġir Function . all Parameters . map Indexed Ġ{ Ġindex , Ġparameter Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Descriptor Ġto Ġparam ( index ) ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠ Ġval Ġobj C Args Ġ= Ġmethod Bridge . parameters Associated ( ir Function ). map Ġ{ Ġ( bridge , Ġparameter ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge Value Parameter . Mapped Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Value Ġ= Ġconvert Kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġparameters [ parameter ] !! Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Type Ġ= Ġparameter . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type Ġ= Ġparameter To Base [ parameter ] !!. type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime Ġ= ĠL ifetime . ARGUMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin ToLocal Obj C ( kotlin Value , Ġbridge . bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Receiver . Instance Ġ-> Ġkotlin Reference ToLocal Obj C ( parameters [ parameter ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Selector Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Ġ= Ġbase Method . selector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSelector Ġis Ġreferenced Ġthus Ġshould Ġbe Ġdefined Ġto Ġavoid Ġfalse Ġpositive Ġnon - public ĠAPI Ġrejection : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselectors To Define [ selector ] Ġ= Ġmethod Bridge ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Selector ( selector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Receiver . Static , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Receiver . Factory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Method Ġis Ġnot Ġinstance Ġand Ġthus Ġcan 't Ġhave Ġbridge Ġfor Ġoverriding : Ġ$ base Method ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Value Parameter . Error Out Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalloca ( int 8 Type Ptr ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore ( k Null Int 8 Ptr , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Out Ptr Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Value Parameter . Suspend Completion Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontinuation Ġ= Ġparam ( ir Function . all Parameters Count ) Ġ// ĠThe Ġlast Ġargument . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġpl acing Ġinter ception Ġinto Ġthe Ġconverter Ġto Ġreduce Ġcode Ġsize . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintercept ed Ġ= Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir . symbols . obj C Export Intercept ed Continuation . owner . llvm Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( continu ation ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ifetime . ARGUMENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretained Completion Ġ= Ġcall From Bridge ( continu ation To Ret ained Completion Converter , ĠlistOf ( intercept ed )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( objc Aut ore lease , ĠlistOf ( ret ained Completion )) Ġ// ĠTODO : Ġuse Ġstack - allocated Ġblock Ġhere Ġinstead . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Result Ġ= Ġcall From Bridge ( objc Msg Send , Ġobj C Args , Ġto Native Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġassert ( base Method . symbol Ġ! is ĠIr Constructor Symbol ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġre throw () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġload ( error Out Ptr !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( context . llvm . Kotlin _ Obj C Export _ Re throw N SError As Exception , ĠlistOf ( error )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunreachable () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġgen Kotlin Base MethodResult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifetime : ĠL ifetime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Bridge : ĠMethod Bridge . ReturnValue ĊĠĠĠĠĠĠĠ Ġ): ĠLLVM Value Ref ? Ġ= Ġwhen Ġ( return Bridge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Void Ġ-> Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . HashCode Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( codegen . context . is 6 4 Bit NSInteger ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlow Ġ= Ġtrunc ( target Result , Ġint 3 2 Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhigh Ġ= Ġtrunc ( shr ( target Result , Ġ 3 2 , Ġsigned Ġ= Ġfalse ), Ġint 3 2 Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxor ( low , Ġhigh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . Mapped Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj C To Kotlin ( target Result , Ġreturn Bridge . bridge , Ġlifetime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . WithError . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Then ( icmp Eq ( target Result , ĠInt 8 ( 0 ). llvm )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre throw () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . WithError . Zero For Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( return Bridge . success May Be Zero ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġload ( error Out Ptr !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Then ( icmp Ne ( error , Ġk Null Int 8 Ptr )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre throw () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Then ( icmp Eq ( target Result , Ġk Null Int 8 Ptr )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre throw () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Kotlin Base MethodResult ( lifetime , Ġreturn Bridge . success Bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Init Result , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Factory Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" init Ġor Ġfactory Ġmethod Ġcan 't Ġhave Ġbridge Ġfor Ġoverriding : Ġ$ base Method ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Suspend Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠObjective - C Ġimplementation Ġof ĠKotlin Ġsuspend Ġfunction Ġis Ġalways Ġresponsible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġcalling Ġthe Ġcompletion , Ġso Ġin ĠKotlin Ġcor outines Ġm achinery Ġterms Ġit Ġsus p ends , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhich Ġis Ġindicated Ġby Ġthe Ġreturn Ġvalue : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall From Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir . symbols . obj C Export Get Coroutine Sus pended . owner . llvm Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ifetime . RETURN _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbase ReturnType Ġ= Ġbase Ir Function . returnType ĊĠĠĠĠĠĠĠ Ġval Ġactual ReturnType Ġ= Ġir Function . returnType ĊĊĠĠĠĠĠĠĠ Ġval ĠretVal Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Ir Function . is Suspend Ġ-> Ġgen Kotlin Base MethodResult ( Lifetime . RETURN _ VALUE , Ġmethod Bridge . return Bridge ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual ReturnType . is Unit () Ġ|| Ġactual ReturnType . is Nothing () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Kotlin Base MethodResult ( Lifetime . ARGUMENT , Ġmethod Bridge . return Bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase ReturnType . is Unit () Ġ|| Ġbase ReturnType . is Nothing () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Kotlin Base MethodResult ( Lifetime . ARGUMENT , Ġmethod Bridge . return Bridge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcodegen . the Unit Instance Ref . llvm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Kotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġlifetime Ġ-> Ġgen Kotlin Base MethodResult ( lifetime , Ġmethod Bridge . return Bridge ) !! Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Type Ġ= Ġbase ReturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type Ġ= Ġactual ReturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Lifetime Ġ= ĠL ifetime . RETURN _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġret ( ret Val ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLLVM Set Link age ( result , ĠLL V ML ink age . LL V MP rivate Link age ) ĊĊĠĠĠ Ġreturn Ġconst Pointer ( result ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Reverse Adapter ( ĊĠĠĠĠĠĠĠ Ġir Function : ĠIr Function , ĊĠĠĠĠĠĠĠ Ġbase Method : ĠObj C Method Spec . Base Method < Ir Simple Function Symbol >, ĊĠĠĠĠĠĠĠ Ġv table Index : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġit able Place : ĠClass Layout Builder . Interface Table Place ? Ċ ): ĠObj C Export Code Generator . Kotlin To Obj C Method Adapter Ġ{ ĊĊĠĠĠ Ġval Ġselector Ġ= Ġbase Method . selector ĊĊĠĠĠ Ġval Ġkotlin To Obj C Ġ= Ġgenerate Kotlin To Obj CB ridge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Function , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Method ĊĠĠĠ Ġ). bit cast ( int 8 Type Ptr ) ĊĊĠĠĠ Ġreturn ĠKotlin To Obj C Method Adapter ( selector , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able Place Ġ?: ĠClass Layout Builder . Interface Table Place . INVALID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table Index Ġ?: Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin To Obj C ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Method Virtual Adapter ( ĊĠĠĠĠĠĠĠ Ġbase Method : ĠObj C Method Spec . Base Method < Ir Simple Function Symbol > Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġval Ġselector Ġ= Ġbase Method . selector ĊĠĠĠ Ġval Ġmethod Bridge Ġ= Ġbase Method . bridge ĊĠĠĠ Ġval Ġir Function Ġ= Ġbase Method . symbol . owner ĊĠĠĠ Ġval Ġimp Ġ= Ġgenerate Obj C Imp ( ir Function , Ġir Function , Ġmethod Bridge , Ġis Virtual Ġ= Ġtrue ) ĊĊĠĠĠ Ġreturn Ġobj C To Kotlin Method Adapter ( selector , Ġmethod Bridge , Ġimp ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Method Adapter ( ĊĠĠĠĠĠĠĠ Ġimplementation : ĠIr Function ?, ĊĠĠĠĠĠĠĠ Ġbase Method : ĠObj C Method Spec . Base Method < *> Ċ ) Ġ= Ġcreate Method Adapter ( Direct Adapter Request ( implementation , Ġbase Method )) Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Final Method Adapter ( ĊĠĠĠĠĠĠĠ Ġbase Method : ĠObj C Method Spec . Base Method < Ir Simple Function Symbol > Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġval Ġir Function Ġ= Ġbase Method . symbol . owner ĊĠĠĠ Ġrequire ( ir Function . modal ity Ġ== ĠMod ality . FINAL ) ĊĠĠĠ Ġreturn Ġcreate Method Adapter ( ir Function , Ġbase Method ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Method Adapter ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠDirect Adapter Request Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ= Ġthis . direct Method Adapters . get Or Put ( request ) Ġ{ ĊĊĠĠĠ Ġval Ġselector Name Ġ= Ġrequest . base . selector ĊĠĠĠ Ġval Ġmethod Bridge Ġ= Ġrequest . base . bridge ĊĊĠĠĠ Ġval Ġimp Ġ= Ġgenerate Obj C Imp ( request . implementation , Ġrequest . base . symbol . owner , Ġmethod Bridge ) ĊĊĠĠĠ Ġobj C To Kotlin Method Adapter ( selector Name , Ġmethod Bridge , Ġimp ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Constructor Adapter ( ĊĠĠĠĠĠĠĠ Ġbase Method : ĠObj C Method Spec . Base Method < Ir Constructor Symbol > Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ= Ġcreate Method Adapter ( base Method . symbol . owner , Ġbase Method ) Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Array Constructor Adapter ( ĊĠĠĠĠĠĠĠ Ġbase Method : ĠObj C Method Spec . Base Method < Ir Constructor Symbol > Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġval Ġselector Name Ġ= Ġbase Method . selector ĊĠĠĠ Ġval Ġmethod Bridge Ġ= Ġbase Method . bridge ĊĠĠĠ Ġval Ġir Constructor Ġ= Ġbase Method . symbol . owner ĊĠĠĠ Ġval Ġimp Ġ= Ġgenerate Obj C Imp For Array Constructor ( ir Constructor , Ġmethod Bridge ) ĊĊĠĠĠ Ġreturn Ġobj C To Kotlin Method Adapter ( selector Name , Ġmethod Bridge , Ġimp ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . v table Index ( ir Function : ĠIr Simple Function ): ĠInt ? Ġ{ ĊĠĠĠ Ġassert ( ir Function . is Over rid able ) ĊĠĠĠ Ġval Ġir Class Ġ= Ġir Function . parent As Class ĊĠĠĠ Ġreturn Ġif Ġ( ir Class . is Interface ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . get Layout Builder ( ir Class ). v table Index ( ir Function ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . it able Place ( ir Function : ĠIr Simple Function ): ĠClass Layout Builder . Interface Table Place ? Ġ{ ĊĠĠĠ Ġassert ( ir Function . is Over rid able ) ĊĠĠĠ Ġval Ġir Class Ġ= Ġir Function . parent As Class ĊĠĠĠ Ġreturn Ġif Ġ( ir Class . is Interface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( ir Function . is Real Ġ|| Ġir Function . resolve Fake Override Maybe Abstract (). parent Ġ!= Ġcontext . ir Built Ins . any Class . owner ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . get Layout Builder ( ir Class ). it able Place ( ir Function ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Type Adapter For File Class ( ĊĠĠĠĠĠĠĠ Ġfile Class : ĠObj C Class For Kotlin File Ċ ): ĠObj C Export Code Generator . Obj C Type Adapter Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġfile Class . binary Name ĊĊĠĠĠ Ġval Ġadapters Ġ= Ġfile Class . methods . map Ġ{ Ġcreate Final Method Adapter ( it . base Method ) Ġ} ĊĊĠĠĠ Ġreturn ĠObj C Type Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table Size Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able Size Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj C Name Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirect Adapters Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters Ġ= Ġadapters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual Adapters Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Adapters Ġ= Ġempty List () ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Type Adapter ( ĊĠĠĠĠĠĠĠ Ġtype : ĠObj C Type For Kotlin Type , ĊĠĠĠĠĠĠĠ ĠsuperClass : ĠObj C Class For Kotlin Class ?, ĊĠĠĠĠĠĠĠ Ġreverse Adapters : ĠList < Obj C Export Code Generator . Kotlin To Obj C Method Adapter > Ċ ): ĠObj C Export Code Generator . Obj C Type Adapter Ġ{ ĊĠĠĠ Ġval Ġir Class Ġ= Ġtype . ir Class Symbol . owner ĊĠĠĠ Ġval Ġadapters Ġ= Ġmutable ListOf < Obj C Export Code Generator . Obj C To Kotlin Method Adapter >() ĊĠĠĠ Ġval Ġclass Adapters Ġ= Ġmutable ListOf < Obj C Export Code Generator . Obj C To Kotlin Method Adapter >() ĊĊĠĠĠ Ġtype . methods . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Init Method For Kotlin Constructor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapters Ġ+= Ġcreate Constructor Adapter ( it . base Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Factory Method For Kotlin Array Constructor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters Ġ+= Ġcreate Array Constructor Adapter ( it . base Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Getter For Kotlin Enum Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters Ġ+= Ġcreate Enum Entry Adapter ( it . ir Enum Entry Symbol . owner , Ġit . selector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Class Method For Kotlin Enum Values Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters Ġ+= Ġcreate Enum Values Adapter ( it . values Function Symbol . owner , Ġit . selector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Getter For Object Instance Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters Ġ+= Ġif Ġ( it . class Symbol . owner . is Unit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Unit Instance Adapter ( it . selector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Object Instance Adapter ( it . class Symbol . owner , Ġit . selector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObj CK otlin Throwable As Error Method Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapters Ġ+= Ġcreate Throwable As Error Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠObj C Method For Kotlin Method Ġ-> Ġ{} Ġ// ĠHand led Ġbelow . ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{} Ġ// ĠForce Ġex haustive . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġadditional Reverse Adapters Ġ= Ġmutable ListOf < Obj C Export Code Generator . Kotlin To Obj C Method Adapter >() ĊĊĠĠĠ Ġif Ġ( type Ġis ĠObj C Class For Kotlin Class ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtype . category Methods . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapters Ġ+= Ġcreate Final Method Adapter ( it . base Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Reverse Adapters Ġ+= Ġnon Over rid able Adapter ( it . base Method . selector , Ġhas Selector Amb iguity Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadapters Ġ+= Ġcreate Direct Adapters ( type , ĠsuperClass ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvirtual Adapters Ġ= Ġtype . kotlin Methods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Function Ġ= Ġit . base Method . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . parent As Class Ġ== Ġir Class Ġ&& Ġir Function . is Over rid able ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġcreate Method Virtual Adapter ( it . base Method ) Ġ} ĊĊĠĠĠ Ġval Ġtype Info Ġ= Ġconst Pointer ( codegen . type Info Value ( ir Class )) ĊĠĠĠ Ġval Ġobj C Name Ġ= Ġtype . binary Name ĊĊĠĠĠ Ġval Ġv table Size Ġ= Ġif Ġ( ir Class . kind Ġ== ĠClass Kind . INTERFACE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . get Layout Builder ( ir Class ). v table Entries . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġv table Ġ= Ġif Ġ(! ir Class . is Interface Ġ&& Ġ! ir Class . type Info Has V table Attached ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatic Data . place Global ("", Ġr tti Generator . v table ( ir Class )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Constant ( true ) ĊĠĠĠĠĠĠĠ Ġ}. pointer . getElement Ptr ( 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġ( it able , Ġit able Size ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġir Class . is Interface Ġ-> ĠPair ( emptyList (), Ġcontext . get Layout Builder ( ir Class ). interface V Table Entries . size ) ĊĠĠĠĠĠĠĠ Ġir Class . is Abstract () Ġ-> Ġr tti Generator . interface Table Records ( ir Class ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPair ( emptyList (), Ġ- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠObj C Type Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv table Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit able Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj C Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Adapters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual Adapters , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Adapters Ġ+ Ġadditional Reverse Adapters ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Reverse Adapters ( ĊĠĠĠĠĠĠĠ Ġtypes : ĠList < Obj C Type For Kotlin Type > Ċ ): ĠMap < Obj C Type For Kotlin Type , ĠReverse Adapters > Ġ{ ĊĠĠĠ Ġval Ġir Class Symbol To Type Ġ= Ġtypes . associate By Ġ{ Ġit . ir Class Symbol Ġ} ĊĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < Obj C Type For Kotlin Type , ĠReverse Adapters >() ĊĊĠĠĠ Ġfun Ġget OrCreate For ( type : ĠObj C Type For Kotlin Type ): ĠReverse Adapters Ġ= Ġresult . get Or Put ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEach Ġtype Ġalso Ġinherits Ġreverse Ġadapters Ġfrom Ġsuper Ġtypes . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġhandled Ġin Ġruntime Ġwhen Ġbuilding ĠType Info Ġfor ĠSwift Ġor ĠObj - C Ġtype ĊĠĠĠĠĠĠĠ Ġ// Ġsubclass ing ĠKotlin Ġclasses Ġor Ġinterfaces . ĠSee Ġ[ create TypeInfo ] Ġin ĠObj C Export . mm . ĊĠĠĠĠĠĠĠ Ġval Ġall Super Classes Ġ= ĠDFS . dfs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . ir Class Symbol . owner . super Classes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . owner . super Classes Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDFS . Node Handler With ListResult < Ir Class Symbol , ĠIr Class Symbol >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter Children ( current : ĠIr Class Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result Ġ+= Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinherits Adapters From Ġ= Ġall Super Classes . map NotNull Ġ{ Ġir Class Symbol To Type [ it ] Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinherited Adapters Ġ= Ġinherits Adapters From . map Ġ{ Ġget OrCreate For ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Reverse Adapters ( type , Ġinherited Adapters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtypes . forEach Ġ{ Ġget OrCreate For ( it ) Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġclass ĠReverse Adapters ( ĊĠĠĠĠĠĠĠ Ġval Ġadapters : ĠList < Obj C Export Code Generator . Kotlin To Obj C Method Adapter >, ĊĠĠĠĠĠĠĠ Ġval Ġcovered Methods : ĠSet < Ir Simple Function > Ċ ) Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Reverse Adapters ( ĊĠĠĠĠĠĠĠ Ġtype : ĠObj C Type For Kotlin Type , ĊĠĠĠĠĠĠĠ Ġinherited Adapters : ĠList < Reverse Adapters > Ċ ): ĠReverse Adapters Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Obj C Export Code Generator . Kotlin To Obj C Method Adapter >() ĊĠĠĠ Ġval Ġcovered Methods Ġ= Ġmutable Set Of < Ir Simple Function >() ĊĊĠĠĠ Ġval Ġmethods Cover edBy Inherited Adapters Ġ= Ġinherited Adapters . flatMap To ( mutable Set Of ()) Ġ{ Ġit . covered Methods Ġ} ĊĊĠĠĠ Ġval Ġall Base Methods By Ir Ġ= Ġtype . kotlin Methods . map Ġ{ Ġit . base Method Ġ}. associate By Ġ{ Ġit . symbol . owner Ġ} ĊĊĠĠĠ Ġfor Ġ( method Ġin Ġtype . ir Class Symbol . owner . simple Functions ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Methods Ġ= Ġmethod . all Over ridden Functions . map NotNull Ġ{ Ġall Base Methods By Ir [ it ] Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( base Methods . isEmpty ()) Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Selector Amb iguity Ġ= Ġbase Methods . map Ġ{ Ġit . selector Ġ}. distinct (). size Ġ> Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method . is Over rid able Ġ&& Ġ! has Selector Amb iguity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Method Ġ= Ġbase Methods . first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresent V table B rid ges Ġ= Ġmutable Set Of < Int ? >( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresent Method Table B rid ges Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresent It able B rid ges Ġ= Ġmutable Set Of < Class Layout Builder . Interface Table Place ? >( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Over ridden Methods Ġ= Ġmethod . all Over ridden Functions ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( inherited , Ġun inherited ) Ġ= Ġall Over ridden Methods . partition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġin Ġmethods Cover edBy Inherited Adapters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinherited . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent V table B rid ges Ġ+= Ġv table Index ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent Method Table B rid ges Ġ+= Ġit . compute FunctionName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent It able B rid ges Ġ+= Ġit able Place ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġun inherited . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv table Index Ġ= Ġv table Index ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Name Ġ= Ġit . compute FunctionName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit able Place Ġ= Ġit able Place ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v table Index Ġ! in Ġpresent V table B rid ges Ġ|| Ġfunction Name Ġ! in Ġpresent Method Table B rid ges ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit able Place Ġ! in Ġpresent It able B rid ges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent V table B rid ges Ġ+= Ġv table Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent Method Table B rid ges Ġ+= Ġfunction Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent It able B rid ges Ġ+= Ġit able Place ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġcreate Reverse Adapter ( it , Ġbase Method , Ġv table Index , Ġit able Place ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcovered Methods Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMark Ġit Ġas Ġnon - over rid able : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Methods . map Ġ{ Ġit . selector Ġ}. distinct (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġnon Over rid able Adapter ( it , Ġhas Selector Amb iguity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠReverse Adapters ( result , Ġcovered Methods ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . non Over rid able Adapter ( ĊĠĠĠĠĠĠĠ Ġselector : ĠString , ĊĠĠĠĠĠĠĠ Ġhas Selector Amb iguity : ĠBoolean Ċ ): ĠObj C Export Code Generator . Kotlin To Obj C Method Adapter Ġ= ĠKotlin To Obj C Method Adapter ( ĊĠĠĠ Ġselector , ĊĠĠĠ Ġv table Index Ġ= Ġif Ġ( has Selector Amb iguity ) Ġ- 2 Ġelse Ġ- 1 , Ġ// ĠDescri bes Ġthe Ġreason . ĊĠĠĠ Ġkotlin Impl Ġ= ĠNull Pointer ( int 8 Type ), ĊĠĠĠ Ġit able Place Ġ= ĠClass Layout Builder . Interface Table Place . INVALID Ċ ) Ċ Ċ private Ġval ĠObj C Type For Kotlin Type . kotlin Methods : ĠList < Obj C Method For Kotlin Method > ĊĠĠĠ Ġget () Ġ= Ġthis . methods . filter Is Instance < Obj C Method For Kotlin Method >() Ċ Ċ internal Ġdata Ġclass ĠDirect Adapter Request ( val Ġimplementation : ĠIr Function ?, Ġval Ġbase : ĠObj C Method Spec . Base Method <* >) Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Direct Adapters ( ĊĠĠĠĠĠĠĠ Ġtype Declaration : ĠObj C Class For Kotlin Class , ĊĠĠĠĠĠĠĠ ĠsuperClass : ĠObj C Class For Kotlin Class ? Ċ ): ĠList < Obj C Export Code Generator . Obj C To Kotlin Method Adapter > Ġ{ ĊĊĠĠĠ Ġfun ĠObj C Class For Kotlin Class . getAll Required Direct Adapters () Ġ= Ġthis . kotlin Methods . map Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠ ĠDirect Adapter Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Implementation ( ir Class Symbol . owner , Ġmethod . base Method . symbol . owner , Ġcontext ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . base Method ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinherited Adapters Ġ= ĠsuperClass ?. getAll Required Direct Adapters (). or Empty () ĊĠĠĠ Ġval Ġrequired Adapters Ġ= Ġtype Declaration . getAll Required Direct Adapters () Ġ- Ġinherited Adapters ĊĊĠĠĠ Ġreturn Ġrequired Adapters . distinct By Ġ{ Ġit . base . selector Ġ}. map Ġ{ Ġcreate Method Adapter ( it ) Ġ} Ċ } Ċ Ċ private Ġfun Ġfind Implementation ( ir Class : ĠIr Class , Ġmethod : ĠIr Simple Function , Ġcontext : ĠContext ): ĠIr Simple Function ? Ġ{ ĊĠĠĠ Ġval Ġoverride Ġ= Ġir Class . simple Functions (). single OrNull Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod Ġin Ġit . all Over ridden Functions ĊĠĠĠ Ġ} Ġ?: Ġerror (" no Ġimplementation Ġfor Ġ${ method . render () }\ nin Ġ${ ir Class . fq Name When Available }") ĊĠĠĠ Ġreturn ĠOver ridden Function Info ( override , Ġmethod ). get Implementation ( context ) Ċ } Ċ Ċ private Ġinline Ġfun ĠObj C Export Code Generator . generate Obj C To Kotlin Synt hetic Getter ( ĊĠĠĠĠĠĠĠ Ġselector : ĠString , ĊĠĠĠĠĠĠĠ Ġblock : ĠObj C Export Function Generation Context . () Ġ-> ĠUnit Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĊĠĠĠ Ġval Ġmethod Bridge Ġ= ĠMethod Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Mapped ( Reference Bridge ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod Bridge Receiver . Static , Ġvalue Parameters Ġ= Ġempty List () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġimp Ġ= Ġfunction Generator ( obj C FunctionType ( context , Ġmethod Bridge ), Ġ" objc 2 kotlin ") Ġ{ ĊĠĠĠĠĠĠĠ Ġswitch To Runnable Ġ= Ġtrue ĊĠĠĠ Ġ}. generate Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLLVM Set Link age ( imp , ĠLL V ML ink age . LL V MP rivate Link age ) ĊĊĠĠĠ Ġreturn Ġobj C To Kotlin Method Adapter ( selector , Ġmethod Bridge , Ġimp ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . obj C To Kotlin Method Adapter ( ĊĠĠĠĠĠĠĠ Ġselector : ĠString , ĊĠĠĠĠĠĠĠ Ġmethod Bridge : ĠMethod Bridge , ĊĠĠĠĠĠĠĠ Ġimp : ĠLLVM Value Ref Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġselectors To Define [ selector ] Ġ= Ġmethod Bridge ĊĊĠĠĠ Ġreturn ĠObj C To Kotlin Method Adapter ( selector , Ġget Encoding ( method Bridge ), Ġconst Pointer ( imp )) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Unit Instance Adapter ( selector : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġgenerate Obj C To Kotlin Synt hetic Getter ( selector ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : Ġgenerate Obj C To Kotlin Synt hetic Getter Ġswitches Ġto ĠRunnable , Ġwhich Ġis Ġprobably Ġnot Ġrequired Ġhere Ġand Ġthus Ġsub optimal . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Runtime IfNeeded () Ġ// ĠFor Ġinstance Ġmethods Ġit Ġgets Ġcalled Ġwhen Ġalloc ating . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġautore lease And Ret ( call From Bridge ( context . llvm . Kotlin _ Obj C Export _ convert Unit To Ret ained , ĠlistOf ( codegen . the Unit Instance Ref . llvm ))) ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun ĠObj C Export Code Generator . createObject Instance Adapter ( ĊĠĠĠĠĠĠĠ Ġir Class : ĠIr Class , ĊĠĠĠĠĠĠĠ Ġselector : ĠString Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġassert ( ir Class . kind Ġ== ĠClass Kind . OBJECT ) ĊĠĠĠ Ġassert (! ir Class . is Unit ()) ĊĊĠĠĠ Ġreturn Ġgenerate Obj C To Kotlin Synt hetic Getter ( selector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Runtime IfNeeded () Ġ// ĠFor Ġinstance Ġmethods Ġit Ġgets Ġcalled Ġwhen Ġalloc ating . ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠgetObject Value ( ir Class , Ġstart Location Info Ġ= Ġnull , Ġexception Handler Ġ= ĠException Handler . Caller ) ĊĠĠĠĠĠĠĠ Ġautore lease And Ret ( kotlin Reference To Ret ained Obj C ( value )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Enum Entry Adapter ( ĊĠĠĠĠĠĠĠ Ġir Enum Entry : ĠIr Enum Entry , ĊĠĠĠĠĠĠĠ Ġselector : ĠString Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġreturn Ġgenerate Obj C To Kotlin Synt hetic Getter ( selector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Runtime IfNeeded () Ġ// ĠFor Ġinstance Ġmethods Ġit Ġgets Ġcalled Ġwhen Ġalloc ating . ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget Enum Entry ( ir Enum Entry , ĠException Handler . Caller ) ĊĠĠĠĠĠĠĠ Ġautore lease And Ret ( kotlin Reference To Ret ained Obj C ( value )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Enum Values Adapter ( ĊĠĠĠĠĠĠĠ Ġvalues Function : ĠIr Function , ĊĠĠĠĠĠĠĠ Ġselector : ĠString Ċ ): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġval Ġmethod Bridge Ġ= ĠMethod Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Bridge Ġ= ĠMethod Bridge . ReturnValue . Mapped ( Reference Bridge ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= ĠMethod Bridge Receiver . Static , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ= Ġempty List () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġimp Ġ= Ġgenerate Obj C Imp ( values Function , Ġvalues Function , Ġmethod Bridge , Ġis Virtual Ġ= Ġfalse ) ĊĊĠĠĠ Ġreturn Ġobj C To Kotlin Method Adapter ( selector , Ġmethod Bridge , Ġimp ) Ċ } Ċ Ċ private Ġfun ĠObj C Export Code Generator . create Throwable As Error Adapter (): ĠObj C Export Code Generator . Obj C To Kotlin Method Adapter Ġ{ ĊĠĠĠ Ġval Ġmethod Bridge Ġ= ĠMethod Bridge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Bridge Ġ= ĠMethod Bridge . ReturnValue . Mapped ( Reference Bridge ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= ĠMethod Bridge Receiver . Instance , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ= Ġempty List () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġimp Ġ= Ġgenerate Obj C Imp By ( method Bridge ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġobj C Reference To Kotlin ( param ( 0 ), ĠL ifetime . ARGUMENT ) ĊĠĠĠĠĠĠĠ Ġret ( call From Bridge ( context . llvm . Kotlin _ Obj C Export _ Wrap Exception To N SError , ĠlistOf ( exception ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġselector Ġ= ĠObj C Export N amer . kotlin Throwable As Error MethodName ĊĠĠĠ Ġreturn Ġobj C To Kotlin Method Adapter ( selector , Ġmethod Bridge , Ġimp ) Ċ } Ċ Ċ private Ġfun Ġobj C FunctionType ( context : ĠContext , Ġmethod Bridge : ĠMethod Bridge ): ĠLLVM Type Ref Ġ{ ĊĠĠĠ Ġval Ġparam Types Ġ= Ġmethod Bridge . param B rid ges . map Ġ{ Ġit . obj C Type Ġ} ĊĊĠĠĠ Ġval ĠreturnType Ġ= Ġmethod Bridge . return Bridge . obj C Type ( context ) ĊĊĠĠĠ Ġreturn Ġfunction Type ( returnType , Ġfalse , Ġ*( param Types . to Typed Array ())) Ċ } Ċ Ċ private Ġval ĠObj C ValueType . llvm Type : ĠLLVM Type Ref Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ ĠObj C ValueType . BOOL Ġ-> Ġint 8 Type ĊĠĠĠ ĠObj C ValueType . UN ICH AR Ġ-> Ġint 1 6 Type ĊĠĠĠ ĠObj C ValueType . CHAR Ġ-> Ġint 8 Type ĊĠĠĠ ĠObj C ValueType . SHORT Ġ-> Ġint 1 6 Type ĊĠĠĠ ĠObj C ValueType . INT Ġ-> Ġint 3 2 Type ĊĠĠĠ ĠObj C ValueType . LONG _ LONG Ġ-> Ġint 6 4 Type ĊĠĠĠ ĠObj C ValueType . UNSIGNED _ CHAR Ġ-> Ġint 8 Type ĊĠĠĠ ĠObj C ValueType . UNSIGNED _ SHORT Ġ-> Ġint 1 6 Type ĊĠĠĠ ĠObj C ValueType . UNSIGNED _ INT Ġ-> Ġint 3 2 Type ĊĠĠĠ ĠObj C ValueType . UNSIGNED _ LONG _ LONG Ġ-> Ġint 6 4 Type ĊĠĠĠ ĠObj C ValueType . FLOAT Ġ-> Ġfloat Type ĊĠĠĠ ĠObj C ValueType . DOUBLE Ġ-> Ġdouble Type ĊĠĠĠ ĠObj C ValueType . POINTER Ġ-> Ġk Int 8 Ptr Ċ } Ċ Ċ private Ġval ĠMethod Bridge Parameter . obj C Type : ĠLLVM Type Ref Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠMethod Bridge Value Parameter . Mapped Ġ-> Ġthis . bridge . obj C Type ĊĠĠĠ Ġis ĠMethod Bridge Receiver Ġ-> ĠReference Bridge . obj C Type ĊĠĠĠ ĠMethod Bridge Selector Ġ-> Ġint 8 Type Ptr ĊĠĠĠ ĠMethod Bridge Value Parameter . Error Out Parameter Ġ-> Ġpointer Type ( Reference Bridge . obj C Type ) ĊĠĠĠ ĠMethod Bridge Value Parameter . Suspend Completion Ġ-> Ġint 8 Type Ptr Ċ } Ċ Ċ private Ġfun ĠMethod Bridge . ReturnValue . obj C Type ( context : ĠContext ): ĠLLVM Type Ref Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Suspend , ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Void Ġ-> Ġvoid Type ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . HashCode Ġ-> Ġif Ġ( context . is 6 4 Bit NSInteger ()) Ġint 6 4 Type Ġelse Ġint 3 2 Type ĊĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . Mapped Ġ-> Ġthis . bridge . obj C Type ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . WithError . Success Ġ-> ĠObj C ValueType . BOOL . llvm Type ĊĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Init Result , ĊĠĠĠĠĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Factory Result Ġ-> ĠReference Bridge . obj C Type ĊĠĠĠĠĠĠĠ Ġis ĠMethod Bridge . ReturnValue . WithError . Zero For Error Ġ-> Ġthis . success Bridge . obj C Type ( context ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠType Bridge . obj C Type : ĠLLVM Type Ref Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠReference Bridge , Ġis ĠBlock Pointer Bridge Ġ-> Ġint 8 Type Ptr ĊĠĠĠ Ġis ĠValueType Bridge Ġ-> Ġthis . obj C ValueType . llvm Type Ċ } Ċ Ċ internal Ġfun ĠObj C Export Code Generator . get Encoding ( method Bridge : ĠMethod Bridge ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġparam Offset Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġparams Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġmethod Bridge . param B rid ges . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( it . obj C Encoding ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( param Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam Offset Ġ+= ĠLLVM Store Size OfType ( runtime . target Data , Ġit . obj C Type ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠreturnType Encoding Ġ= Ġmethod Bridge . return Bridge . get Obj C Encoding ( context ) ĊĊĠĠĠ Ġval Ġparam Size Ġ= Ġparam Offset ĊĠĠĠ Ġreturn Ġ"$ returnType Encoding $ param Size $ params " Ċ } Ċ Ċ private Ġfun ĠMethod Bridge . ReturnValue . get Obj C Encoding ( context : ĠContext ): ĠString Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ ĠMethod Bridge . ReturnValue . Suspend , ĊĠĠĠ ĠMethod Bridge . ReturnValue . Void Ġ-> Ġ" v " ĊĠĠĠ ĠMethod Bridge . ReturnValue . HashCode Ġ-> Ġif Ġ( context . is 6 4 Bit NSInteger ()) Ġ" Q " Ġelse Ġ" I " ĊĠĠĠ Ġis ĠMethod Bridge . ReturnValue . Mapped Ġ-> Ġthis . bridge . obj C Encoding ĊĠĠĠ ĠMethod Bridge . ReturnValue . WithError . Success Ġ-> ĠObj C ValueType . BOOL . encoding ĊĊĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Init Result , ĊĠĠĠ ĠMethod Bridge . ReturnValue . Instance . Factory Result Ġ-> ĠReference Bridge . obj C Encoding ĊĠĠĠ Ġis ĠMethod Bridge . ReturnValue . WithError . Zero For Error Ġ-> Ġthis . success Bridge . get Obj C Encoding ( context ) Ċ } Ċ Ċ private Ġval ĠMethod Bridge Parameter . obj C Encoding : ĠString Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠMethod Bridge Value Parameter . Mapped Ġ-> Ġthis . bridge . obj C Encoding ĊĠĠĠ Ġis ĠMethod Bridge Receiver Ġ-> ĠReference Bridge . obj C Encoding ĊĠĠĠ ĠMethod Bridge Selector Ġ-> Ġ":" ĊĠĠĠ ĠMethod Bridge Value Parameter . Error Out Parameter Ġ-> Ġ"^ ${ Reference Bridge . obj C Encoding }" ĊĠĠĠ ĠMethod Bridge Value Parameter . Suspend Completion Ġ-> Ġ"@ " Ċ } Ċ Ċ private Ġval ĠType Bridge . obj C Encoding : ĠString Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ ĠReference Bridge , Ġis ĠBlock Pointer Bridge Ġ-> Ġ"@ " ĊĠĠĠ Ġis ĠValueType Bridge Ġ-> Ġthis . obj C ValueType . encoding Ċ } Ċ Ċ private Ġfun ĠContext . is 6 4 Bit NSInteger (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġconfigur ables Ġ= Ġthis . config . platform . configur ables ĊĠĠĠ Ġrequire ( configur ables Ġis ĠApple Configur ables ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Target Ġ${ configur ables . target } Ġhas Ġno Ġsupport Ġfor ĠNS Integer Ġtype ." ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġllvm . ns Integer Type Width Ġ== Ġ 6 4 L Ċ } Ċ