hotspot/src/share/vm/interpreter/rewriter.cpp
changeset 30117 cce2cdac56dc
parent 22750 a3c879b18f22
child 30764 fec48bf5a827
equal deleted inserted replaced
30116:f5a6b1ebdbe3 30117:cce2cdac56dc
    24 
    24 
    25 #include "precompiled.hpp"
    25 #include "precompiled.hpp"
    26 #include "interpreter/bytecodes.hpp"
    26 #include "interpreter/bytecodes.hpp"
    27 #include "interpreter/interpreter.hpp"
    27 #include "interpreter/interpreter.hpp"
    28 #include "interpreter/rewriter.hpp"
    28 #include "interpreter/rewriter.hpp"
       
    29 #include "memory/metaspaceShared.hpp"
    29 #include "memory/gcLocker.hpp"
    30 #include "memory/gcLocker.hpp"
    30 #include "memory/resourceArea.hpp"
    31 #include "memory/resourceArea.hpp"
    31 #include "oops/generateOopMap.hpp"
    32 #include "oops/generateOopMap.hpp"
    32 #include "prims/methodHandles.hpp"
    33 #include "prims/methodHandles.hpp"
    33 
    34 
   165 void Rewriter::rewrite_invokespecial(address bcp, int offset, bool reverse, bool* invokespecial_error) {
   166 void Rewriter::rewrite_invokespecial(address bcp, int offset, bool reverse, bool* invokespecial_error) {
   166   address p = bcp + offset;
   167   address p = bcp + offset;
   167   if (!reverse) {
   168   if (!reverse) {
   168     int cp_index = Bytes::get_Java_u2(p);
   169     int cp_index = Bytes::get_Java_u2(p);
   169     if (_pool->tag_at(cp_index).is_interface_method()) {
   170     if (_pool->tag_at(cp_index).is_interface_method()) {
   170     int cache_index = add_invokespecial_cp_cache_entry(cp_index);
   171       int cache_index = add_invokespecial_cp_cache_entry(cp_index);
   171     if (cache_index != (int)(jushort) cache_index) {
   172       if (cache_index != (int)(jushort) cache_index) {
   172       *invokespecial_error = true;
   173         *invokespecial_error = true;
   173     }
   174       }
   174     Bytes::put_native_u2(p, cache_index);
   175       Bytes::put_native_u2(p, cache_index);
   175   } else {
   176     } else {
   176       rewrite_member_reference(bcp, offset, reverse);
   177       rewrite_member_reference(bcp, offset, reverse);
   177     }
   178     }
   178   } else {
   179   } else {
   179     rewrite_member_reference(bcp, offset, reverse);
   180     rewrite_member_reference(bcp, offset, reverse);
   180   }
   181   }
   498   // entries had to be added.
   499   // entries had to be added.
   499   patch_invokedynamic_bytecodes();
   500   patch_invokedynamic_bytecodes();
   500 }
   501 }
   501 
   502 
   502 void Rewriter::rewrite(instanceKlassHandle klass, TRAPS) {
   503 void Rewriter::rewrite(instanceKlassHandle klass, TRAPS) {
       
   504   if (!DumpSharedSpaces) {
       
   505     assert(!MetaspaceShared::is_in_shared_space(klass()), "archive methods must not be rewritten at run time");
       
   506   }
   503   ResourceMark rm(THREAD);
   507   ResourceMark rm(THREAD);
   504   Rewriter     rw(klass, klass->constants(), klass->methods(), CHECK);
   508   Rewriter     rw(klass, klass->constants(), klass->methods(), CHECK);
   505   // (That's all, folks.)
   509   // (That's all, folks.)
   506 }
   510 }
   507 
       
   508 
   511 
   509 Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Method*>* methods, TRAPS)
   512 Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Method*>* methods, TRAPS)
   510   : _klass(klass),
   513   : _klass(klass),
   511     _pool(cpool),
   514     _pool(cpool),
   512     _methods(methods)
   515     _methods(methods)