hotspot/src/share/vm/interpreter/bytecode.hpp
changeset 13728 882756847a04
parent 13391 30245956af37
child 25715 d5a8dbdc5150
equal deleted inserted replaced
13727:caf5eb7dd4a7 13728:882756847a04
     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));
   156 };
   156 };
   157 
   157 
   158 
   158 
   159 class Bytecode_lookupswitch: public Bytecode {
   159 class Bytecode_lookupswitch: public Bytecode {
   160  public:
   160  public:
   161   Bytecode_lookupswitch(methodOop method, address bcp): Bytecode(method, bcp) { verify(); }
   161   Bytecode_lookupswitch(Method* method, address bcp): Bytecode(method, bcp) { verify(); }
   162   // Defined in ciStreams.hpp
   162   // Defined in ciStreams.hpp
   163   inline Bytecode_lookupswitch(const ciBytecodeStream* stream);
   163   inline Bytecode_lookupswitch(const ciBytecodeStream* stream);
   164   void verify() const PRODUCT_RETURN;
   164   void verify() const PRODUCT_RETURN;
   165 
   165 
   166   // Attributes
   166   // Attributes
   172   }
   172   }
   173 };
   173 };
   174 
   174 
   175 class Bytecode_tableswitch: public Bytecode {
   175 class Bytecode_tableswitch: public Bytecode {
   176  public:
   176  public:
   177   Bytecode_tableswitch(methodOop method, address bcp): Bytecode(method, bcp) { verify(); }
   177   Bytecode_tableswitch(Method* method, address bcp): Bytecode(method, bcp) { verify(); }
   178   // Defined in ciStreams.hpp
   178   // Defined in ciStreams.hpp
   179   inline Bytecode_tableswitch(const ciBytecodeStream* stream);
   179   inline Bytecode_tableswitch(const ciBytecodeStream* stream);
   180   void verify() const PRODUCT_RETURN;
   180   void verify() const PRODUCT_RETURN;
   181 
   181 
   182   // Attributes
   182   // Attributes
   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