/* Ċ Ġ* ĠAv ail Push Outer Variable . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 1 , ĠThe ĠAv ail ĠFoundation , ĠLLC . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* ĠĠ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ* ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġthe Ġcontributors Ċ Ġ* ĠĠ Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ċ Ġ* ĠĠ Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġcom . avail . compiler . instruction Ċ Ċ import Ġcom . avail . compiler . Avail Code Generator Ċ import Ġcom . avail . descriptor . functions . Function Descriptor Ċ import Ġcom . avail . descriptor . tokens . A _ Token Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple Ċ import Ġcom . avail . interpreter . level One . L 1 Operation . L 1 _ do Push Last Outer Ċ import Ġcom . avail . interpreter . level One . L 1 Operation . L 1 _ do Push Outer Ċ import Ġcom . avail . io . Ny bble OutputStream Ċ Ċ /** Ċ Ġ* ĠPush Ġan Ġouter Ġ( lex ically Ġcaptured ) Ġvariable . Ġ ĠNot Ġits Ġvalue , Ġbut Ġthe Ġvariable Ċ Ġ* Ġitself . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark Ġvan ĠG ul ik Ġ& lt ; mark @ avail lang . org & gt ; Ċ Ġ* Ċ Ġ* Ġ@ constructor Ċ Ġ* Ċ Ġ* ĠConstruct Ġa Ġnew Ġ` Avail Push Outer Variable `. Ċ Ġ* Ċ Ġ* Ġ@ param Ġrelevant Tokens Ċ Ġ* ĠĠ ĠThe Ġ[ A _ Tuple ] Ġof Ġ[ A _ Token ] s Ġthat Ġare Ġassociated Ġwith Ġthis Ġinstruction . Ċ Ġ* Ġ@ param Ġvariable Index Ċ Ġ* ĠĠ ĠThe Ġindex Ġof Ġthe Ġvariable Ġin Ġa Ġ[ function ][ Function Descriptor ]' s Ġcaptured Ċ Ġ* ĠĠ Ġouter Ġvariables . Ċ Ġ*/ Ċ class ĠAv ail Push Outer Variable Ġconstructor ( Ċ ĉ relevant Tokens : ĠA _ Tuple , Ċ ĉ variable Index : ĠInt ) Ġ: ĠAv ail Push Variable ( relevant Tokens , Ġvariable Index ) Ċ { Ċ ĉ override Ġval Ġis Outer Use : ĠBoolean Ċĉ ĉ get () Ġ= Ġtrue ĊĊ ĉ override Ġfun Ġwrite Ny bb les On ( a Stream : ĠN y bble OutputStream ) Ċ ĉ { Ċĉ ĉ val Ġop Ġ= Ġif Ġ( is Last Access ) ĠL 1 _ do Push Last Outer Ġelse ĠL 1 _ do Push Outer Ċĉ ĉ op . writeTo ( a Stream ) Ċĉ ĉ write Integer On ( index , Ġa Stream ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġinstructions Ġof Ġa Ġblock Ġare Ġbeing Ġiter ated Ġover . Ġ ĠCoordinate Ċĉ Ġ* Ġoptimizations Ġbetween Ġinstructions Ġusing Ġlocal Data Ġand Ġouter Data , Ġtwo Ċĉ Ġ* Ġ[ lists ][ List ] Ġmanip ulated Ġby Ġoverrides Ġof Ġthis Ġmethod . Ġ ĠT reat Ġeach Ċĉ Ġ* Ġinstruction Ġas Ġthough Ġit Ġis Ġthe Ġlast Ġone Ġin Ġthe Ġblock , Ġand Ġsave Ġenough Ċĉ Ġ* Ġinformation Ġin Ġthe Ġlists Ġto Ġbe Ġable Ġto Ġundo Ġcon sequences Ġof Ġthis Ċĉ Ġ* Ġassumption Ġwhen Ġa Ġlater Ġinstruction Ġshows Ġit Ġto Ġbe Ġun w arr anted . Ċĉ Ġ* Ċĉ Ġ* ĠThe Ġdata Ġlists Ġare Ġkey ed Ġby Ġlocal Ġor Ġouter Ġindex . Ġ ĠEach Ġentry Ġis Ġeither Ċĉ Ġ* Ġ` null ` Ġor Ġa Ġ[ Avail Variable Access Note ], Ġwhich Ġkeeps Ġtrack Ġof Ġthe Ġprevious Ċĉ Ġ* Ġtime Ġa Ġget Ġor Ġpush Ġhappened . Ċĉ Ġ* Ċĉ Ġ* ĠThe Ġreceiver Ġp ushes Ġan Ġouter Ġvariable , Ġwhich Ġis Ġan Ġouter Ġreference Ġto Ċĉ Ġ* Ġeither Ġa Ġlocal Ġor Ġan Ġargument . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġfix Usage Flags ( Ċĉ ĉ local Data : ĠMutable List < Avail Variable Access Note ? >, Ċĉ ĉ outer Data : ĠMutable List < Avail Variable Access Note ? >, Ċĉ ĉ code Generator : ĠAv ail Code Generator ) Ċ ĉ { Ċĉ ĉ var Ġnote Ġ= Ġouter Data [ index Ġ- Ġ 1 ] Ċĉ ĉ if Ġ( note Ġ=== Ġnull ) Ċĉ ĉ { Ċĉĉ ĉ note Ġ= ĠAv ail Variable Access Note () Ċĉĉ ĉ outer Data [ index Ġ- Ġ 1 ] Ġ= Ġnote Ċĉ ĉ } Ċĉ ĉ // ĠIf Ġthere Ġwas Ġa Ġpush Ġbefore Ġthis Ġone , Ġset Ġits Ġis Last Access Ġto Ġfalse , Ċĉ ĉ // Ġas Ġthe Ġreceiver Ġis Ġclearly Ġa Ġlater Ġuse . Ċĉ ĉ note . previous Push ?. is Last Access Ġ= Ġfalse Ċĉ ĉ is Last Access Ġ= Ġtrue Ċĉ ĉ // ĠIf Ġthere Ġwas Ġa Ġget Ġbefore Ġthis Ġpush , Ġmake Ġsure Ġits Ġcan Clear Ġflag Ġis Ċĉ ĉ // Ġfalse Ġ( the Ġvariable Ġescap es ). Ċĉ ĉ note . previous Get ?. can Clear Ġ= Ġfalse Ċĉ ĉ note . previous Push Ġ= Ġthis Ċ ĉ } Ċ } Ċ