/* Ċ Ġ* Ġ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 / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . jvm . intr insics Ċ Ċ import Ġcom . intellij . psi . tree . I ElementType Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Backend Context Ċ import Ġorg . jetbrains . kotlin . codegen . Asm Util Ċ import Ġorg . jetbrains . kotlin . codegen . Asm Util .* Ċ import Ġorg . jetbrains . kotlin . codegen . Stack Value Ċ import Ġorg . jetbrains . kotlin . codegen . intr insics . Intr insic Methods Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Member Access Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Statement Origin Ċ import Ġorg . jetbrains . kotlin . ir . types . to Kotlin Type Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Asm Types Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Asm Types . OBJECT _ TYPE Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . jvm Signature . Jvm Method Signature Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Primitive Number Or Nullable Type Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġorg . jetbrains . org . object web . asm . commons . Instruction Adapter Ċ Ċ class ĠEquals ( val Ġoperator : ĠI ElementType ) Ġ: ĠIntr insic Method () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġto Callable ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Member Access Expression , ĊĠĠĠĠĠĠĠ Ġsignature : ĠJ vm Method Signature , ĊĠĠĠĠĠĠĠ Ġcontext : ĠJ vm Backend Context ĊĠĠĠ Ġ): ĠIr Intr insic Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreceiver And Args Ġ= Ġexpression . receiver And Args (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( size Ġ== Ġ 2 ) Ġ{ Ġ" Equals Ġexpects Ġ 2 Ġarguments , Ġbut Ġ${ join ToString () }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġleft Type Ġ= Ġcontext . state . type Mapper . map Type ( receiver And Args . first (). type . to Kotlin Type ()) ĊĠĠĠĠĠĠĠ Ġvar Ġright Type Ġ= Ġcontext . state . type Mapper . map Type ( receiver And Args . last (). type . to Kotlin Type ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Primitive ( left Type ) Ġ!= Ġis Primitive ( right Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Type Ġ= Ġbox Type ( left Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Type Ġ= Ġbox Type ( right Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIr Intr insic Function ( expression , Ġsignature , Ġcontext , ĠlistOf ( left Type , Ġright Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgen Invoke Instruction ( v : ĠInstruction Adapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġop Token Ġ= Ġexpression . origin ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( op Token Ġ=== ĠIr Statement Origin . EQ EQ EQ Ġ|| Ġop Token Ġ=== ĠIr Statement Origin . EX CLE Q EQ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġalways Ġcasting Ġto Ġthe Ġtype Ġof Ġthe Ġleft Ġoperand Ġin Ġcase Ġof Ġprimitives Ġlooks Ġwrong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperand Type Ġ= Ġif Ġ( is Primitive ( left Type )) Ġleft Type Ġelse ĠOBJECT _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStack Value . cmp ( operator , Ġoperand Type , ĠStack Value . on Stack ( left Type ), ĠStack Value . on Stack ( right Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgen Equals For Expressions On Stack ( operator , ĠStack Value . on Stack ( left Type ), ĠStack Value . on Stack ( right Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . put ( Type . BOOLEAN _ TYPE , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ class ĠI eee 7 5 4 Equals ( val Ġoperand Type : ĠType ) Ġ: ĠIntr insic Method () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbox ed Operand Type Ġ= ĠA sm Util . box Type ( operand Type ) ĊĊĠĠĠ Ġoverride Ġfun Ġto Callable ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Member Access Expression , ĊĠĠĠĠĠĠĠ Ġsignature : ĠJ vm Method Signature , ĊĠĠĠĠĠĠĠ Ġcontext : ĠJ vm Backend Context ĊĠĠĠ Ġ): ĠIr Intr insic Function Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠI eee 7 5 4 AreEqual ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright : ĠType ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠIr Intr insic Function ( expression , Ġsignature , Ġcontext , ĠlistOf ( left , Ġright )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgen Invoke Instruction ( v : ĠInstruction Adapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . inv ok est atic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntr insic Methods . INTR INS ICS _ CLASS _ NAME , Ġ" are Equal ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . getMethod Descriptor ( Type . BOOLEAN _ TYPE , Ġleft , Ġright ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġarg 0 Type Ġ= Ġexpression . getValue Argument ( 0 ) !!. type . to Kotlin Type () ĊĠĠĠĠĠĠĠ Ġif Ġ(! arg 0 Type . is Primitive Number Or Nullable Type ()) Ġthrow ĠAssertionError (" Should Ġbe Ġprimitive Ġor Ġnullable Ġprimitive Ġtype : Ġ$ arg 0 Type ") ĊĊĠĠĠĠĠĠĠ Ġval Ġarg 1 Type Ġ= Ġexpression . getValue Argument ( 1 ) !!. type . to Kotlin Type () ĊĠĠĠĠĠĠĠ Ġif Ġ(! arg 1 Type . is Primitive Number Or Nullable Type ()) Ġthrow ĠAssertionError (" Should Ġbe Ġprimitive Ġor Ġnullable Ġprimitive Ġtype : Ġ$ arg 1 Type ") ĊĊĠĠĠĠĠĠĠ Ġval Ġarg 0 is Nullable Ġ= Ġarg 0 Type . is Marked Nullable ĊĠĠĠĠĠĠĠ Ġval Ġarg 1 is Nullable Ġ= Ġarg 1 Type . is Marked Nullable ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! arg 0 is Nullable Ġ&& Ġ! arg 1 is Nullable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠIr Intr insic Function ( expression , Ġsignature , Ġcontext , ĠlistOf ( operand Type , Ġoperand Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgen Invoke Instruction ( v : ĠInstruction Adapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStack Value . cmp ( Kt Tokens . EQ EQ , Ġoperand Type , ĠStack Value . on Stack ( operand Type ), ĠStack Value . on Stack ( operand Type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( Type . BOOLEAN _ TYPE , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg 0 is Nullable Ġ&& Ġ! arg 1 is Nullable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI eee 7 5 4 AreEqual ( boxed Operand Type , Ġoperand Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! arg 0 is Nullable Ġ&& Ġarg 1 is Nullable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI eee 7 5 4 AreEqual ( operand Type , Ġbox ed Operand Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI eee 7 5 4 AreEqual ( boxed Operand Type , Ġbox ed Operand Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠTotal Order Equals ( operand Type : ĠType ) Ġ: ĠIntr insic Method () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbox ed Type Ġ= ĠA sm Util . box Type ( operand Type ) ĊĊĠĠĠ Ġoverride Ġfun Ġto Callable ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Member Access Expression , ĊĠĠĠĠĠĠĠ Ġsignature : ĠJ vm Method Signature , ĊĠĠĠĠĠĠĠ Ġcontext : ĠJ vm Backend Context ĊĠĠĠ Ġ): ĠIr Intr insic Function Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠIr Intr insic Function ( expression , Ġsignature , Ġcontext , ĠlistOf ( boxed Type , Ġbox ed Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgen Invoke Instruction ( v : ĠInstruction Adapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . invokevirtual ( boxed Type . internal Name , Ġ" equals ", ĠType . getMethod Descriptor ( Type . BOOLEAN _ TYPE , ĠA sm Types . OBJECT _ TYPE ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ