> Currently if we create a record it's fields are compared in their declaration 
> order. This might be ineffective in cases when two objects have "heavy" 
> fields equals to each other, but different "lightweight" fields (heavy and 
> lightweight in terms of comparison) e.g. primitives, enums, 
> nullable/non-nulls etc.
> 
> If we have declared a record like
> 
> public record MyRecord(String field1, int field2) {}
> 
> It's equals() looks like:
> 
>   public final equals(Ljava/lang/Object;)Z
>    L0
>     LINENUMBER 3 L0
>     ALOAD 0
>     ALOAD 1
>     INVOKEDYNAMIC 
> equals(Lcom/caspianone/openbanking/productservice/controller/MyRecord;Ljava/lang/Object;)Z
>  [
>       // handle kind 0x6 : INVOKESTATIC
>       
> java/lang/runtime/ObjectMethods.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;
>       // arguments:
>       com.caspianone.openbanking.productservice.controller.MyRecord.class,
>       "field1;field2",
>       // handle kind 0x1 : GETFIELD
>       
> com/caspianone/openbanking/productservice/controller/MyRecord.field1(Ljava/lang/String;),
>       // handle kind 0x1 : GETFIELD
>       com/caspianone/openbanking/productservice/controller/MyRecord.field2(I)
>     ]
>     IRETURN
>    L1
>     LOCALVARIABLE this 
> Lcom/caspianone/openbanking/productservice/controller/MyRecord; L0 L1 0
>     LOCALVARIABLE o Ljava/lang/Object; L0 L1 1
>     MAXSTACK = 2
>     MAXLOCALS = 2
> 
> This can be improved by rearranging the comparison order of the fields moving 
> enums and primitives upper, and collections/arrays lower.

Sergey Tsypanov has updated the pull request with a new target base due to a 
merge or a rebase. The pull request now contains 11 commits:

 - Resolve merge conflicts
 - Merge branch 'master' into record-equals
   
   # Conflicts:
   #    src/java.base/share/classes/java/lang/runtime/ObjectMethods.java
   #    test/jdk/java/lang/runtime/ObjectMethodsTest.java
 - Merge remote-tracking branch 'origin/record-equals' into record-equals
 - Update src/java.base/share/classes/java/lang/runtime/ObjectMethods.java
   
   Co-authored-by: ExE Boss <[email protected]>
 - 8322292: Add test case
 - 8322292: Tiny improvement
 - 8322292: Shift arrays up
 - 8322292: Use copy
 - 8322292: Update copyright
 - 8322292: Shift arrays and Iterables down
 - ... and 1 more: https://git.openjdk.org/jdk/compare/2042269d...193d453d

-------------

Changes: https://git.openjdk.org/jdk/pull/17143/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=17143&range=06
  Stats: 49 lines in 2 files changed: 49 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/17143.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/17143/head:pull/17143

PR: https://git.openjdk.org/jdk/pull/17143

Reply via email to