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) |