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