LANG-1229: HashCodeBuilder.append(Object,Object) is too big to be inlined, which prevents whole builder to be scalarized (closes #142)
Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/18b1bc20 Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/18b1bc20 Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/18b1bc20 Branch: refs/heads/master Commit: 18b1bc203bdb236bfd9084193aa2d55d4b605139 Parents: 9bd439b Author: Philippe Marschall <[email protected]> Authored: Sun May 15 16:28:48 2016 +0200 Committer: pascalschumacher <[email protected]> Committed: Wed Jun 8 22:27:58 2016 +0200 ---------------------------------------------------------------------- .../commons/lang3/builder/HashCodeBuilder.java | 60 ++++++++++++-------- 1 file changed, 37 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-lang/blob/18b1bc20/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java b/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java index 70ca945..98ed5c5 100644 --- a/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java +++ b/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java @@ -847,29 +847,10 @@ public class HashCodeBuilder implements Builder<Integer> { iTotal = iTotal * iConstant; } else { - if(object.getClass().isArray()) { - // 'Switch' on type of array, to dispatch to the correct handler - // This handles multi dimensional arrays - if (object instanceof long[]) { - append((long[]) object); - } else if (object instanceof int[]) { - append((int[]) object); - } else if (object instanceof short[]) { - append((short[]) object); - } else if (object instanceof char[]) { - append((char[]) object); - } else if (object instanceof byte[]) { - append((byte[]) object); - } else if (object instanceof double[]) { - append((double[]) object); - } else if (object instanceof float[]) { - append((float[]) object); - } else if (object instanceof boolean[]) { - append((boolean[]) object); - } else { - // Not an array of primitives - append((Object[]) object); - } + if (object.getClass().isArray()) { + // factor out array case in order to keep method small enough + // to be inlined + appendArray(object); } else { iTotal = iTotal * iConstant + object.hashCode(); } @@ -879,6 +860,39 @@ public class HashCodeBuilder implements Builder<Integer> { /** * <p> + * Append a <code>hashCode</code> for an array. + * </p> + * + * @param object + * the array to add to the <code>hashCode</code> + */ + private void appendArray(final Object object) { + // 'Switch' on type of array, to dispatch to the correct handler + // This handles multi dimensional arrays + if (object instanceof long[]) { + append((long[]) object); + } else if (object instanceof int[]) { + append((int[]) object); + } else if (object instanceof short[]) { + append((short[]) object); + } else if (object instanceof char[]) { + append((char[]) object); + } else if (object instanceof byte[]) { + append((byte[]) object); + } else if (object instanceof double[]) { + append((double[]) object); + } else if (object instanceof float[]) { + append((float[]) object); + } else if (object instanceof boolean[]) { + append((boolean[]) object); + } else { + // Not an array of primitives + append((Object[]) object); + } + } + + /** + * <p> * Append a <code>hashCode</code> for an <code>Object</code> array. * </p> *
