src/share/vm/classfile/vmSymbols.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
6894206 Cdiff src/share/vm/classfile/vmSymbols.cpp
src/share/vm/classfile/vmSymbols.cpp
Print this page
rev 1072 : [mq]: meth.walker.patch
*** 68,77 ****
--- 68,78 ----
static const char* vm_symbol_bodies = VM_SYMBOLS_DO(VM_SYMBOL_BODY, VM_ALIAS_IGNORE);
void vmSymbols::initialize(TRAPS) {
assert((int)SID_LIMIT <= (1<<log2_SID_LIMIT), "must fit in this bitfield");
assert((int)SID_LIMIT*5 > (1<<log2_SID_LIMIT), "make the bitfield smaller, please");
+ assert(vmIntrinsics::FLAG_LIMIT <= (1 << vmIntrinsics::log2_FLAG_LIMIT), "must fit in this bitfield");
if (!UseSharedSpaces) {
const char* string = &vm_symbol_bodies[0];
for (int index = (int)FIRST_SID; index < (int)SID_LIMIT; index++) {
symbolOop sym = oopFactory::new_symbol(string, CHECK);
*** 269,278 ****
--- 270,317 ----
#endif //ASSERT
return sid;
}
+ static vmIntrinsics::ID wrapper_intrinsic(BasicType type, bool unboxing) {
+ #define TYPE2(type, unboxing) ((int)(type)*2 + ((unboxing) ? 1 : 0))
+ switch (TYPE2(type, unboxing)) {
+ #define BASIC_TYPE_CASE(type, box, unbox) \
+ case TYPE2(type, false): return vmIntrinsics::box; \
+ case TYPE2(type, true): return vmIntrinsics::unbox
+ BASIC_TYPE_CASE(T_BOOLEAN, _Boolean_valueOf, _booleanValue);
+ BASIC_TYPE_CASE(T_BYTE, _Byte_valueOf, _byteValue);
+ BASIC_TYPE_CASE(T_CHAR, _Character_valueOf, _charValue);
+ BASIC_TYPE_CASE(T_SHORT, _Short_valueOf, _shortValue);
+ BASIC_TYPE_CASE(T_INT, _Integer_valueOf, _intValue);
+ BASIC_TYPE_CASE(T_LONG, _Long_valueOf, _longValue);
+ BASIC_TYPE_CASE(T_FLOAT, _Float_valueOf, _floatValue);
+ BASIC_TYPE_CASE(T_DOUBLE, _Double_valueOf, _doubleValue);
+ #undef BASIC_TYPE_CASE
+ }
+ #undef TYPE2
+ return vmIntrinsics::_none;
+ }
+
+ vmIntrinsics::ID vmIntrinsics::for_boxing(BasicType type) {
+ return wrapper_intrinsic(type, false);
+ }
+ vmIntrinsics::ID vmIntrinsics::for_unboxing(BasicType type) {
+ return wrapper_intrinsic(type, true);
+ }
+
+ methodOop vmIntrinsics::method_for(vmIntrinsics::ID id) {
+ if (id == _none) return NULL;
+ symbolOop cname = vmSymbols::symbol_at(class_for(id));
+ symbolOop mname = vmSymbols::symbol_at(name_for(id));
+ symbolOop msig = vmSymbols::symbol_at(signature_for(id));
+ if (cname == NULL || mname == NULL || msig == NULL) return NULL;
+ klassOop k = SystemDictionary::find_well_known_klass(cname);
+ if (k == NULL) return NULL;
+ return instanceKlass::cast(k)->find_method(mname, msig);
+ }
+
#define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0"
static const char* vm_intrinsic_name_bodies =
VM_INTRINSICS_DO(VM_INTRINSIC_INITIALIZE,
VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE);
*** 375,440 ****
#endif //PRODUCT
return str;
}
! // These are for friendly printouts of intrinsics:
! vmSymbols::SID vmIntrinsics::class_for(vmIntrinsics::ID id) {
! #ifndef PRODUCT
! #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
! case id: return SID_ENUM(klass);
! switch (id) {
! VM_INTRINSICS_DO(VM_INTRINSIC_CASE,
! VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE);
! }
! #undef VM_INTRINSIC_CASE
! #endif //PRODUCT
! return vmSymbols::NO_SID;
}
! vmSymbols::SID vmIntrinsics::name_for(vmIntrinsics::ID id) {
! #ifndef PRODUCT
! #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
! case id: return SID_ENUM(name);
! switch (id) {
! VM_INTRINSICS_DO(VM_INTRINSIC_CASE,
! VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE);
! }
! #undef VM_INTRINSIC_CASE
! #endif //PRODUCT
! return vmSymbols::NO_SID;
}
vmSymbols::SID vmIntrinsics::signature_for(vmIntrinsics::ID id) {
! #ifndef PRODUCT
! #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
! case id: return SID_ENUM(sig);
!
! switch (id) {
! VM_INTRINSICS_DO(VM_INTRINSIC_CASE,
! VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE);
! }
! #undef VM_INTRINSIC_CASE
! #endif //PRODUCT
! return vmSymbols::NO_SID;
}
vmIntrinsics::Flags vmIntrinsics::flags_for(vmIntrinsics::ID id) {
! #ifndef PRODUCT
! #define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
! case id: return fcode;
!
! switch (id) {
! VM_INTRINSICS_DO(VM_INTRINSIC_CASE,
! VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE);
! }
! #undef VM_INTRINSIC_CASE
! #endif //PRODUCT
! return F_none;
}
#ifndef PRODUCT
// verify_method performs an extra check on a matched intrinsic method
--- 414,467 ----
#endif //PRODUCT
return str;
}
! // These are to get information about intrinsics.
! #define ID4(x, y, z, f) ((ID3(x, y, z) << vmIntrinsics::log2_FLAG_LIMIT) | (int)(f))
! static const jint intrinsic_info_array[vmIntrinsics::ID_LIMIT+1] = {
! #define VM_INTRINSIC_INFO(ignore_id, klass, name, sig, fcode) \
! ID4(SID_ENUM(klass), SID_ENUM(name), SID_ENUM(sig), vmIntrinsics::fcode),
!
! 0, VM_INTRINSICS_DO(VM_INTRINSIC_INFO,
! VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE)
! 0
! #undef VM_INTRINSIC_INFO
! };
!
! inline jint intrinsic_info(vmIntrinsics::ID id) {
! return intrinsic_info_array[vmIntrinsics::ID_from((int)id)];
}
! vmSymbols::SID vmIntrinsics::class_for(vmIntrinsics::ID id) {
! jint info = intrinsic_info(id);
! int shift = 2*vmSymbols::log2_SID_LIMIT + log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT);
! assert(((ID4(31,1022,1023,15) >> shift) & mask) == 31, "");
! return vmSymbols::SID( (info >> shift) & mask );
! }
! vmSymbols::SID vmIntrinsics::name_for(vmIntrinsics::ID id) {
! jint info = intrinsic_info(id);
! int shift = vmSymbols::log2_SID_LIMIT + log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT);
! assert(((ID4(31,1022,1023,15) >> shift) & mask) == 1022, "");
! return vmSymbols::SID( (info >> shift) & mask );
}
vmSymbols::SID vmIntrinsics::signature_for(vmIntrinsics::ID id) {
! jint info = intrinsic_info(id);
! int shift = log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT);
! assert(((ID4(31,1022,1023,15) >> shift) & mask) == 1023, "");
! return vmSymbols::SID( (info >> shift) & mask );
}
vmIntrinsics::Flags vmIntrinsics::flags_for(vmIntrinsics::ID id) {
! jint info = intrinsic_info(id);
! int shift = 0, mask = right_n_bits(log2_FLAG_LIMIT);
! assert(((ID4(31,1022,1023,15) >> shift) & mask) == 15, "");
! return Flags( (info >> shift) & mask );
}
#ifndef PRODUCT
// verify_method performs an extra check on a matched intrinsic method
src/share/vm/classfile/vmSymbols.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File