1 /* |
1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. 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. |
25 #ifndef SHARE_VM_INTERPRETER_BYTECODE_HPP |
25 #ifndef SHARE_VM_INTERPRETER_BYTECODE_HPP |
26 #define SHARE_VM_INTERPRETER_BYTECODE_HPP |
26 #define SHARE_VM_INTERPRETER_BYTECODE_HPP |
27 |
27 |
28 #include "interpreter/bytecodes.hpp" |
28 #include "interpreter/bytecodes.hpp" |
29 #include "memory/allocation.hpp" |
29 #include "memory/allocation.hpp" |
30 #include "oops/methodOop.hpp" |
30 #include "oops/method.hpp" |
31 #ifdef TARGET_ARCH_x86 |
31 #ifdef TARGET_ARCH_x86 |
32 # include "bytes_x86.hpp" |
32 # include "bytes_x86.hpp" |
33 #endif |
33 #endif |
34 #ifdef TARGET_ARCH_sparc |
34 #ifdef TARGET_ARCH_sparc |
35 # include "bytes_sparc.hpp" |
35 # include "bytes_sparc.hpp" |
66 int get_Java_u4_at (int offset) const { return Bytes::get_Java_u4(addr_at(offset)); } |
66 int get_Java_u4_at (int offset) const { return Bytes::get_Java_u4(addr_at(offset)); } |
67 int get_native_u2_at (int offset) const { return Bytes::get_native_u2(addr_at(offset)); } |
67 int get_native_u2_at (int offset) const { return Bytes::get_native_u2(addr_at(offset)); } |
68 int get_native_u4_at (int offset) const { return Bytes::get_native_u4(addr_at(offset)); } |
68 int get_native_u4_at (int offset) const { return Bytes::get_native_u4(addr_at(offset)); } |
69 |
69 |
70 public: |
70 public: |
71 Bytecode(methodOop method, address bcp): _bcp(bcp), _code(Bytecodes::code_at(method, addr_at(0))) { |
71 Bytecode(Method* method, address bcp): _bcp(bcp), _code(Bytecodes::code_at(method, addr_at(0))) { |
72 assert(method != NULL, "this form requires a valid methodOop"); |
72 assert(method != NULL, "this form requires a valid Method*"); |
73 } |
73 } |
74 // Defined in ciStreams.hpp |
74 // Defined in ciStreams.hpp |
75 inline Bytecode(const ciBytecodeStream* stream, address bcp = NULL); |
75 inline Bytecode(const ciBytecodeStream* stream, address bcp = NULL); |
76 |
76 |
77 // Attributes |
77 // Attributes |
94 return Bytes::get_native_u2(p); |
94 return Bytes::get_native_u2(p); |
95 else return Bytes::get_Java_u2(p); |
95 else return Bytes::get_Java_u2(p); |
96 } |
96 } |
97 int get_index_u1_cpcache(Bytecodes::Code bc) const { |
97 int get_index_u1_cpcache(Bytecodes::Code bc) const { |
98 assert_same_format_as(bc); assert_index_size(1, bc); |
98 assert_same_format_as(bc); assert_index_size(1, bc); |
99 return *(jubyte*)addr_at(1) + constantPoolOopDesc::CPCACHE_INDEX_TAG; |
99 return *(jubyte*)addr_at(1) + ConstantPool::CPCACHE_INDEX_TAG; |
100 } |
100 } |
101 int get_index_u2_cpcache(Bytecodes::Code bc) const { |
101 int get_index_u2_cpcache(Bytecodes::Code bc) const { |
102 assert_same_format_as(bc); assert_index_size(2, bc); assert_native_index(bc); |
102 assert_same_format_as(bc); assert_index_size(2, bc); assert_native_index(bc); |
103 return Bytes::get_native_u2(addr_at(1)) + constantPoolOopDesc::CPCACHE_INDEX_TAG; |
103 return Bytes::get_native_u2(addr_at(1)) + ConstantPool::CPCACHE_INDEX_TAG; |
104 } |
104 } |
105 int get_index_u4(Bytecodes::Code bc) const { |
105 int get_index_u4(Bytecodes::Code bc) const { |
106 assert_same_format_as(bc); assert_index_size(4, bc); |
106 assert_same_format_as(bc); assert_index_size(4, bc); |
107 assert(can_use_native_byte_order(bc), ""); |
107 assert(can_use_native_byte_order(bc), ""); |
108 return Bytes::get_native_u4(addr_at(1)); |
108 return Bytes::get_native_u4(addr_at(1)); |
194 const methodHandle _method; // method containing the bytecode |
194 const methodHandle _method; // method containing the bytecode |
195 |
195 |
196 Bytecode_member_ref(methodHandle method, int bci) : Bytecode(method(), method()->bcp_from(bci)), _method(method) {} |
196 Bytecode_member_ref(methodHandle method, int bci) : Bytecode(method(), method()->bcp_from(bci)), _method(method) {} |
197 |
197 |
198 methodHandle method() const { return _method; } |
198 methodHandle method() const { return _method; } |
199 constantPoolOop constants() const { return _method->constants(); } |
199 ConstantPool* constants() const { return _method->constants(); } |
200 constantPoolCacheOop cpcache() const { return _method->constants()->cache(); } |
200 ConstantPoolCache* cpcache() const { return _method->constants()->cache(); } |
201 ConstantPoolCacheEntry* cpcache_entry() const; |
201 ConstantPoolCacheEntry* cpcache_entry() const; |
202 |
202 |
203 public: |
203 public: |
204 int index() const; // cache index (loaded from instruction) |
204 int index() const; // cache index (loaded from instruction) |
205 int pool_index() const; // constant pool index |
205 int pool_index() const; // constant pool index |
276 }; |
276 }; |
277 |
277 |
278 // Abstraction for checkcast |
278 // Abstraction for checkcast |
279 class Bytecode_checkcast: public Bytecode { |
279 class Bytecode_checkcast: public Bytecode { |
280 public: |
280 public: |
281 Bytecode_checkcast(methodOop method, address bcp): Bytecode(method, bcp) { verify(); } |
281 Bytecode_checkcast(Method* method, address bcp): Bytecode(method, bcp) { verify(); } |
282 void verify() const { assert(Bytecodes::java_code(code()) == Bytecodes::_checkcast, "check checkcast"); } |
282 void verify() const { assert(Bytecodes::java_code(code()) == Bytecodes::_checkcast, "check checkcast"); } |
283 |
283 |
284 // Returns index |
284 // Returns index |
285 long index() const { return get_index_u2(Bytecodes::_checkcast); }; |
285 long index() const { return get_index_u2(Bytecodes::_checkcast); }; |
286 }; |
286 }; |
287 |
287 |
288 // Abstraction for instanceof |
288 // Abstraction for instanceof |
289 class Bytecode_instanceof: public Bytecode { |
289 class Bytecode_instanceof: public Bytecode { |
290 public: |
290 public: |
291 Bytecode_instanceof(methodOop method, address bcp): Bytecode(method, bcp) { verify(); } |
291 Bytecode_instanceof(Method* method, address bcp): Bytecode(method, bcp) { verify(); } |
292 void verify() const { assert(code() == Bytecodes::_instanceof, "check instanceof"); } |
292 void verify() const { assert(code() == Bytecodes::_instanceof, "check instanceof"); } |
293 |
293 |
294 // Returns index |
294 // Returns index |
295 long index() const { return get_index_u2(Bytecodes::_instanceof); }; |
295 long index() const { return get_index_u2(Bytecodes::_instanceof); }; |
296 }; |
296 }; |
297 |
297 |
298 class Bytecode_new: public Bytecode { |
298 class Bytecode_new: public Bytecode { |
299 public: |
299 public: |
300 Bytecode_new(methodOop method, address bcp): Bytecode(method, bcp) { verify(); } |
300 Bytecode_new(Method* method, address bcp): Bytecode(method, bcp) { verify(); } |
301 void verify() const { assert(java_code() == Bytecodes::_new, "check new"); } |
301 void verify() const { assert(java_code() == Bytecodes::_new, "check new"); } |
302 |
302 |
303 // Returns index |
303 // Returns index |
304 long index() const { return get_index_u2(Bytecodes::_new); }; |
304 long index() const { return get_index_u2(Bytecodes::_new); }; |
305 }; |
305 }; |
306 |
306 |
307 class Bytecode_multianewarray: public Bytecode { |
307 class Bytecode_multianewarray: public Bytecode { |
308 public: |
308 public: |
309 Bytecode_multianewarray(methodOop method, address bcp): Bytecode(method, bcp) { verify(); } |
309 Bytecode_multianewarray(Method* method, address bcp): Bytecode(method, bcp) { verify(); } |
310 void verify() const { assert(java_code() == Bytecodes::_multianewarray, "check new"); } |
310 void verify() const { assert(java_code() == Bytecodes::_multianewarray, "check new"); } |
311 |
311 |
312 // Returns index |
312 // Returns index |
313 long index() const { return get_index_u2(Bytecodes::_multianewarray); }; |
313 long index() const { return get_index_u2(Bytecodes::_multianewarray); }; |
314 }; |
314 }; |
315 |
315 |
316 class Bytecode_anewarray: public Bytecode { |
316 class Bytecode_anewarray: public Bytecode { |
317 public: |
317 public: |
318 Bytecode_anewarray(methodOop method, address bcp): Bytecode(method, bcp) { verify(); } |
318 Bytecode_anewarray(Method* method, address bcp): Bytecode(method, bcp) { verify(); } |
319 void verify() const { assert(java_code() == Bytecodes::_anewarray, "check anewarray"); } |
319 void verify() const { assert(java_code() == Bytecodes::_anewarray, "check anewarray"); } |
320 |
320 |
321 // Returns index |
321 // Returns index |
322 long index() const { return get_index_u2(Bytecodes::_anewarray); }; |
322 long index() const { return get_index_u2(Bytecodes::_anewarray); }; |
323 }; |
323 }; |
338 assert(stdc == Bytecodes::_ldc || |
338 assert(stdc == Bytecodes::_ldc || |
339 stdc == Bytecodes::_ldc_w || |
339 stdc == Bytecodes::_ldc_w || |
340 stdc == Bytecodes::_ldc2_w, "load constant"); |
340 stdc == Bytecodes::_ldc2_w, "load constant"); |
341 } |
341 } |
342 |
342 |
343 // Only non-standard bytecodes (fast_aldc) have CP cache indexes. |
343 // Only non-standard bytecodes (fast_aldc) have reference cache indexes. |
344 bool has_cache_index() const { return code() >= Bytecodes::number_of_java_codes; } |
344 bool has_cache_index() const { return code() >= Bytecodes::number_of_java_codes; } |
345 |
345 |
346 int pool_index() const; // index into constant pool |
346 int pool_index() const; // index into constant pool |
347 int cache_index() const { // index into CP cache (or -1 if none) |
347 int cache_index() const { // index into reference cache (or -1 if none) |
348 return has_cache_index() ? raw_index() : -1; |
348 return has_cache_index() ? raw_index() : -1; |
349 } |
349 } |
350 |
350 |
351 BasicType result_type() const; // returns the result type of the ldc |
351 BasicType result_type() const; // returns the result type of the ldc |
352 |
352 |