Mercurial > hg > truffle
comparison src/share/vm/runtime/sharedRuntime.cpp @ 3841:0f34fdee809e
7071427: AdapterFingerPrint can hold 8 entries per int
Reviewed-by: kvn
author | never |
---|---|
date | Wed, 27 Jul 2011 15:06:35 -0700 |
parents | d83ac25d0304 |
children | ec5ce9326985 436b4a3231bf |
comparison
equal
deleted
inserted
replaced
3840:4e761e7e6e12 | 3841:0f34fdee809e |
---|---|
2128 } | 2128 } |
2129 | 2129 |
2130 public: | 2130 public: |
2131 AdapterFingerPrint(int total_args_passed, BasicType* sig_bt) { | 2131 AdapterFingerPrint(int total_args_passed, BasicType* sig_bt) { |
2132 // The fingerprint is based on the BasicType signature encoded | 2132 // The fingerprint is based on the BasicType signature encoded |
2133 // into an array of ints with four entries per int. | 2133 // into an array of ints with eight entries per int. |
2134 int* ptr; | 2134 int* ptr; |
2135 int len = (total_args_passed + 3) >> 2; | 2135 int len = (total_args_passed + 7) >> 3; |
2136 if (len <= (int)(sizeof(_value._compact) / sizeof(int))) { | 2136 if (len <= (int)(sizeof(_value._compact) / sizeof(int))) { |
2137 _value._compact[0] = _value._compact[1] = _value._compact[2] = 0; | 2137 _value._compact[0] = _value._compact[1] = _value._compact[2] = 0; |
2138 // Storing the signature encoded as signed chars hits about 98% | 2138 // Storing the signature encoded as signed chars hits about 98% |
2139 // of the time. | 2139 // of the time. |
2140 _length = -len; | 2140 _length = -len; |
2143 _length = len; | 2143 _length = len; |
2144 _value._fingerprint = NEW_C_HEAP_ARRAY(int, _length); | 2144 _value._fingerprint = NEW_C_HEAP_ARRAY(int, _length); |
2145 ptr = _value._fingerprint; | 2145 ptr = _value._fingerprint; |
2146 } | 2146 } |
2147 | 2147 |
2148 // Now pack the BasicTypes with 4 per int | 2148 // Now pack the BasicTypes with 8 per int |
2149 int sig_index = 0; | 2149 int sig_index = 0; |
2150 for (int index = 0; index < len; index++) { | 2150 for (int index = 0; index < len; index++) { |
2151 int value = 0; | 2151 int value = 0; |
2152 for (int byte = 0; byte < 4; byte++) { | 2152 for (int byte = 0; byte < 8; byte++) { |
2153 if (sig_index < total_args_passed) { | 2153 if (sig_index < total_args_passed) { |
2154 value = (value << 4) | adapter_encoding(sig_bt[sig_index++]); | 2154 value = (value << 4) | adapter_encoding(sig_bt[sig_index++]); |
2155 } | 2155 } |
2156 } | 2156 } |
2157 ptr[index] = value; | 2157 ptr[index] = value; |
2188 return (unsigned int)hash; | 2188 return (unsigned int)hash; |
2189 } | 2189 } |
2190 | 2190 |
2191 const char* as_string() { | 2191 const char* as_string() { |
2192 stringStream st; | 2192 stringStream st; |
2193 st.print("0x"); | |
2193 for (int i = 0; i < length(); i++) { | 2194 for (int i = 0; i < length(); i++) { |
2194 st.print(PTR_FORMAT, value(i)); | 2195 st.print("%08x", value(i)); |
2195 } | 2196 } |
2196 return st.as_string(); | 2197 return st.as_string(); |
2197 } | 2198 } |
2198 | 2199 |
2199 bool equals(AdapterFingerPrint* other) { | 2200 bool equals(AdapterFingerPrint* other) { |