/* Ċ Ġ* ĠObjectType Descriptor . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 0 , Ġ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 . descriptor . objects Ċ Ċ import Ġcom . avail . annotations . Thread Safe Ċ import Ġcom . avail . descriptor . atoms . A _ Atom Ċ import Ġcom . avail . descriptor . atoms . A _ Atom . Companion . atom Name Ċ import Ġcom . avail . descriptor . atoms . A _ Atom . Companion . get Atom Property Ċ import Ġcom . avail . descriptor . atoms . A _ Atom . Companion . is Atom Special Ċ import Ġcom . avail . descriptor . atoms . A _ Atom . Companion . set Atom Property Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor . Companion . create Special Atom Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor . Companion . true Object Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor . Special Atom . EX PL IC IT _ SUB CLASS ING _ KEY Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor . Special Atom . OBJECT _ TYPE _ NAME _ PROPERTY _ KEY Ċ import Ġcom . avail . descriptor . maps . A _ Map Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . has Key Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . keys As Set Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map At Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map At Put ting Can Destroy Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map Iterable Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map Size Ċ import Ġcom . avail . descriptor . maps . A _ Map . Companion . map Without Key Can Destroy Ċ import Ġcom . avail . descriptor . maps . Map Descriptor . Companion . empty Map Ċ import Ġcom . avail . descriptor . objects . Object Layout Variant . Companion . variant For Fields Ċ import Ġcom . avail . descriptor . objects . ObjectType Descriptor . Integer Slots . Companion . HASH _ OR _ ZERO Ċ import Ġcom . avail . descriptor . objects . ObjectType Descriptor . Object Slots . FIELD _ TYPES _ Ċ import Ġcom . avail . descriptor . representation . A _ Basic Object Ċ import Ġcom . avail . descriptor . representation . Abstract Slots Enum Ċ import Ġcom . avail . descriptor . representation . Avail Object Ċ import Ġcom . avail . descriptor . representation . Avail Object . Companion . multiplier Ċ import Ġcom . avail . descriptor . representation . Avail Object Field Helper Ċ import Ġcom . avail . descriptor . representation . Bit Field Ċ import Ġcom . avail . descriptor . representation . Integer Slots Enum Ċ import Ġcom . avail . descriptor . representation . Mut ability Ċ import Ġcom . avail . descriptor . representation . Object Slots Enum Ċ import Ġcom . avail . descriptor . sets . A _ Set Ċ import Ġcom . avail . descriptor . sets . A _ Set . Companion . has Element Ċ import Ġcom . avail . descriptor . sets . A _ Set . Companion . set Intersection Can Destroy Ċ import Ġcom . avail . descriptor . sets . A _ Set . Companion . setSize Ċ import Ġcom . avail . descriptor . sets . A _ Set . Companion . set Union Can Destroy Ċ import Ġcom . avail . descriptor . sets . A _ Set . Companion . set With Element Can Destroy Ċ import Ġcom . avail . descriptor . sets . A _ Set . Companion . set Without Element Can Destroy Ċ import Ġcom . avail . descriptor . sets . Set Descriptor Ċ import Ġcom . avail . descriptor . sets . Set Descriptor . Companion . empty Set Ċ import Ġcom . avail . descriptor . tuples . A _ String Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple . Companion . component 1 Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple . Companion . component 2 Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple . Companion . tuple At Ċ import Ġcom . avail . descriptor . tuples . Object Tuple Descriptor . Companion . generate Object Tuple From Ċ import Ġcom . avail . descriptor . tuples . Object Tuple Descriptor . Companion . tuple Ċ import Ġcom . avail . descriptor . tuples . Object Tuple Descriptor . Companion . tuple From List Ċ import Ġcom . avail . descriptor . tuples . String Descriptor . Companion . string From Ċ import Ġcom . avail . descriptor . types . A _ Type Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . fieldType Map Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . is Subtype Of Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . is Sup ertype Of ObjectType Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . type Intersection Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . type Intersection Of ObjectType Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . type Union Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . type Union Of ObjectType Ċ import Ġcom . avail . descriptor . types . Abstract Enumeration TypeDescriptor . Companion . instance Type Or Meta On Ċ import Ġcom . avail . descriptor . types . Bottom TypeDescriptor . Companion . bottom Ċ import Ġcom . avail . descriptor . types . Instance Meta Descriptor Ċ import Ġcom . avail . descriptor . types . Instance Meta Descriptor . Companion . instance Meta Ċ import Ġcom . avail . descriptor . types . Instance TypeDescriptor . Companion . instance Type Ċ import Ġcom . avail . descriptor . types . TypeDescriptor Ċ import Ġcom . avail . descriptor . types . Type Tag Ċ import Ġcom . avail . serialization . Serializer Operation Ċ import Ġcom . avail . utility . Strings . newline Tab Ċ import Ġcom . avail . utility . json . JSON Writer Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . Identity HashMap Ċ import Ġjava . util . Weak HashMap Ċ Ċ /** Ċ Ġ* Ġ[ ObjectType Descriptor ] Ġrepresents Ġan ĠAv ail Ġobject Ġtype . ĠAn Ġobject Ġtype Ċ Ġ* Ġassoci ates Ġ[ fields ][ Atom Descriptor ] Ġwith Ġ[ types ][ TypeDescriptor ]. ĠAn Ġobject Ċ Ġ* Ġtype 's Ġinstances Ġhave Ġat Ġleast Ġthe Ġsame Ġfields Ġand Ġfield Ġvalues Ġthat Ġare Ċ Ġ* Ġinstances Ġof Ġthe Ġcorresponding Ġtypes . Ċ Ġ* Ċ Ġ* Ġ@ constructor Ċ Ġ* Ċ Ġ* Ġ@ param Ġmut ability Ċ Ġ* ĠĠ ĠThe Ġ[ Mut ability ] Ġof Ġthe Ġnew Ġdescriptor . Ċ Ġ* Ġ@ param Ġvariant Ċ Ġ* ĠĠ ĠThe Ġ[ Object Layout Variant ] Ġfor Ġthe Ġnew Ġdescriptor . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark Ġvan ĠG ul ik Ġ& lt ; mark @ avail lang . org & gt ; Ċ Ġ* Ġ@ author ĠT odd ĠL ĠSmith Ġ& lt ; tod d @ avail lang . org & gt ; Ċ Ġ*/ Ċ class ĠObjectType Descriptor Ġinternal Ġconstructor ( Ċ ĉ mut ability : ĠMut ability , Ċ ĉ val Ġvariant : ĠObject Layout Variant Ċ ) Ġ: ĠType Descriptor ( Ċ ĉ mut ability , Ċ ĉ Type Tag . OBJECT _ TAG , Ċ ĉ Object Slots :: class . java , Ċ ĉ Integer Slots :: class . java Ċ ) Ġ{ Ċ ĉ /** Ċĉ Ġ* ĠThe Ġlayout Ġof Ġinteger Ġslots Ġfor Ġmy Ġinstances . Ċĉ Ġ*/ Ċ ĉ enum Ġclass ĠInteger Slots Ġ: ĠInteger Slots Enum Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġlow Ġ 3 2 Ġbits Ġare Ġused Ġfor Ġthe Ġ[ HASH _ OR _ ZERO ]. Ċĉĉ Ġ*/ Ċĉ ĉ HASH _ AND _ MORE ; ĊĊĉ ĉ comp anion Ġobject Ġ{ Ċĉĉ ĉ /** Ċĉĉĉ Ġ* ĠA Ġbit Ġfield Ġto Ġhold Ġthe Ġcached Ġhash Ġvalue Ġof Ġan Ġobject Ġtype . Ġ ĠIf Ċĉĉĉ Ġ* Ġzero , Ġthe Ġhash Ġvalue Ġmust Ġbe Ġcomputed Ġupon Ġrequest . Ġ ĠNote Ġthat Ġin Ċĉĉĉ Ġ* Ġthe Ġvery Ġrare Ġcase Ġthat Ġthe Ġhash Ġvalue Ġactually Ġequals Ġzero , Ġthe Ċĉĉĉ Ġ* Ġhash Ġvalue Ġhas Ġto Ġbe Ġcomputed Ġevery Ġtime Ġit Ġis Ġrequested . Ċĉĉĉ Ġ*/ Ċĉĉ ĉ @ Jvm Field Ċĉĉ ĉ val ĠHASH _ OR _ ZERO Ġ= ĠBit Field ( HASH _ AND _ MORE , Ġ 0 , Ġ 3 2 ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġlayout Ġof Ġobject Ġslots Ġfor Ġmy Ġinstances . Ċĉ Ġ*/ Ċ ĉ enum Ġclass ĠObject Slots Ġ: ĠObject Slots Enum Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġtypes Ġassociated Ġwith Ġkeys Ġfor Ġthis Ġobject . Ġ ĠThe Ġassignment Ġof Ċĉĉ Ġ* Ġobject Ġfields Ġto Ġthese Ġslots Ġis Ġdetermined Ġby Ġthe Ġdescriptor 's Ċĉĉ Ġ* Ġ[ variant ]. Ċĉĉ Ġ*/ Ċĉ ĉ FIELD _ TYPES _ Ċ ĉ } ĊĊ ĉ public Ġoverride Ġfun Ġallows Immutable To Mutable Reference In Field ( Ċĉ ĉ e : ĠAbstract Slots Enum Ċ ĉ ) Ġ= Ċĉ ĉ e Ġ=== ĠInteger Slots . HASH _ AND _ MORE ĊĊ ĉ override Ġfun Ġprint Object On Avoid ing Indent ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ builder : ĠStringBuilder , Ċĉ ĉ recursion Map : ĠIdentity HashMap < A _ Basic Object , ĠVoid >, Ċĉ ĉ indent : ĠInt Ċ ĉ ) Ġ= Ġwith ( builder ) Ġ{ Ċĉ ĉ val Ġmy FieldType Map Ġ= Ġself . fieldType Map () Ċĉ ĉ val Ġ( names , Ġbase Types ) Ġ= Ġnames And Base Types For ObjectType ( self ) Ċĉ ĉ when Ġ{ Ċĉĉ ĉ names . setSize () Ġ== Ġ 0 Ġ-> Ġappend (" object ") Ċĉĉ ĉ else Ġ-> Ġappend ( Ċĉĉĉ ĉ names . map Ġ{ Ġit . as Native String () Ġ}. sorted (). join ToString (" ĠâĪ© Ġ")) Ċĉ ĉ } Ċĉ ĉ val Ġexplicit Subclass ing Key Ġ= ĠEX PL IC IT _ SUB CLASS ING _ KEY . atom Ċĉ ĉ var Ġignore Keys Ġ= Ġempty Set Ċĉ ĉ base Types . forEach Ġ{ Ġbase Type Ġ-> Ċĉĉ ĉ base Type . fieldType Map (). map Iterable (). forEach Ġ{ Ġ( atom , Ġtype ) Ġ-> Ċĉĉĉ ĉ if Ġ(! atom . get Atom Property ( explicit Subclass ing Key ). equals Nil () Ċĉĉĉĉ ĉ || Ġmy FieldType Map . map At ( atom ). equals ( type )) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ ignore Keys Ġ= Ġignore Keys . set With Element Can Destroy ( atom , Ġtrue ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ var Ġfirst Ġ= Ġtrue Ċĉ ĉ self . fieldType Map (). map Iterable (). forEach Ġ{ Ġ( key , Ġtype ) Ġ-> Ċĉĉ ĉ if Ġ(! ignore Keys . has Element ( key )) Ġ{ Ċĉĉĉ ĉ append ( if Ġ( first ) Ġ" Ġwith :" Ġelse Ġ", ") Ċĉĉĉ ĉ first Ġ= Ġfalse Ċĉĉĉ ĉ newline Tab ( builder , Ġindent ) Ċĉĉĉ ĉ append ( key . atom Name (). as Native String ()) Ċĉĉĉ ĉ append (" Ġ: Ġ") Ċĉĉĉ ĉ type . print On Avoid ing Indent ( builder , Ġrecursion Map , Ġindent Ġ+ Ġ 1 ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠShow Ġthe Ġfields Ġnicely . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġo _ Describe For Debugger ( Ċĉ ĉ self : ĠAv ail Object Ċ ĉ ): ĠArray < Avail Object Field Helper > Ġ{ Ċĉ ĉ val Ġfields Ġ= Ġmutable ListOf < Avail Object Field Helper >() Ċĉ ĉ val Ġother Atoms Ġ= Ġmutable ListOf < A _ Atom >() Ċĉ ĉ variant . field To Slot Index . forEach Ġ{ Ġ( field Key , Ġindex ) Ġ-> Ċĉĉ ĉ when Ġ( index ) Ġ{ Ċĉĉĉĉ 0 Ġ-> Ġother Atoms . add ( field Key ) Ċĉĉĉ ĉ else Ġ-> Ġfields . add ( Ċĉĉĉĉ ĉ Avail Object Field Helper ( Ċĉĉĉĉĉ ĉ self , Ċĉĉĉĉĉ ĉ Debugger Object Slots ( Ċĉĉĉĉĉĉ ĉ " FIELD ĠTYPE Ġ${ field Key . atom Name ()} "), Ċĉĉĉĉĉ ĉ - 1 , Ċĉĉĉĉĉ ĉ self . slot ( FIELD _ TYPES _, Ġindex ))) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ fields . sortBy ( Avail Object Field Helper :: name For Debugger ) Ċĉ ĉ if Ġ( other Atoms . isNotEmpty ()) Ġ{ Ċĉĉ ĉ fields . add ( Ċĉĉĉ ĉ Avail Object Field Helper ( Ċĉĉĉĉ ĉ self , Ċĉĉĉĉ ĉ Debugger Object Slots (" SUB CLASS _ FIELDS "), Ċĉĉĉĉ ĉ - 1 , Ċĉĉĉĉ ĉ tuple From List ( other Atoms ))) Ċĉ ĉ } Ċĉ ĉ return Ġfields . to Typed Array () Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Equals ( self : ĠAv ail Object , Ġanother : ĠA _ Basic Object ) Ġ= Ċĉ ĉ another . equals ObjectType ( self ) ĊĊ ĉ override Ġfun Ġo _ Equals ObjectType ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ an ObjectType : ĠAv ail Object Ċ ĉ ): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( self . same Address As ( an ObjectType )) Ġreturn Ġtrue Ċĉ ĉ val Ġother Descriptor Ġ= Ġan ObjectType . descriptor () Ġas ĠObjectType Descriptor Ċĉ ĉ if Ġ( variant Ġ!== Ġother Descriptor . variant ) Ġreturn Ġfalse Ċĉ ĉ // ĠIf Ġone Ġof Ġthe Ġhashes Ġis Ġalready Ġcomputed , Ġcompute Ġthe Ġother Ġif Ċĉ ĉ // Ġnecessary , Ġthen Ġcompare Ġthe Ġhashes Ġto Ġeliminate Ġthe Ġvast Ġmajority Ġof Ċĉ ĉ // Ġthe Ġun equal Ġcases . Ċĉ ĉ var Ġmy Hash Ġ= Ġself . slot ( HASH _ OR _ ZERO ) Ċĉ ĉ var Ġother Hash Ġ= Ġan ObjectType . slot ( HASH _ OR _ ZERO ) Ċĉ ĉ when Ġ{ Ċĉĉ ĉ my Hash Ġ!= Ġ 0 Ġ&& Ġother Hash Ġ== Ġ 0 Ġ-> Ġother Hash Ġ= Ġan ObjectType . hash () Ċĉĉ ĉ other Hash Ġ!= Ġ 0 Ġ&& Ġmy Hash Ġ== Ġ 0 Ġ-> Ġmy Hash Ġ= Ġself . hash () Ċĉ ĉ } Ċĉ ĉ // ĠHas hes Ġare Ġequal . Ġ ĠCompare Ġfield Ġtypes , Ġwhich Ġmust Ġbe Ġin Ċĉ ĉ // Ġcorresponding Ġpositions Ġbecause Ġwe Ġshare Ġthe Ġsame Ġvariant . Ċĉ ĉ when Ġ{ Ċĉĉ ĉ my Hash Ġ!= Ġother Hash Ġ-> Ġreturn Ġfalse Ċĉĉ ĉ ( 1 .. self . variable Object Slots Count ()). any Ġ{ Ċĉĉĉ ĉ ! self . slot ( FIELD _ TYPES _, Ġit ). equals ( Ċĉĉĉĉ ĉ an ObjectType . slot ( FIELD _ TYPES _, Ġit )) Ċĉĉ ĉ } Ġ-> Ġreturn Ġfalse Ċĉĉ ĉ ! is Shared Ġ-> Ġself . be come Ind irection To ( an ObjectType ) Ċĉĉ ĉ ! other Descriptor . is Shared Ġ-> Ġan ObjectType . be come Ind irection To ( self ) Ċĉ ĉ } Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ FieldType At ( self : ĠAv ail Object , Ġfield : ĠA _ Atom ): ĠA _ Type Ġ= Ċĉ ĉ // ĠF ails Ġwith ĠNullPointerException Ġif Ġkey Ġis Ġnot Ġfound . Ċĉ ĉ when Ġ( val Ġslot Index Ġ= Ġvariant . field To Slot Index [ field ]) Ġ{ Ċĉĉĉ 0 Ġ-> Ġinstance Type ( field ) Ċĉĉ ĉ else Ġ-> Ġself . slot ( FIELD _ TYPES _, Ġslot Index !! ) Ċĉ ĉ } ĊĊ ĉ override Ġfun Ġo _ FieldType At OrNull ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ field : ĠA _ Atom Ċ ĉ ): ĠA _ Type ? Ġ= Ċĉ ĉ when Ġ( val Ġslot Index Ġ= Ġvariant . field To Slot Index [ field ]) Ġ{ Ċĉĉ ĉ null Ġ-> Ġnull Ċĉĉĉ 0 Ġ-> Ġinstance Type ( field ) Ċĉĉ ĉ else Ġ-> Ġself . slot ( FIELD _ TYPES _, Ġslot Index ) Ċĉ ĉ } ĊĊ ĉ override Ġfun Ġo _ FieldType Map ( self : ĠAv ail Object ): ĠA _ Map Ċ ĉ { Ċĉ ĉ // ĠWarning : ĠMay Ġbe Ġmuch Ġslower Ġthan Ġit Ġwas Ġbefore ĠObject Layout Variant . Ċĉ ĉ return Ġvariant . field To Slot Index . entries . fold ( empty Map ) Ġ{ Ċĉĉ ĉ map , Ġ( field , Ġslot Index ) Ġ-> Ċĉĉ ĉ map . map At Put ting Can Destroy ( Ċĉĉĉ ĉ field , Ċĉĉĉ ĉ if Ġ( slot Index Ġ== Ġ 0 ) Ġinstance Type ( field ) Ċĉĉĉ ĉ else Ġself . slot ( FIELD _ TYPES _, Ġslot Index ), Ċĉĉĉ ĉ true ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ FieldType Tuple ( self : ĠAv ail Object ): ĠA _ Tuple Ċ ĉ { Ċĉ ĉ val Ġfield Iterator Ġ= Ġvariant . field To Slot Index . entries . iterator () Ċĉ ĉ return Ġgenerate Object Tuple From ( variant . field To Slot Index . size ) Ġ{ Ċĉĉ ĉ val Ġ( field , Ġslot Index ) Ġ= Ġfield Iterator . next () Ċĉĉ ĉ if Ġ( slot Index Ġ== Ġ 0 ) Ġtuple ( field , Ġinstance Type ( field )) Ċĉĉ ĉ else Ġtuple ( field , Ġself . slot ( FIELD _ TYPES _, Ġslot Index )) Ċĉ ĉ }. also Ġ{ Ġassert (! field Iterator . hasNext ()) Ġ} Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Hash ( self : ĠAv ail Object ) Ġ= Ċĉ ĉ when Ġ( val Ġhash Ġ= Ġself . slot ( HASH _ OR _ ZERO )) Ġ{ Ċĉĉĉ 0 Ġ-> Ġ{ Ċĉĉĉ ĉ // ĠDon 't Ġlock Ġif Ġwe 're Ġshared . Ġ ĠMultiple Ġsimultaneous Ċĉĉĉ ĉ // Ġcomput ations Ġof Ġ* the Ġsame * Ġvalue Ġare Ġben ign Ġr aces . Ċĉĉĉ ĉ ( 1 .. self . variable Object Slots Count ()) Ċĉĉĉĉ ĉ . fold ( variant . variant Id Ġxor Ġ- 0 x 1 ca 9 e 0 ea ) Ġ{ Ġh , Ġi Ġ-> Ċĉĉĉĉĉ ĉ ( h Ġ* Ġmultiplier ) Ġ- Ġself . slot ( FIELD _ TYPES _, Ġi ). hash () Ċĉĉĉĉ ĉ }. also Ġ{ Ġself . set Slot ( HASH _ OR _ ZERO , Ġit ) Ġ} Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġhash Ċĉ ĉ } ĊĊ ĉ override Ġfun Ġo _ Has Object Instance ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ potential Instance : ĠAv ail Object Ċ ĉ ): ĠBoolean Ġ{ Ċĉ ĉ val Ġinstance Descriptor Ġ= Ċĉĉ ĉ potential Instance . descriptor () Ġas ĠObject Descriptor Ċĉ ĉ val Ġinstance Variant Ġ= Ġinstance Descriptor . variant Ċĉ ĉ if Ġ( instance Variant Ġ== Ġvariant ) Ġ{ Ċĉĉ ĉ // ĠThe Ġinstance Ġand ĠI Ġshare Ġa Ġvariant , Ġso Ġb last Ġthrough Ġthe Ġfields Ċĉĉ ĉ // Ġin Ġlock - step Ġdoing Ġinstance Ġchecks . Ċĉĉ ĉ return Ġ( 1 .. variant . real Slot Count ). all Ġ{ Ċĉĉĉ ĉ Object Descriptor . getField ( potential Instance , Ġit ) Ċĉĉĉĉ ĉ . isInstanceOf ( self . slot ( FIELD _ TYPES _, Ġit )) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ // ĠThe Ġvariants Ġdis agree . Ġ ĠFor Ġeach Ġfield Ġtype Ġin Ġthis Ġobject Ġtype , Ċĉ ĉ // Ġcheck Ġthat Ġthere Ġis Ġa Ġcorresponding Ġfield Ġvalue Ġin Ġthe Ġobject , Ġand Ċĉ ĉ // Ġthat Ġits Ġtype Ġcon forms . Ġ ĠFor Ġfield Ġtypes Ġthat Ġare Ġonly Ġfor Ġexplicit Ċĉ ĉ // Ġsubclass ing , Ġjust Ġmake Ġsure Ġthe Ġsame Ġfield Ġis Ġpresent Ġin Ġthe Ġobject . Ċĉ ĉ val Ġinstance Variant Slot Map Ġ= Ġinstance Variant . field To Slot Index Ċĉ ĉ return Ġvariant . field To Slot Index . all Ġ{ Ġ( field , Ġslot Index ) Ġ-> Ċĉĉ ĉ when Ġ( slot Index ) Ġ{ Ċĉĉĉĉ 0 Ġ-> Ġinstance Variant Slot Map . containsKey ( field ) Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġinstance Slot Index Ġ= Ġinstance Variant Slot Map [ field ] Ċĉĉĉĉĉ ĉ ?: Ġreturn Ġfalse Ċĉĉĉĉ ĉ assert ( instance Slot Index Ġ!= Ġ 0 ) Ċĉĉĉĉ ĉ val Ġfield Value : ĠA _ Basic Object Ġ= ĠObject Descriptor . getField ( Ċĉĉĉĉĉ ĉ potential Instance , Ġinstance Slot Index ) Ċĉĉĉĉ ĉ field Value . isInstanceOf ( self . slot ( FIELD _ TYPES _, Ġslot Index )) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Is Subtype Of ( self : ĠAv ail Object , Ġa Type : ĠA _ Type ) Ġ= Ċĉ ĉ a Type . is Sup ertype Of ObjectType ( self ) ĊĊ ĉ override Ġfun Ġo _ Is Sup ertype Of ObjectType ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ an ObjectType : ĠAv ail Object Ċ ĉ ): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( self . same Address As ( an ObjectType )) Ġreturn Ġtrue Ċĉ ĉ val Ġsubtype Descriptor Ġ= Ċĉĉ ĉ an ObjectType . descriptor () Ġas ĠObjectType Descriptor Ċĉ ĉ val Ġsubtype Variant Ġ= Ġsubtype Descriptor . variant Ċĉ ĉ if Ġ( subtype Variant Ġ== Ġvariant ) Ġ{ Ċĉĉ ĉ // ĠThe Ġpotential Ġsubtype Ġand ĠI Ġshare Ġa Ġvariant , Ġso Ġb last Ġthrough Ġthe Ċĉĉ ĉ // Ġfields Ġin Ġlock - step Ġdoing Ġsubtype Ġchecks . Ċĉĉ ĉ return Ġ( 1 .. variant . real Slot Count ). all Ġ{ Ċĉĉĉ ĉ val Ġsubtype FieldType Ġ= Ġan ObjectType . slot ( FIELD _ TYPES _, Ġit ) Ċĉĉĉ ĉ val Ġmy FieldType Ġ= Ġself . slot ( FIELD _ TYPES _, Ġit ) Ċĉĉĉ ĉ subtype FieldType . is Subtype Of ( my FieldType ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ // ĠThe Ġvariants Ġdis agree . Ġ ĠDo Ġsome Ġquick Ġfield Ġcount Ġchecks Ġfirst . Ġ ĠNote Ċĉ ĉ // Ġthat Ġsince Ġvariants Ġare Ġcan on ized Ġby Ġthe Ġset Ġof Ġfields , Ġwe Ġcan Ġsafely Ċĉ ĉ // Ġassume Ġthat Ġthe Ġsubtype Ġhas Ġ* strict ly * Ġmore Ġfields Ġthan Ġthe Ċĉ ĉ // Ġsup ertype ... Ġbut Ġalso Ġnote Ġthat Ġthe Ġnumber Ġof Ġreal Ġslots Ġcan Ġstill Ġbe Ċĉ ĉ // Ġequal Ġwhile Ġsatisf ying Ġthe Ġnot - same - variant Ġbut Ġis - subtype . Ċĉ ĉ if Ġ( subtype Variant . real Slot Count Ġ< Ġvariant . real Slot Count Ċĉĉ ĉ || Ġsubtype Variant . field To Slot Index . size Ġ<= Ċĉĉĉ ĉ variant . field To Slot Index . size ) Ġ{ Ċĉĉ ĉ return Ġfalse Ċĉ ĉ } Ċĉ ĉ // ĠFor Ġeach Ġof Ġmy Ġfields , Ġcheck Ġthat Ġthe Ġfield Ġis Ġpresent Ġin Ġthe Ċĉ ĉ // Ġpotential Ġsubtype , Ġand Ġthat Ġits Ġtype Ġis Ġa Ġsubtype Ġof Ġmy Ġfield 's Ġtype . Ċĉ ĉ val Ġsubtype Variant Slot Map Ġ= Ġsubtype Variant . field To Slot Index Ċĉ ĉ return Ġvariant . field To Slot Index . all Ġ{ Ġ( field , Ġsup ertype Slot Index ) Ġ-> Ċĉĉ ĉ when Ġ( sup ertype Slot Index ) Ġ{ Ċĉĉĉĉ 0 Ġ-> Ġsubtype Variant Slot Map . containsKey ( field ) Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġsubtype Slot Index Ġ= Ġsubtype Variant Slot Map [ field ] Ċĉĉĉĉĉ ĉ ?: Ġreturn Ġfalse Ċĉĉĉĉ ĉ assert ( subtype Slot Index Ġ!= Ġ 0 ) Ċĉĉĉĉ ĉ val Ġsubtype FieldType Ġ= Ċĉĉĉĉĉ ĉ an ObjectType . slot ( FIELD _ TYPES _, Ġsubtype Slot Index ) Ċĉĉĉĉ ĉ val Ġsup ertype FieldType Ġ= Ċĉĉĉĉĉ ĉ self . slot ( FIELD _ TYPES _, Ġsup ertype Slot Index ) Ċĉĉĉĉ ĉ subtype FieldType . is Subtype Of ( sup ertype FieldType ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Is Vac u ous Type ( self : ĠAv ail Object ) Ġ= Ċĉ ĉ ( 1 .. self . variable Object Slots Count ()). any Ġ{ Ċĉĉ ĉ self . slot ( FIELD _ TYPES _, Ġit ). is Vac u ous Type Ċĉ ĉ } ĊĊ ĉ override Ġfun Ġo _ Make Shared ( self : ĠAv ail Object ): ĠAv ail Object Ċ ĉ { Ċĉ ĉ if Ġ( is Shared ) Ġreturn Ġself Ċĉ ĉ self . set Descriptor ( self . descriptor (). shared ()) Ċĉ ĉ self . make Sub objects Shared () Ċĉ ĉ var Ġcanonical : ĠAv ail Object ? Ċĉ ĉ do Ċĉ ĉ { Ċĉĉ ĉ canonical Ġ= Ġsynchronized ( shared Canonical Types ) Ġ{ Ċĉĉĉ ĉ shared Canonical Types . get Or Put ( self ) Ġ{ Ċĉĉĉĉ ĉ // ĠSelf Ġwas Ġmade Ġshared Ġabove , Ġbut Ġhas Ġnot Ġbeen Ġmade Ġvisible Ċĉĉĉĉ ĉ // Ġto Ġother Ġfib ers Ġyet . Ġ ĠC lobber Ġit Ġinto Ġan Ġind irection Ċĉĉĉĉ ĉ Weak Reference ( self ) Ċĉĉĉ ĉ }. get () Ċĉĉ ĉ } Ċĉĉ ĉ // ĠAn Ġolder Ġsoft Ġreference Ġmight Ġhave Ġbeen Ġfound , Ġthen Ġcleared Ġby Ċĉĉ ĉ // Ġthe ĠJVM . Ġ ĠJust Ġtry Ġagain Ġuntil Ġwe 're Ġsuccessful Ġ( and Ġtherefore Ċĉĉ ĉ // Ġhave Ġa Ġstrong Ġreference Ġthat Ġprevents Ġit Ġfrom Ġdis sol ving ). Ċĉ ĉ } Ċĉ ĉ while Ġ( canonical Ġ=== Ġnull ) ĊĊĉ ĉ if Ġ( canonical . same Address As ( self )) Ġreturn Ġcanonical Ċĉ ĉ // ĠThis Ġnewly Ġshared Ġinstance Ġwas Ġ* not * Ġthe Ġone Ġin Ġthe Ġmap . Ċĉ ĉ // ĠTherefore , Ġno Ġother Ġfiber Ġhas Ġseen Ġit Ġyet , Ġso Ġc lobber Ġit Ġinto Ġan Ċĉ ĉ // Ġind irection . Ċĉ ĉ self . set Descriptor ( self . descriptor (). mutable ()) Ċĉ ĉ self . be come Ind irection To ( canonical ) Ċĉ ĉ self . make Shared () Ċĉ ĉ return Ġcanonical Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Intersection ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ another : ĠA _ Type Ċ ĉ ): ĠA _ Type Ġ= Ġwhen Ġ{ Ċĉ ĉ self . is Subtype Of ( another ) Ġ-> Ġself Ċĉ ĉ another . is Subtype Of ( self ) Ġ-> Ġanother Ċĉ ĉ else Ġ-> Ġanother . type Intersection Of ObjectType ( self ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAnswer Ġthe Ġmost Ġgeneral Ġtype Ġthat Ġis Ġstill Ġat Ġleast Ġas Ġspecific Ġas Ġthese . Ċĉ Ġ* ĠHere Ġwe 're Ġfinding Ġthe Ġnearest Ġcommon Ġdesc endant Ġof Ġtwo Ġobject Ġtypes . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġo _ Type Intersection Of ObjectType ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ an ObjectType : ĠAv ail Object Ċ ĉ ): ĠA _ Type Ġ{ Ċĉ ĉ val Ġother Descriptor Ġ= Ġan ObjectType . descriptor () Ġas ĠObjectType Descriptor Ċĉ ĉ val Ġother Variant Ġ= Ġother Descriptor . variant Ċĉ ĉ if Ġ( other Variant Ġ== Ġvariant ) Ġ{ Ċĉĉ ĉ // ĠField Ġslot Ġindices Ġagree , Ġso Ġb last Ġthrough Ġthe Ġslots Ġin Ġorder . Ċĉĉ ĉ return Ġvariant . mutable ObjectType Descriptor . create ( Ċĉĉĉ ĉ variant . real Slot Count Ċĉĉ ĉ ) Ġ{ Ċĉĉĉ ĉ ( 1 .. variant . real Slot Count ). forEach Ġ{ Ċĉĉĉĉ ĉ val Ġfield Intersection Ġ= Ċĉĉĉĉĉ ĉ self . slot ( FIELD _ TYPES _, Ġit ). type Intersection ( Ċĉĉĉĉĉĉ ĉ an ObjectType . slot ( FIELD _ TYPES _, Ġit )) Ċĉĉĉĉ ĉ if Ġ( field Intersection . is Bottom ) Ġ{ Ċĉĉĉĉĉ ĉ // ĠAb and on Ġthe Ġpartially Ġbuilt Ġobject Ġtype . Ċĉĉĉĉĉ ĉ return Ġbottom Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ set Slot ( FIELD _ TYPES _, Ġit , Ġfield Intersection ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ // ĠThe Ġvariants Ġdis agree , Ġso Ġdo Ġit Ġthe Ġhard ( er ) Ġway . Ċĉ ĉ val Ġmerged Fields Ġ= Ġvariant . all Fields . set Union Can Destroy ( Ċĉĉ ĉ other Variant . all Fields , Ġfalse ) Ċĉ ĉ val Ġresult Variant Ġ= Ġvariant For Fields ( merged Fields ) Ċĉ ĉ val Ġmy Slot Map Ġ= Ġvariant . field To Slot Index Ċĉ ĉ val Ġother Slot Map Ġ= Ġother Variant . field To Slot Index Ċĉ ĉ val Ġresult Slot Map Ġ= Ġresult Variant . field To Slot Index Ċĉ ĉ return Ġresult Variant . mutable ObjectType Descriptor . create ( Ċĉĉ ĉ result Variant . real Slot Count Ċĉ ĉ ) Ġ{ Ċĉĉ ĉ result Slot Map . forEach Ġ{ Ġ( field , Ġresult Slot Index ) Ġ-> Ċĉĉĉ ĉ if Ġ( result Slot Index Ġ> Ġ 0 ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġmy Slot Index Ġ= Ġmy Slot Map [ field ] Ċĉĉĉĉ ĉ val Ġother Slot Index Ġ= Ġother Slot Map [ field ] Ċĉĉĉĉ ĉ val ĠfieldType Ġ= Ġwhen Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ my Slot Index Ġ=== Ġnull Ġ-> Ċĉĉĉĉĉĉ ĉ an ObjectType . slot ( FIELD _ TYPES _, Ġother Slot Index !! ) Ċĉĉĉĉĉ ĉ other Slot Index Ġ=== Ġnull Ġ-> Ċĉĉĉĉĉĉ ĉ self . slot ( FIELD _ TYPES _, Ġmy Slot Index ) Ċĉĉĉĉĉ ĉ else Ġ-> Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ val Ġintersection Ġ= Ġself Ċĉĉĉĉĉĉĉ ĉ . slot ( FIELD _ TYPES _, Ġmy Slot Index ) Ċĉĉĉĉĉĉĉ ĉ . type Intersection ( Ċĉĉĉĉĉĉĉĉ ĉ an ObjectType . slot ( Ċĉĉĉĉĉĉĉĉĉ ĉ FIELD _ TYPES _, Ċĉĉĉĉĉĉĉĉĉ ĉ other Slot Index )) Ċĉĉĉĉĉĉ ĉ if Ġ( intersection . is Bottom ) Ġreturn Ġbottom Ċĉĉĉĉĉĉ ĉ intersection Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ set Slot ( FIELD _ TYPES _, Ġresult Slot Index , ĠfieldType ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Type Union ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ another : ĠA _ Type Ċ ĉ ): ĠA _ Type Ġ= Ġwhen Ġ{ Ċĉ ĉ self . is Subtype Of ( another ) Ġ-> Ġanother Ċĉ ĉ another . is Subtype Of ( self ) Ġ-> Ġself Ċĉ ĉ else Ġ-> Ġanother . type Union Of ObjectType ( self ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAnswer Ġthe Ġmost Ġspecific Ġtype Ġthat Ġis Ġstill Ġat Ġleast Ġas Ġgeneral Ġas Ġthese . Ċĉ Ġ* ĠHere Ġwe 're Ġfinding Ġthe Ġnearest Ġcommon Ġancestor Ġof Ġtwo Ġeager Ġobject Ġtypes . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġo _ Type Union Of ObjectType ( Ċĉ ĉ self : ĠAv ail Object , Ċĉ ĉ an ObjectType : ĠAv ail Object Ċ ĉ ): ĠA _ Type Ġ{ Ċĉ ĉ val Ġother Descriptor Ġ= Ġan ObjectType . descriptor () Ġas ĠObjectType Descriptor Ċĉ ĉ val Ġother Variant Ġ= Ġother Descriptor . variant Ċĉ ĉ if Ġ( other Variant Ġ== Ġvariant ) Ġ{ Ċĉĉ ĉ // ĠField Ġslot Ġindices Ġagree , Ġso Ġb last Ġthrough Ġthe Ġslots Ġin Ġorder . Ċĉĉ ĉ return Ġvariant . mutable ObjectType Descriptor . create ( Ċĉĉĉ ĉ variant . real Slot Count Ċĉĉ ĉ ) Ġ{ Ċĉĉĉ ĉ ( 1 .. variant . real Slot Count ). forEach Ġ{ Ċĉĉĉĉ ĉ val Ġfield Union Ġ= Ġself . slot ( FIELD _ TYPES _, Ġit ). type Union ( Ċĉĉĉĉĉ ĉ an ObjectType . slot ( FIELD _ TYPES _, Ġit )) Ċĉĉĉĉ ĉ set Slot ( FIELD _ TYPES _, Ġit , Ġfield Union ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ // ĠThe Ġvariants Ġdis agree , Ġso Ġdo Ġit Ġthe Ġhard ( er ) Ġway . Ċĉ ĉ val Ġnarrow ed Fields Ġ= Ġvariant . all Fields . set Intersection Can Destroy ( Ċĉĉ ĉ other Variant . all Fields , Ġfalse ) Ċĉ ĉ val Ġresult Variant Ġ= Ġvariant For Fields ( narrow ed Fields ) Ċĉ ĉ val Ġmy Slot Map Ġ= Ġvariant . field To Slot Index Ċĉ ĉ val Ġother Slot Map Ġ= Ġother Variant . field To Slot Index Ċĉ ĉ val Ġresult Slot Map Ġ= Ġresult Variant . field To Slot Index Ċĉ ĉ return Ġresult Variant . mutable ObjectType Descriptor . create ( Ċĉĉ ĉ result Variant . real Slot Count Ċĉ ĉ ) Ġ{ Ċĉĉ ĉ result Slot Map . forEach Ġ{ Ġ( field , Ġresult Slot Index ) Ġ-> Ċĉĉĉ ĉ if Ġ( result Slot Index Ġ> Ġ 0 ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ @ Suppress (" Map Get With NotNull Assertion Operator ") Ċĉĉĉĉ ĉ val Ġmy Slot Index Ġ= Ġmy Slot Map [ field ] !! Ċĉĉĉĉ ĉ @ Suppress (" Map Get With NotNull Assertion Operator ") Ċĉĉĉĉ ĉ val Ġother Slot Index Ġ= Ġother Slot Map [ field ] !! Ċĉĉĉĉ ĉ val ĠfieldType Ġ= Ġself Ċĉĉĉĉĉ ĉ . slot ( FIELD _ TYPES _, Ġmy Slot Index ) Ċĉĉĉĉĉ ĉ . type Union ( Ċĉĉĉĉĉĉ ĉ an ObjectType . slot ( FIELD _ TYPES _, Ġother Slot Index )) Ċĉĉĉĉ ĉ set Slot ( FIELD _ TYPES _, Ġresult Slot Index , ĠfieldType ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Thread Safe Ċ ĉ override Ġfun Ġo _ Serializer Operation ( self : ĠAv ail Object ) Ġ= Ċĉ ĉ Serializer Operation . OBJECT _ TYPE ĊĊ ĉ override Ġfun Ġo _ WriteTo ( self : ĠAv ail Object , Ġwriter : ĠJSON Writer ) Ġ= Ċĉ ĉ writer . write Object Ġ{ Ċĉĉ ĉ at (" kind ") Ġ{ Ġwrite (" object Ġtype ") Ġ} Ċĉĉ ĉ self . fieldType Map (). map Iterable (). forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ċĉĉĉ ĉ key . atom Name (). writeTo ( writer ) Ċĉĉĉ ĉ value . writeTo ( writer ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ override Ġfun Ġo _ Write Summary To ( self : ĠAv ail Object , Ġwriter : ĠJSON Writer ) Ġ= Ċĉ ĉ writer . write Object Ġ{ Ċĉĉ ĉ at (" kind ") Ġ{ Ġwrite (" object Ġtype ") Ġ} Ċĉĉ ĉ self . fieldType Map (). map Iterable (). forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ċĉĉĉ ĉ key . atom Name (). writeTo ( writer ) Ċĉĉĉ ĉ value . write Summary To ( writer ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠGiven Ġan Ġ[ object ][ Object Descriptor ] Ġwhose Ġvariant Ġis Ġthis Ġmutable Ġobject Ċĉ Ġ* Ġtype Ġdescriptor 's Ġvariant , Ġcreate Ġan Ġobject Ġtype Ġwhose Ġfields Ġare Ċĉ Ġ* Ġpopulated Ġwith Ġinstance Ġtypes Ġbased Ġon Ġthe Ġobject 's Ġfields . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġself Ċĉ Ġ* ĠĠ ĠAn Ġobject . Ċĉ Ġ* Ġ@ return Ċĉ Ġ* ĠĠ ĠAn Ġobject Ġtype . Ċĉ Ġ*/ Ċ ĉ fun Ġcreate From Object ( self : ĠAv ail Object ): ĠAv ail Object Ġ= Ċĉ ĉ create ( variant . real Slot Count ) Ġ{ Ċĉĉ ĉ ( 1 .. variant . real Slot Count ). forEach Ġ{ Ċĉĉĉ ĉ val Ġfield Value Ġ= ĠObject Descriptor . getField ( self , Ġit ) Ċĉĉĉ ĉ set Slot ( FIELD _ TYPES _, Ġit , Ġinstance Type Or Meta On ( field Value )) Ċĉĉ ĉ } Ċĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉ ĉ } ĊĊ ĉ @ Deprecated ( Ċĉ ĉ " ObjectType Descriptors Ġare Ġorganized Ġby ĠObject Layout Variant ", Ċĉ ĉ level Ġ= ĠDeprec ation Level . HIDDEN ) Ċ ĉ override Ġfun Ġmutable () Ġ= Ġvariant . mutable ObjectType Descriptor ĊĊ ĉ @ Deprecated ( Ċĉ ĉ " ObjectType Descriptors Ġare Ġorganized Ġby ĠObject Layout Variant ", Ċĉ ĉ level Ġ= ĠDeprec ation Level . HIDDEN ) Ċ ĉ override Ġfun Ġimmutable () Ġ= Ġvariant . immutable ObjectType Descriptor ĊĊ ĉ @ Deprecated ( Ċĉ ĉ " ObjectType Descriptors Ġare Ġorganized Ġby ĠObject Layout Variant ", Ċĉ ĉ level Ġ= ĠDeprec ation Level . HIDDEN ) Ċ ĉ override Ġfun Ġshared () Ġ= Ġvariant . shared ObjectType Descriptor ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠA Ġcanonical Ġmapping Ġof Ġall Ġobject Ġtypes Ġthat Ġhave Ġbecome Ġshared . Ċĉĉ Ġ* ĠWithout Ġtoo Ġmuch Ġruntime Ġcost , Ġthis Ġshould Ġreduce Ġthe Ġmemory Ċĉĉ Ġ* Ġfoot print , Ġas Ġwell Ġas Ġimprove Ġthe Ġefficiency Ġof Ġ[ Object Descriptor ]' s Ċĉĉ Ġ* Ġ[ vet tings ][ Object Descriptor . Object Slots . TYPE _ V ET T INGS _ CACHE ] Ġcache . Ċĉĉ Ġ*/ Ċĉ ĉ val Ġshared Canonical Types Ġ= Ċĉĉ ĉ Weak HashMap < Avail Object , ĠWeak Reference < Avail Object >>() ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠExtract Ġthe Ġfield Ġtype Ġat Ġthe Ġspecified Ġslot Ġindex . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġself Ċĉĉ Ġ* ĠĠ ĠAn Ġobject Ġtype , Ġfully Ġtra versed . Ċĉĉ Ġ* Ġ@ param Ġslot Index Ċĉĉ Ġ* ĠĠ ĠThe Ġnon - zero Ġslot Ġindex . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġtype Ġof Ġthe Ġfield Ġat Ġthe Ġspecified Ġslot Ġindex . Ċĉĉ Ġ*/ Ċĉ ĉ @ Suppress (" unused ") Ċĉ ĉ fun Ġget FieldType ( Ċĉĉ ĉ self : ĠAv ail Object , Ċĉĉ ĉ slot Index : ĠInt Ċĉ ĉ ): ĠAv ail Object Ġ= Ġself . slot ( FIELD _ TYPES _, Ġslot Index ) ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠCreate Ġan Ġ` object Ġtype ` Ġusing Ġthe Ġgiven Ġ[ A _ Map ] Ġfrom Ġ[ A _ Atom ] s Ġto Ċĉĉ Ġ* Ġ[ types ][ TypeDescriptor ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġmap Ċĉĉ Ġ* ĠĠ ĠThe Ġmap Ġfrom Ġatoms Ġto Ġtypes . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġnew Ġ` object Ġtype `. Ċĉĉ Ġ*/ Ċĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġobject Type From Map ( map : ĠA _ Map ): ĠAv ail Object Ġ{ Ċĉĉ ĉ val Ġvariant : ĠObject Layout Variant Ġ= Ġvariant For Fields ( map . keys As Set ()) Ċĉĉ ĉ val Ġmutable Descriptor Ġ= Ġvariant . mutable ObjectType Descriptor Ċĉĉ ĉ val Ġslot Map Ġ= Ġvariant . field To Slot Index Ċĉĉ ĉ return Ġmutable Descriptor . create ( variant . real Slot Count ) Ġ{ Ċĉĉĉ ĉ map . map Iterable (). forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> Ċĉĉĉĉ ĉ @ Suppress (" Map Get With NotNull Assertion Operator ") Ċĉĉĉĉ ĉ val Ġslot Index Ġ= Ġslot Map [ key ] !! Ċĉĉĉĉ ĉ if Ġ( slot Index Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ set Slot ( FIELD _ TYPES _, Ġslot Index , Ġvalue ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠCreate Ġan Ġ` object Ġtype ` Ġfrom Ġthe Ġspecified Ġ[ A _ Tuple ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġtuple Ċĉĉ Ġ* ĠĠ ĠA Ġtuple Ġwhose Ġelements Ġare Ġ 2 - tuples Ġwhose Ġfirst Ġelement Ġis Ġan Ċĉĉ Ġ* ĠĠ Ġ[ atom ][ Atom Descriptor ] Ġand Ġwhose Ġsecond Ġelement Ġis Ġa Ċĉĉ Ġ* ĠĠ Ġ[ type ][ TypeDescriptor ]. Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġnew Ġobject Ġtype . Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġobject Type From Tuple ( tuple : ĠA _ Tuple ): ĠAv ail Object Ġ= Ċĉĉ ĉ object Type From Map ( Ċĉĉĉ ĉ tuple . fold ( empty Map ) Ġ{ Ġm , Ġ( atom , Ġtype ) Ġ-> Ċĉĉĉĉ ĉ m . map At Put ting Can Destroy ( atom , Ġtype , Ġtrue ) Ċĉĉĉ ĉ }) ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠCreate Ġa Ġmutable Ġobject Ġtype Ġusing Ġthe Ġprovided Ċĉĉ Ġ* Ġ[ Object Layout Variant ], Ġbut Ġwithout Ġinitializing Ġits Ġfields . Ġ ĠThe Ċĉĉ Ġ* Ġcaller Ġis Ġresponsible Ġfor Ġinitializing Ġthe Ġfields Ġbefore Ġuse . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġvariant Ċĉĉ Ġ* ĠThe Ġ[ Object Layout Variant ] Ġto Ġinstantiate Ġas Ġan Ġobject Ġtype . Ċĉĉ Ġ* Ġ@ return ĠThe Ġnew Ġobject Ġtype . Ċĉĉ Ġ*/ Ċĉ ĉ @ Suppress (" unused ") Ċĉ ĉ fun Ġcreate Un initialized ObjectType ( Ċĉĉ ĉ variant : ĠObject Layout Variant Ċĉ ĉ ): ĠAv ail Object Ġ= Ċĉĉ ĉ variant . mutable ObjectType Descriptor . create ( variant . real Slot Count ) Ġ{ Ċĉĉĉ ĉ set Slot ( HASH _ OR _ ZERO , Ġ 0 ) Ċĉĉ ĉ } ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAssign Ġa Ġname Ġto Ġthe Ġspecified Ġ` object Ġtype `. Ġ ĠIf Ġthe Ġonly Ġfield Ġkey Ċĉĉ Ġ* Ġ[ A _ Atom ] s Ġin Ġthe Ġobject Ġtype Ġare Ċĉĉ Ġ* Ġ[ special &# 3 2 ; atoms ][ A _ Atom . Companion . is Atom Special ], Ġthen Ġthe Ġname Ċĉĉ Ġ* Ġwill Ġnot Ġbe Ġrecorded Ġ( unless Ġallow Special Atom sTo Hold Name Ġis Ġtrue , Ċĉĉ Ġ* Ġwhich Ġis Ġreally Ġonly Ġfor Ġnaming Ġspecial Ġobject Ġtypes Ġlike Ċĉĉ Ġ* Ġ[ exception Type ]). Ġ ĠNote Ġthat Ġit Ġis Ġtechnically Ġ* legal * Ġfor Ġthere Ġto Ċĉĉ Ġ* Ġbe Ġmultiple Ġnames Ġfor Ġa Ġparticular Ġobject Ġtype , Ġalthough Ġthis Ġis Ġof Ċĉĉ Ġ* Ġquestion able Ġvalue . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġan ObjectType Ċĉĉ Ġ* ĠĠ ĠAn Ġ` object Ġtype `. Ċĉĉ Ġ* Ġ@ param Ġa String Ċĉĉ Ġ* ĠĠ ĠA Ġname . Ċĉĉ Ġ* Ġ@ param Ġallow Special Atom sTo Hold Name Ċĉĉ Ġ* ĠĠ ĠWhether Ġto Ġallow Ġthe Ġobject Ġtype Ġname Ġto Ġbe Ġattached Ġto Ġa Ġspecial Ċĉĉ Ġ* ĠĠ Ġatom . Ċĉĉ Ġ*/ Ċĉ ĉ fun ĠsetName ForType ( Ċĉĉ ĉ an ObjectType : ĠA _ Type , Ċĉĉ ĉ a String : ĠA _ String , Ċĉĉ ĉ allow Special Atom sTo Hold Name : ĠBoolean Ċĉ ĉ ) Ġ{ Ċĉĉ ĉ assert ( a String . isString ) Ċĉĉ ĉ val Ġproperty Key Ġ= ĠOBJECT _ TYPE _ NAME _ PROPERTY _ KEY . atom Ċĉĉ ĉ synchronized ( property Key ) Ġ{ Ċĉĉĉ ĉ var Ġleast Names Ġ= ĠInt . MAX _ VALUE Ċĉĉĉ ĉ var Ġkey Atom With Least Names : ĠA _ Atom ? Ġ= Ġnull Ċĉĉĉ ĉ var Ġkey Atom Names Map : ĠA _ Map ? Ġ= Ġnull Ċĉĉĉ ĉ for Ġ(( atom , Ġ_) Ġin Ġan ObjectType . fieldType Map (). map Iterable ()) Ġ{ Ċĉĉĉĉ ĉ if Ġ( allow Special Atom sTo Hold Name Ġ|| Ġ! atom . is Atom Special ()) Ġ{ Ċĉĉĉĉĉ ĉ val Ġnames Map : ĠA _ Map Ġ= Ġatom . get Atom Property ( property Key ) Ċĉĉĉĉĉ ĉ if Ġ( names Map . equals Nil ()) Ġ{ Ċĉĉĉĉĉĉ ĉ key Atom With Least Names Ġ= Ġatom Ċĉĉĉĉĉĉ ĉ key Atom Names Map Ġ= Ġempty Map Ċĉĉĉĉĉĉ ĉ break Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ val Ġmap Size Ġ= Ġnames Map . map Size () Ċĉĉĉĉĉ ĉ if Ġ( map Size Ġ< Ġleast Names ) Ġ{ Ċĉĉĉĉĉĉ ĉ key Atom With Least Names Ġ= Ġatom Ċĉĉĉĉĉĉ ĉ key Atom Names Map Ġ= Ġnames Map Ċĉĉĉĉĉĉ ĉ least Names Ġ= Ġmap Size Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( key Atom With Least Names Ġ!== Ġnull ) Ġ{ Ċĉĉĉĉ ĉ var Ġnames Set Ġ= Ġwhen Ġ{ Ċĉĉĉĉĉ ĉ key Atom Names Map !!. has Key ( an ObjectType ) Ġ-> Ċĉĉĉĉĉĉ ĉ key Atom Names Map . map At ( an ObjectType ) Ċĉĉĉĉĉ ĉ else Ġ-> Ġempty Set Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ names Set Ġ= Ġnames Set . set With Element Can Destroy ( a String , Ġfalse ) Ċĉĉĉĉ ĉ key Atom Names Map Ġ= Ġkey Atom Names Map . map At Put ting Can Destroy ( Ċĉĉĉĉĉ ĉ an ObjectType , Ġnames Set , Ġtrue ) Ċĉĉĉĉ ĉ key Atom With Least Names . set Atom Property ( Ċĉĉĉĉĉ ĉ property Key , Ġkey Atom Names Map ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠRemove Ġa Ġtype Ġname Ġfrom Ġthe Ġspecified Ġuser - defined Ġobject Ġtype . Ġ ĠIf Ċĉĉ Ġ* Ġthe Ġobject Ġtype Ġdoes Ġnot Ġcurrently Ġhave Ġthe Ġspecified Ġtype Ġname , Ġor Ċĉĉ Ġ* Ġif Ġthis Ġname Ġhas Ġalready Ġbeen Ġremoved , Ġdo Ġnothing . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġa String Ċĉĉ Ġ* ĠĠ ĠA Ġname Ġto Ġdis associate Ġfrom Ġthe Ġtype . Ċĉĉ Ġ* Ġ@ param Ġan ObjectType Ċĉĉ Ġ* ĠĠ ĠAn ĠAv ail Ġobject Ġtype . Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġremove Name From Type ( Ċĉĉ ĉ a String : ĠA _ String , Ċĉĉ ĉ an ObjectType : ĠA _ Type Ċĉ ĉ ) Ġ{ Ċĉĉ ĉ assert ( a String . isString ) Ċĉĉ ĉ val Ġproperty Key Ġ= ĠOBJECT _ TYPE _ NAME _ PROPERTY _ KEY . atom Ċĉĉ ĉ synchronized ( property Key ) Ġ{ Ċĉĉĉ ĉ an ObjectType . fieldType Map (). map Iterable (). forEach Ġ{ Ġ( atom , Ġ_) Ġ-> Ċĉĉĉĉ ĉ if Ġ(! atom . is Atom Special ()) Ġ{ Ċĉĉĉĉĉ ĉ var Ġnames Map : ĠA _ Map Ġ= Ġatom . get Atom Property ( property Key ) Ċĉĉĉĉĉ ĉ if Ġ(! names Map . equals Nil () Ċĉĉĉĉĉĉ ĉ && Ġnames Map . has Key ( an ObjectType )) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ // ĠIn Ġtheory Ġthe Ġuser Ġcan Ġgive Ġthis Ġtype Ġmultiple Ġnames , Ċĉĉĉĉĉĉ ĉ // Ġso Ġonly Ġremove Ġthe Ġone Ġthat Ġwe 've Ġbeen Ġtold Ġto . Ċĉĉĉĉĉĉ ĉ var Ġnames Set : ĠA _ Set Ġ= Ġnames Map . map At ( an ObjectType ) Ċĉĉĉĉĉĉ ĉ names Set Ġ= Ġnames Set . set Without Element Can Destroy ( Ċĉĉĉĉĉĉĉ ĉ a String , Ġfalse ) Ċĉĉĉĉĉĉ ĉ names Map Ġ= Ġwhen ( names Set . setSize ()) Ġ{ Ċĉĉĉĉĉĉĉĉ 0 Ġ-> Ġnames Map . map Without Key Can Destroy ( Ċĉĉĉĉĉĉĉĉ ĉ an ObjectType , Ġfalse ) Ċĉĉĉĉĉĉĉ ĉ else Ġ-> Ġnames Map . map At Put ting Can Destroy ( Ċĉĉĉĉĉĉĉĉ ĉ an ObjectType , Ġnames Set , Ġfalse ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ atom . set Atom Property ( property Key , Ġnames Map ) Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġinformation Ġabout Ġthe Ġuser - assigned Ġname Ġof Ġthe Ġspecified Ċĉĉ Ġ* Ġuser - defined Ġobject Ġtype . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġan ObjectType Ċĉĉ Ġ* ĠĠ ĠA Ġuser - defined Ġobject Ġtype . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠA Ġtuple Ġwith Ġtwo Ġelements : Ġ( 1 ) ĠA Ġset Ġof Ġnames Ġof Ġthe Ġuser - defined Ċĉĉ Ġ* ĠĠ Ġobject Ġtype , Ġexcluding Ġnames Ġfor Ġwhich Ġa Ġstrictly Ġmore Ġspecific Ċĉĉ Ġ* ĠĠ Ġnamed Ġtype Ġis Ġknown , Ġand Ġ( 2 ) ĠA Ġset Ġof Ġobject Ġtypes Ġcorresponding Ġto Ċĉĉ Ġ* ĠĠ Ġthose Ġnames . Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġnames And Base Types For ObjectType ( Ċĉĉ ĉ an ObjectType : ĠA _ Type Ċĉ ĉ ): ĠA _ Tuple Ġ{ Ċĉĉ ĉ val Ġproperty Key Ġ= ĠOBJECT _ TYPE _ NAME _ PROPERTY _ KEY . atom Ċĉĉ ĉ var Ġapplicable Ġ= Ġempty Map Ċĉĉ ĉ synchronized ( property Key ) Ġ{ Ċĉĉĉ ĉ an ObjectType . fieldType Map (). map Iterable (). forEach Ġ{ Ġ( key , Ġ_) Ġ-> Ċĉĉĉĉ ĉ val Ġmap : ĠA _ Map Ġ= Ġkey . get Atom Property ( property Key ) Ċĉĉĉĉ ĉ if Ġ(! map . equals Nil ()) Ġ{ Ċĉĉĉĉĉ ĉ map . map Iterable (). forEach Ġ{ Ġ( named Type , Ġinner Value ) Ġ-> Ċĉĉĉĉĉĉ ĉ if Ġ( an ObjectType . is Subtype Of ( named Type )) Ġ{ Ċĉĉĉĉĉĉĉ ĉ var Ġname Set : ĠA _ Set Ġ= Ġinner Value Ċĉĉĉĉĉĉĉ ĉ if Ġ( applic able . has Key ( named Type )) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ name Set Ġ= Ġname Set . set Union Can Destroy ( Ċĉĉĉĉĉĉĉĉĉ ĉ applic able . map At ( named Type ), Ċĉĉĉĉĉĉĉĉĉ ĉ true ) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ applic able Ġ= Ġapplicable . map At Put ting Can Destroy ( Ċĉĉĉĉĉĉĉĉ ĉ named Type , Ġname Set , Ġtrue ) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ applic able . make Immutable () Ċĉĉ ĉ } Ċĉĉ ĉ var Ġfiltered Ġ= Ġapplicable Ċĉĉ ĉ applic able . map Iterable (). forEach Ġ{ Ġ( child Type , Ġ_) Ġ-> Ċĉĉĉ ĉ applic able . map Iterable (). forEach Ġ{ Ġ( parent Type , Ġ_) Ġ-> Ċĉĉĉĉ ĉ if Ġ(! child Type . equals ( parent Type ) Ċĉĉĉĉĉ ĉ && Ġchild Type . is Subtype Of ( parent Type )) Ġ{ Ċĉĉĉĉĉ ĉ filtered Ġ= Ġfiltered . map Without Key Can Destroy ( Ċĉĉĉĉĉĉ ĉ parent Type , Ġtrue ) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ var Ġnames Ġ= Ġempty Set Ċĉĉ ĉ var Ġbase Types Ġ= Ġempty Set Ċĉĉ ĉ filtered . map Iterable (). forEach Ġ{ Ġ( name , Ġtype ) Ġ-> Ċĉĉĉ ĉ names Ġ= Ġnames . set Union Can Destroy ( type , Ġtrue ) Ċĉĉĉ ĉ base Types Ġ= Ġbase Types . set With Element Can Destroy ( name , Ġtrue ) Ċĉĉ ĉ } Ċĉĉ ĉ return Ġtuple ( names , Ġbase Types ) Ċĉ ĉ } ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġthe Ġuser - assigned Ġnames Ġof Ġthe Ġspecified Ġuser - defined Ċĉĉ Ġ* Ġ[ object &# 3 2 ; type ][ ObjectType Descriptor ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġan ObjectType Ċĉĉ Ġ* ĠĠ ĠAn Ġ` object Ġtype `. Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠA Ġ[ set ][ Set Descriptor ] Ġcontaining Ġthe Ġnames Ġof Ġthe Ġ` object Ġtype `, Ċĉĉ Ġ* ĠĠ Ġexcluding Ġnames Ġfor Ġwhich Ġa Ġstrictly Ġmore Ġspecific Ġnamed Ġtype Ġis Ċĉĉ Ġ* ĠĠ Ġknown . Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġnames ForType ( an ObjectType : ĠA _ Type ): ĠA _ Set Ġ= Ċĉĉ ĉ names And Base Types For ObjectType ( an ObjectType ). tuple At ( 1 ) ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġthe Ġset Ġof Ġnamed Ġbase Ġtypes Ġfor Ġthe Ġspecified Ġuser - defined Ċĉĉ Ġ* Ġ[ object &# 3 2 ; type ][ ObjectType Descriptor ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġan ObjectType Ċĉĉ Ġ* ĠĠ ĠAn Ġ` object Ġtype `. Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠA Ġ[ set ][ Set Descriptor ] Ġcontaining Ġthe Ġnamed Ġan cestors Ġof Ġthe Ċĉĉ Ġ* ĠĠ Ġspecified Ġ` object Ġtype `, Ġexcluding Ġnamed Ġtypes Ġfor Ġwhich Ġa Ġstrictly Ċĉĉ Ġ* ĠĠ Ġmore Ġspecific Ġnamed Ġtype Ġis Ġknown . Ċĉĉ Ġ*/ Ċĉ ĉ @ Suppress (" unused ") Ċĉ ĉ fun Ġnamed Base Types ForType ( an ObjectType : ĠA _ Type ): ĠA _ Basic Object Ġ= Ċĉĉ ĉ names And Base Types For ObjectType ( an ObjectType ). tuple At ( 2 ) ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġmost Ġgeneral Ġ[ object &# 3 2 ; type ][ ObjectType Descriptor ]. Ċĉĉ Ġ*/ Ċĉ ĉ private Ġval Ġmost General Type : ĠA _ Type Ġ= Ċĉĉ ĉ object Type From Map ( empty Map ). make Shared () ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġthe Ġtop Ġ( i . e ., Ġmost Ġgeneral ) Ġobject Ġtype . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġobject Ġtype Ġthat Ġmakes Ġno Ġconstraints Ġon Ġits Ġfields . Ċĉĉ Ġ*/ Ċĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġmost General ObjectType (): ĠA _ Type Ġ= Ġmost General Type ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġmet atype Ġof Ġall Ġobject Ġtypes . Ċĉĉ Ġ*/ Ċĉ ĉ private Ġval Ġmost General Meta : ĠA _ Type Ġ= Ċĉĉ ĉ instance Meta ( most General Type ). make Shared () ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġthe Ġmet atype Ġfor Ġall Ġobject Ġtypes . Ġ ĠThis Ġis Ġjust Ġan Ċĉĉ Ġ* Ġ[ instance &# 3 2 ; meta ][ Instance Meta Descriptor ] Ġon Ġthe Ċĉĉ Ġ* Ġ[ most General ObjectType ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġ( meta ) type Ġof Ġthe Ġmost Ġgeneral Ġobject Ġtype . Ċĉĉ Ġ*/ Ċĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġmost General ObjectMeta (): ĠA _ Type Ġ= Ġmost General Meta ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġ[ A _ Atom ] Ġthat Ġidentifies Ġthe Ġ[ exception &# 3 2 ; type ][ exception Type ]. Ċĉĉ Ġ*/ Ċĉ ĉ private Ġval Ġexception Atom : ĠA _ Atom Ġ= Ċĉĉ ĉ create Special Atom (" explicit - exception "). apply Ġ{ Ċĉĉĉ ĉ set Atom Property ( EX PL IC IT _ SUB CLASS ING _ KEY . atom , Ġtrue Object ) Ċĉĉ ĉ } ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġthe Ġ[ atom ][ Atom Descriptor ] Ġthat Ġidentifies Ġthe Ċĉĉ Ġ* Ġ[ exception &# 3 2 ; type ][ exception Type ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġspecial Ġexception Ġatom . Ċĉĉ Ġ*/ Ċĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġexception Atom (): ĠA _ Atom Ġ= Ġexception Atom ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġ[ atom ][ Atom Descriptor ] Ġthat Ġidentifies Ġthe Ġstack Ġdump Ċĉĉ Ġ* Ġ[ field ][ Atom Descriptor ] Ġof Ġan Ġ[ exception ][ exception Type ]. Ċĉĉ Ġ*/ Ċĉ ĉ private Ġval Ġstack Dump Atom : ĠA _ Atom Ġ= Ġcreate Special Atom (" stack Ġdump ") ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġthe Ġ[ A _ Atom ] Ġthat Ġidentifies Ġthe Ġstack Ġdump Ġfield Ġof Ġan Ċĉĉ Ġ* Ġ[ exception &# 3 2 ; type ][ exception Type ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġspecial Ġstack Ġdump Ġatom . Ċĉĉ Ġ*/ Ċĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġstack Dump Atom (): ĠA _ Atom Ġ= Ġstack Dump Atom ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġmost Ġgeneral Ġexception Ġtype . Ċĉĉ Ġ*/ Ċĉ ĉ private Ġvar Ġexception Type : ĠA _ Type Ġ= Ġrun Ġ{ Ċĉĉ ĉ val Ġtype : ĠA _ Type Ġ= Ġobject Type From Tuple ( Ċĉĉĉ ĉ tuple ( tuple ( exception Atom , Ġinstance Type ( exception Atom )))) Ċĉĉ ĉ setName ForType ( type , Ġstring From (" exception "), Ġtrue ) Ċĉĉ ĉ type . make Shared () Ċĉ ĉ } ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠAnswer Ġthe Ġmost Ġgeneral Ġexception Ġtype . ĠThis Ġis Ġjust Ġan Ċĉĉ Ġ* Ġ[ object &# 3 2 ; type ][ ObjectType Descriptor ] Ġthat Ġcontains Ġthe Ġwell - known Ċĉĉ Ġ* Ġ[ exception Atom ]. Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠThe Ġmost Ġgeneral Ġexception Ġtype . Ċĉĉ Ġ*/ Ċĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġexception Type (): ĠA _ Type Ġ= Ġexception Type Ċ ĉ } Ċ } Ċ