Print this page
rev 1072 : [mq]: meth.walker.patch

Split Close
Expand all
Collapse all
          --- old/src/share/vm/classfile/vmSymbols.cpp
          +++ new/src/share/vm/classfile/vmSymbols.cpp
↓ open down ↓ 62 lines elided ↑ open up ↑
  63   63  #endif //PRODUCT
  64   64  
  65   65  // Put all the VM symbol strings in one place.
  66   66  // Makes for a more compact libjvm.
  67   67  #define VM_SYMBOL_BODY(name, string) string "\0"
  68   68  static const char* vm_symbol_bodies = VM_SYMBOLS_DO(VM_SYMBOL_BODY, VM_ALIAS_IGNORE);
  69   69  
  70   70  void vmSymbols::initialize(TRAPS) {
  71   71    assert((int)SID_LIMIT <= (1<<log2_SID_LIMIT), "must fit in this bitfield");
  72   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   75    if (!UseSharedSpaces) {
  75   76      const char* string = &vm_symbol_bodies[0];
  76   77      for (int index = (int)FIRST_SID; index < (int)SID_LIMIT; index++) {
  77   78        symbolOop sym = oopFactory::new_symbol(string, CHECK);
  78   79        _symbols[index] = sym;
  79   80        string += strlen(string); // skip string body
  80   81        string += 1;              // skip trailing null
  81   82      }
  82   83  
↓ open down ↓ 181 lines elided ↑ open up ↑
 264  265      // Unless it's a duplicate, assert that the sids are the same.
 265  266      if (_symbols[sid] != _symbols[sid2]) {
 266  267        assert(sid == sid2, "binary same as linear search");
 267  268      }
 268  269    }
 269  270  #endif //ASSERT
 270  271  
 271  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 +methodOop vmIntrinsics::method_for(vmIntrinsics::ID id) {
      303 +  if (id == _none)  return NULL;
      304 +  symbolOop cname = vmSymbols::symbol_at(class_for(id));
      305 +  symbolOop mname = vmSymbols::symbol_at(name_for(id));
      306 +  symbolOop msig  = vmSymbols::symbol_at(signature_for(id));
      307 +  if (cname == NULL || mname == NULL || msig == NULL)  return NULL;
      308 +  klassOop k = SystemDictionary::find_well_known_klass(cname);
      309 +  if (k == NULL)  return NULL;
      310 +  return instanceKlass::cast(k)->find_method(mname, msig);
      311 +}
      312 +
 274  313  
 275  314  #define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0"
 276  315  static const char* vm_intrinsic_name_bodies =
 277  316    VM_INTRINSICS_DO(VM_INTRINSIC_INITIALIZE,
 278  317                     VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE);
 279  318  
 280  319  static const char* vm_intrinsic_name_table[vmIntrinsics::ID_LIMIT];
 281  320  
 282  321  const char* vmIntrinsics::name_at(vmIntrinsics::ID id) {
 283  322    const char** nt = &vm_intrinsic_name_table[0];
↓ open down ↓ 86 lines elided ↑ open up ↑
 370  409    if (kptr != NULL)  kname = kptr + 1;
 371  410    int len = jio_snprintf(buf, buflen, "%s: %s%s.%s%s",
 372  411                           str, fname, kname, mname, sname);
 373  412    if (len < buflen)
 374  413      str = buf;
 375  414  #endif //PRODUCT
 376  415    return str;
 377  416  }
 378  417  
 379  418  
 380      -// These are for friendly printouts of intrinsics:
      419 +// These are to get information about intrinsics.
 381  420  
 382      -vmSymbols::SID vmIntrinsics::class_for(vmIntrinsics::ID id) {
 383      -#ifndef PRODUCT
 384      -#define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
 385      -  case id: return SID_ENUM(klass);
      421 +#define ID4(x, y, z, f) ((ID3(x, y, z) << vmIntrinsics::log2_FLAG_LIMIT) | (int)(f))
 386  422  
 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;
      423 +static const jint intrinsic_info_array[vmIntrinsics::ID_LIMIT+1] = {
      424 +#define VM_INTRINSIC_INFO(ignore_id, klass, name, sig, fcode) \
      425 +  ID4(SID_ENUM(klass), SID_ENUM(name), SID_ENUM(sig), vmIntrinsics::fcode),
      426 +
      427 +  0, VM_INTRINSICS_DO(VM_INTRINSIC_INFO,
      428 +                     VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE)
      429 +    0
      430 +#undef VM_INTRINSIC_INFO
      431 +};
      432 +
      433 +inline jint intrinsic_info(vmIntrinsics::ID id) {
      434 +  return intrinsic_info_array[vmIntrinsics::ID_from((int)id)];
 394  435  }
 395  436  
 396      -vmSymbols::SID vmIntrinsics::name_for(vmIntrinsics::ID id) {
 397      -#ifndef PRODUCT
 398      -#define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
 399      -  case id: return SID_ENUM(name);
      437 +vmSymbols::SID vmIntrinsics::class_for(vmIntrinsics::ID id) {
      438 +  jint info = intrinsic_info(id);
      439 +  int shift = 2*vmSymbols::log2_SID_LIMIT + log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT);
      440 +  assert(((ID4(31,1022,1023,15) >> shift) & mask) == 31, "");
      441 +  return vmSymbols::SID( (info >> shift) & mask );
      442 +}
 400  443  
 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;
      444 +vmSymbols::SID vmIntrinsics::name_for(vmIntrinsics::ID id) {
      445 +  jint info = intrinsic_info(id);
      446 +  int shift = vmSymbols::log2_SID_LIMIT + log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT);
      447 +  assert(((ID4(31,1022,1023,15) >> shift) & mask) == 1022, "");
      448 +  return vmSymbols::SID( (info >> shift) & mask );
 408  449  }
 409  450  
 410  451  vmSymbols::SID vmIntrinsics::signature_for(vmIntrinsics::ID id) {
 411      -#ifndef PRODUCT
 412      -#define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
 413      -  case id: return SID_ENUM(sig);
 414      -
 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;
      452 +  jint info = intrinsic_info(id);
      453 +  int shift = log2_FLAG_LIMIT, mask = right_n_bits(vmSymbols::log2_SID_LIMIT);
      454 +  assert(((ID4(31,1022,1023,15) >> shift) & mask) == 1023, "");
      455 +  return vmSymbols::SID( (info >> shift) & mask );
 422  456  }
 423  457  
 424  458  vmIntrinsics::Flags vmIntrinsics::flags_for(vmIntrinsics::ID id) {
 425      -#ifndef PRODUCT
 426      -#define VM_INTRINSIC_CASE(id, klass, name, sig, fcode) \
 427      -  case id: return fcode;
 428      -
 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;
      459 +  jint info = intrinsic_info(id);
      460 +  int shift = 0, mask = right_n_bits(log2_FLAG_LIMIT);
      461 +  assert(((ID4(31,1022,1023,15) >> shift) & mask) == 15, "");
      462 +  return Flags( (info >> shift) & mask );
 436  463  }
 437  464  
 438  465  
 439  466  #ifndef PRODUCT
 440  467  // verify_method performs an extra check on a matched intrinsic method
 441  468  
 442  469  static bool match_method(methodOop m, symbolOop n, symbolOop s) {
 443  470    return (m->name() == n &&
 444  471            m->signature() == s);
 445  472  }
↓ open down ↓ 53 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX