comparison src/share/vm/runtime/sharedRuntime.cpp @ 508:6d8fc951eb25

6778657: Casts in SharedRuntime::f2i, f2l, d2i and d2l rely on undefined C++ behaviour Summary: Replaces SharedRuntime::f2i et al with versions that should work Reviewed-by: never Contributed-by: gbenson@redhat.com
author kvn
date Mon, 22 Dec 2008 15:43:02 -0800
parents dc16daa0329d
children 0fbdb4381b99 afa80fa86d22
comparison
equal deleted inserted replaced
500:ca7d48236048 508:6d8fc951eb25
190 return ((jdouble)fmod((double)x,(double)y)); 190 return ((jdouble)fmod((double)x,(double)y));
191 JRT_END 191 JRT_END
192 192
193 193
194 JRT_LEAF(jint, SharedRuntime::f2i(jfloat x)) 194 JRT_LEAF(jint, SharedRuntime::f2i(jfloat x))
195 if (g_isnan(x)) {return 0;} 195 if (g_isnan(x))
196 jlong lltmp = (jlong)x; 196 return 0;
197 jint ltmp = (jint)lltmp; 197 if (x >= (jfloat) max_jint)
198 if (ltmp == lltmp) { 198 return max_jint;
199 return ltmp; 199 if (x <= (jfloat) min_jint)
200 } else { 200 return min_jint;
201 if (x < 0) { 201 return (jint) x;
202 return min_jint;
203 } else {
204 return max_jint;
205 }
206 }
207 JRT_END 202 JRT_END
208 203
209 204
210 JRT_LEAF(jlong, SharedRuntime::f2l(jfloat x)) 205 JRT_LEAF(jlong, SharedRuntime::f2l(jfloat x))
211 if (g_isnan(x)) {return 0;} 206 if (g_isnan(x))
212 jlong lltmp = (jlong)x; 207 return 0;
213 if (lltmp != min_jlong) { 208 if (x >= (jfloat) max_jlong)
214 return lltmp; 209 return max_jlong;
215 } else { 210 if (x <= (jfloat) min_jlong)
216 if (x < 0) { 211 return min_jlong;
217 return min_jlong; 212 return (jlong) x;
218 } else {
219 return max_jlong;
220 }
221 }
222 JRT_END 213 JRT_END
223 214
224 215
225 JRT_LEAF(jint, SharedRuntime::d2i(jdouble x)) 216 JRT_LEAF(jint, SharedRuntime::d2i(jdouble x))
226 if (g_isnan(x)) {return 0;} 217 if (g_isnan(x))
227 jlong lltmp = (jlong)x; 218 return 0;
228 jint ltmp = (jint)lltmp; 219 if (x >= (jdouble) max_jint)
229 if (ltmp == lltmp) { 220 return max_jint;
230 return ltmp; 221 if (x <= (jdouble) min_jint)
231 } else { 222 return min_jint;
232 if (x < 0) { 223 return (jint) x;
233 return min_jint;
234 } else {
235 return max_jint;
236 }
237 }
238 JRT_END 224 JRT_END
239 225
240 226
241 JRT_LEAF(jlong, SharedRuntime::d2l(jdouble x)) 227 JRT_LEAF(jlong, SharedRuntime::d2l(jdouble x))
242 if (g_isnan(x)) {return 0;} 228 if (g_isnan(x))
243 jlong lltmp = (jlong)x; 229 return 0;
244 if (lltmp != min_jlong) { 230 if (x >= (jdouble) max_jlong)
245 return lltmp; 231 return max_jlong;
246 } else { 232 if (x <= (jdouble) min_jlong)
247 if (x < 0) { 233 return min_jlong;
248 return min_jlong; 234 return (jlong) x;
249 } else {
250 return max_jlong;
251 }
252 }
253 JRT_END 235 JRT_END
254 236
255 237
256 JRT_LEAF(jfloat, SharedRuntime::d2f(jdouble x)) 238 JRT_LEAF(jfloat, SharedRuntime::d2f(jdouble x))
257 return (jfloat)x; 239 return (jfloat)x;