Mercurial > hg > truffle
comparison src/share/vm/classfile/vmSymbols.cpp @ 1339:09ac706c2623
Merge
author | asaha |
---|---|
date | Wed, 24 Mar 2010 17:16:33 -0700 |
parents | dd57230ba8fe |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1338:f5dd08ad65df | 1339:09ac706c2623 |
---|---|
1 /* | 1 /* |
2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
68 static const char* vm_symbol_bodies = VM_SYMBOLS_DO(VM_SYMBOL_BODY, VM_ALIAS_IGNORE); | 68 static const char* vm_symbol_bodies = VM_SYMBOLS_DO(VM_SYMBOL_BODY, VM_ALIAS_IGNORE); |
69 | 69 |
70 void vmSymbols::initialize(TRAPS) { | 70 void vmSymbols::initialize(TRAPS) { |
71 assert((int)SID_LIMIT <= (1<<log2_SID_LIMIT), "must fit in this bitfield"); | 71 assert((int)SID_LIMIT <= (1<<log2_SID_LIMIT), "must fit in this bitfield"); |
72 assert((int)SID_LIMIT*5 > (1<<log2_SID_LIMIT), "make the bitfield smaller, please"); | 72 assert((int)SID_LIMIT*5 > (1<<log2_SID_LIMIT), "make the bitfield smaller, please"); |
73 assert(vmIntrinsics::FLAG_LIMIT <= (1 << vmIntrinsics::log2_FLAG_LIMIT), "must fit in this bitfield"); | |
73 | 74 |
74 if (!UseSharedSpaces) { | 75 if (!UseSharedSpaces) { |
75 const char* string = &vm_symbol_bodies[0]; | 76 const char* string = &vm_symbol_bodies[0]; |
76 for (int index = (int)FIRST_SID; index < (int)SID_LIMIT; index++) { | 77 for (int index = (int)FIRST_SID; index < (int)SID_LIMIT; index++) { |
77 symbolOop sym = oopFactory::new_symbol(string, CHECK); | 78 symbolOop sym = oopFactory::new_symbol(string, CHECK); |
269 #endif //ASSERT | 270 #endif //ASSERT |
270 | 271 |
271 return sid; | 272 return sid; |
272 } | 273 } |
273 | 274 |
275 static vmIntrinsics::ID wrapper_intrinsic(BasicType type, bool unboxing) { | |
276 #define TYPE2(type, unboxing) ((int)(type)*2 + ((unboxing) ? 1 : 0)) | |
277 switch (TYPE2(type, unboxing)) { | |
278 #define BASIC_TYPE_CASE(type, box, unbox) \ | |
279 case TYPE2(type, false): return vmIntrinsics::box; \ | |
280 case TYPE2(type, true): return vmIntrinsics::unbox | |
281 BASIC_TYPE_CASE(T_BOOLEAN, _Boolean_valueOf, _booleanValue); | |
282 BASIC_TYPE_CASE(T_BYTE, _Byte_valueOf, _byteValue); | |
283 BASIC_TYPE_CASE(T_CHAR, _Character_valueOf, _charValue); | |
284 BASIC_TYPE_CASE(T_SHORT, _Short_valueOf, _shortValue); | |
285 BASIC_TYPE_CASE(T_INT, _Integer_valueOf, _intValue); | |
286 BASIC_TYPE_CASE(T_LONG, _Long_valueOf, _longValue); | |
287 BASIC_TYPE_CASE(T_FLOAT, _Float_valueOf, _floatValue); | |
288 BASIC_TYPE_CASE(T_DOUBLE, _Double_valueOf, _doubleValue); | |
289 #undef BASIC_TYPE_CASE | |
290 } | |
291 #undef TYPE2 | |
292 return vmIntrinsics::_none; | |
293 } | |
294 | |
295 vmIntrinsics::ID vmIntrinsics::for_boxing(BasicType type) { | |
296 return wrapper_intrinsic(type, false); | |
297 } | |
298 vmIntrinsics::ID vmIntrinsics::for_unboxing(BasicType type) { | |
299 return wrapper_intrinsic(type, true); | |
300 } | |
301 | |
302 vmIntrinsics::ID vmIntrinsics::for_raw_conversion(BasicType src, BasicType dest) { | |
303 #define SRC_DEST(s,d) (((int)(s) << 4) + (int)(d)) | |
304 switch (SRC_DEST(src, dest)) { | |
305 case SRC_DEST(T_INT, T_FLOAT): return vmIntrinsics::_intBitsToFloat; | |
306 case SRC_DEST(T_FLOAT, T_INT): return vmIntrinsics::_floatToRawIntBits; | |
307 | |
308 case SRC_DEST(T_LONG, T_DOUBLE): return vmIntrinsics::_longBitsToDouble; | |
309 case SRC_DEST(T_DOUBLE, T_LONG): return vmIntrinsics::_doubleToRawLongBits; | |
310 } | |
311 #undef SRC_DEST | |
312 | |
313 return vmIntrinsics::_none; | |
314 } | |
315 | |
316 methodOop vmIntrinsics::method_for(vmIntrinsics::ID id) { | |
317 if (id == _none) return NULL; | |
318 symbolOop cname = vmSymbols::symbol_at(class_for(id)); | |
319 symbolOop mname = vmSymbols::symbol_at(name_for(id)); | |
320 symbolOop msig = vmSymbols::symbol_at(signature_for(id)); | |
321 if (cname == NULL || mname == NULL || msig == NULL) return NULL; | |
322 klassOop k = SystemDictionary::find_well_known_klass(cname); | |
323 if (k == NULL) return NULL; | |
324 return instanceKlass::cast(k)->find_method(mname, msig); | |
325 } | |
326 | |
274 | 327 |
275 #define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0" | 328 #define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0" |
276 static const char* vm_intrinsic_name_bodies = | 329 static const char* vm_intrinsic_name_bodies = |
277 VM_INTRINSICS_DO(VM_INTRINSIC_INITIALIZE, | 330 VM_INTRINSICS_DO(VM_INTRINSIC_INITIALIZE, |
278 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); | 331 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); |
301 inline bool match_F_R(jshort flags) { | 354 inline bool match_F_R(jshort flags) { |
302 const int req = 0; | 355 const int req = 0; |
303 const int neg = JVM_ACC_STATIC | JVM_ACC_SYNCHRONIZED; | 356 const int neg = JVM_ACC_STATIC | JVM_ACC_SYNCHRONIZED; |
304 return (flags & (req | neg)) == req; | 357 return (flags & (req | neg)) == req; |
305 } | 358 } |
359 inline bool match_F_Y(jshort flags) { | |
360 const int req = JVM_ACC_SYNCHRONIZED; | |
361 const int neg = JVM_ACC_STATIC; | |
362 return (flags & (req | neg)) == req; | |
363 } | |
306 inline bool match_F_RN(jshort flags) { | 364 inline bool match_F_RN(jshort flags) { |
307 const int req = JVM_ACC_NATIVE; | 365 const int req = JVM_ACC_NATIVE; |
308 const int neg = JVM_ACC_STATIC | JVM_ACC_SYNCHRONIZED; | 366 const int neg = JVM_ACC_STATIC | JVM_ACC_SYNCHRONIZED; |
309 return (flags & (req | neg)) == req; | 367 return (flags & (req | neg)) == req; |
310 } | 368 } |
323 const int neg = JVM_ACC_STATIC; | 381 const int neg = JVM_ACC_STATIC; |
324 return (flags & (req | neg)) == req; | 382 return (flags & (req | neg)) == req; |
325 } | 383 } |
326 | 384 |
327 // These are for forming case labels: | 385 // These are for forming case labels: |
328 #define ID3(x, y, z) (( jint)(z) + \ | 386 #define ID3(x, y, z) (( jlong)(z) + \ |
329 ((jint)(y) << vmSymbols::log2_SID_LIMIT) + \ | 387 ((jlong)(y) << vmSymbols::log2_SID_LIMIT) + \ |
330 ((jint)(x) << (2*vmSymbols::log2_SID_LIMIT)) ) | 388 ((jlong)(x) << (2*vmSymbols::log2_SID_LIMIT)) ) |
331 #define SID_ENUM(n) vmSymbols::VM_SYMBOL_ENUM_NAME(n) | 389 #define SID_ENUM(n) vmSymbols::VM_SYMBOL_ENUM_NAME(n) |
332 | 390 |
333 vmIntrinsics::ID vmIntrinsics::find_id(vmSymbols::SID holder, | 391 vmIntrinsics::ID vmIntrinsics::find_id_impl(vmSymbols::SID holder, |
334 vmSymbols::SID name, | 392 vmSymbols::SID name, |
335 vmSymbols::SID sig, | 393 vmSymbols::SID sig, |
336 jshort flags) { | 394 jshort flags) { |
337 assert((int)vmSymbols::SID_LIMIT <= (1<<vmSymbols::log2_SID_LIMIT), "must fit"); | 395 assert((int)vmSymbols::SID_LIMIT <= (1<<vmSymbols::log2_SID_LIMIT), "must fit"); |
338 | 396 |
339 // Let the C compiler build the decision tree. | 397 // Let the C compiler build the decision tree. |
340 | 398 |
341 #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \ | 399 #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \ |
359 const char* kname = vmSymbols::name_for(class_for(id)); | 417 const char* kname = vmSymbols::name_for(class_for(id)); |
360 const char* mname = vmSymbols::name_for(name_for(id)); | 418 const char* mname = vmSymbols::name_for(name_for(id)); |
361 const char* sname = vmSymbols::name_for(signature_for(id)); | 419 const char* sname = vmSymbols::name_for(signature_for(id)); |
362 const char* fname = ""; | 420 const char* fname = ""; |
363 switch (flags_for(id)) { | 421 switch (flags_for(id)) { |
422 case F_Y: fname = "synchronized "; break; | |
364 case F_RN: fname = "native "; break; | 423 case F_RN: fname = "native "; break; |
365 case F_SN: fname = "native static "; break; | 424 case F_SN: fname = "native static "; break; |
366 case F_S: fname = "static "; break; | 425 case F_S: fname = "static "; break; |
367 case F_RNY:fname = "native synchronized "; break; | 426 case F_RNY:fname = "native synchronized "; break; |
368 } | 427 } |
375 #endif //PRODUCT | 434 #endif //PRODUCT |
376 return str; | 435 return str; |
377 } | 436 } |
378 | 437 |
379 | 438 |
380 // These are for friendly printouts of intrinsics: | 439 // These are to get information about intrinsics. |
440 | |
441 #define ID4(x, y, z, f) ((ID3(x, y, z) << vmIntrinsics::log2_FLAG_LIMIT) | (jlong) (f)) | |
442 | |
443 static const jlong intrinsic_info_array[vmIntrinsics::ID_LIMIT+1] = { | |
444 #define VM_INTRINSIC_INFO(ignore_id, klass, name, sig, fcode) \ | |
445 ID4(SID_ENUM(klass), SID_ENUM(name), SID_ENUM(sig), vmIntrinsics::fcode), | |
446 | |
447 0, VM_INTRINSICS_DO(VM_INTRINSIC_INFO, | |
448 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE) | |
449 0 | |
450 #undef VM_INTRINSIC_INFO | |
451 }; | |
452 | |
453 inline jlong intrinsic_info(vmIntrinsics::ID id) { | |
454 return intrinsic_info_array[vmIntrinsics::ID_from((int)id)]; | |
455 } | |
381 | 456 |
382 vmSymbols::SID vmIntrinsics::class_for(vmIntrinsics::ID id) { | 457 vmSymbols::SID vmIntrinsics::class_for(vmIntrinsics::ID id) { |
383 #ifndef PRODUCT | 458 jlong info = intrinsic_info(id); |
384 #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \ | 459 int shift = 2*vmSymbols::log2_SID_LIMIT + log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT); |
385 case id: return SID_ENUM(klass); | 460 assert(((ID4(1021,1022,1023,15) >> shift) & mask) == 1021, ""); |
386 | 461 return vmSymbols::SID( (info >> shift) & mask ); |
387 switch (id) { | |
388 VM_INTRINSICS_DO(VM_INTRINSIC_CASE, | |
389 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); | |
390 } | |
391 #undef VM_INTRINSIC_CASE | |
392 #endif //PRODUCT | |
393 return vmSymbols::NO_SID; | |
394 } | 462 } |
395 | 463 |
396 vmSymbols::SID vmIntrinsics::name_for(vmIntrinsics::ID id) { | 464 vmSymbols::SID vmIntrinsics::name_for(vmIntrinsics::ID id) { |
397 #ifndef PRODUCT | 465 jlong info = intrinsic_info(id); |
398 #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \ | 466 int shift = vmSymbols::log2_SID_LIMIT + log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT); |
399 case id: return SID_ENUM(name); | 467 assert(((ID4(1021,1022,1023,15) >> shift) & mask) == 1022, ""); |
400 | 468 return vmSymbols::SID( (info >> shift) & mask ); |
401 switch (id) { | |
402 VM_INTRINSICS_DO(VM_INTRINSIC_CASE, | |
403 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); | |
404 } | |
405 #undef VM_INTRINSIC_CASE | |
406 #endif //PRODUCT | |
407 return vmSymbols::NO_SID; | |
408 } | 469 } |
409 | 470 |
410 vmSymbols::SID vmIntrinsics::signature_for(vmIntrinsics::ID id) { | 471 vmSymbols::SID vmIntrinsics::signature_for(vmIntrinsics::ID id) { |
411 #ifndef PRODUCT | 472 jlong info = intrinsic_info(id); |
412 #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \ | 473 int shift = log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT); |
413 case id: return SID_ENUM(sig); | 474 assert(((ID4(1021,1022,1023,15) >> shift) & mask) == 1023, ""); |
414 | 475 return vmSymbols::SID( (info >> shift) & mask ); |
415 switch (id) { | |
416 VM_INTRINSICS_DO(VM_INTRINSIC_CASE, | |
417 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); | |
418 } | |
419 #undef VM_INTRINSIC_CASE | |
420 #endif //PRODUCT | |
421 return vmSymbols::NO_SID; | |
422 } | 476 } |
423 | 477 |
424 vmIntrinsics::Flags vmIntrinsics::flags_for(vmIntrinsics::ID id) { | 478 vmIntrinsics::Flags vmIntrinsics::flags_for(vmIntrinsics::ID id) { |
425 #ifndef PRODUCT | 479 jlong info = intrinsic_info(id); |
426 #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \ | 480 int shift = 0, mask = right_n_bits(log2_FLAG_LIMIT); |
427 case id: return fcode; | 481 assert(((ID4(1021,1022,1023,15) >> shift) & mask) == 15, ""); |
428 | 482 return Flags( (info >> shift) & mask ); |
429 switch (id) { | |
430 VM_INTRINSICS_DO(VM_INTRINSIC_CASE, | |
431 VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE); | |
432 } | |
433 #undef VM_INTRINSIC_CASE | |
434 #endif //PRODUCT | |
435 return F_none; | |
436 } | 483 } |
437 | 484 |
438 | 485 |
439 #ifndef PRODUCT | 486 #ifndef PRODUCT |
440 // verify_method performs an extra check on a matched intrinsic method | 487 // verify_method performs an extra check on a matched intrinsic method |