Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-2877

Optimize generated hashCode

VotersStop watchingWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • 0.9.3
    • 0.10.0
    • Java - Compiler
    • None

    Description

      The generated java hashCode method allocates an ArrayList then appends the fields to the list. Primitive fields will be boxed when added to the list.

      The generated code shouldn't allocate a list or box primitives. The hashCode can be calculated by using a primitive int and some static utility methods which can return the hashCode for each type.

      out << indent() << "@Override" << endl << indent() << "public int hashCode() {" << endl;
      1839 indent_up();
      1840 indent(out) << "List<Object> list = new ArrayList<Object>();" << endl;
      1841
      1842 for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
      1843 out << endl;
      1844
      1845 t_type* t = get_true_type((*m_iter)->get_type());
      1846 bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL;
      1847 bool can_be_null = type_can_be_null(t);
      1848 string name = (*m_iter)->get_name();
      1849
      1850 string present = "true";
      1851
      1852 if (is_optional || can_be_null)

      { 1853 present += " && (" + generate_isset_check(*m_iter) + ")"; 1854 }

      1855
      1856 indent(out) << "boolean present_" << name << " = " << present << ";" << endl;
      1857 indent(out) << "list.add(present_" << name << ");" << endl;
      1858 indent(out) << "if (present_" << name << ")" << endl;
      1859 if (t->is_enum())

      { 1860 indent(out) << " list.add(" << name << ".getValue());" << endl; 1861 }

      else

      { 1862 indent(out) << " list.add(" << name << ");" << endl; 1863 }

      1864 }
      1865
      1866 out << endl;
      1867 indent(out) << "return list.hashCode();" << endl;
      1868 indent_down();
      1869 indent(out) << "}" << endl << endl;
      1870 }

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            roshangeorge Roshan George
            mrettig Mike Rettig
            Votes:
            0 Vote for this issue
            Watchers:
            7 Stop watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment