diff -r 9e8daec25638 -r ecc7862946d4 hotspot/src/share/vm/interpreter/bytecode.hpp --- a/hotspot/src/share/vm/interpreter/bytecode.hpp Mon Apr 20 14:48:03 2009 -0700 +++ b/hotspot/src/share/vm/interpreter/bytecode.hpp Tue Apr 21 23:21:04 2009 -0700 @@ -65,14 +65,6 @@ // The base class for different kinds of bytecode abstractions. // Provides the primitive operations to manipulate code relative // to an objects 'this' pointer. -// -// Note: Even though it seems that the fast_index & set_fast_index -// functions are machine specific, they're not. They only use -// the natural way to store a 16bit index on a given machine, -// independent of the particular byte ordering. Since all other -// places in the system that refer to these indices use the -// same method (the natural byte ordering on the platform) -// this will always work and be machine-independent). class Bytecode: public ThisRelativeObj { protected: @@ -83,24 +75,40 @@ // Attributes address bcp() const { return addr_at(0); } address next_bcp() const { return addr_at(0) + Bytecodes::length_at(bcp()); } + int instruction_size() const { return Bytecodes::length_at(bcp()); } Bytecodes::Code code() const { return Bytecodes::code_at(addr_at(0)); } Bytecodes::Code java_code() const { return Bytecodes::java_code(code()); } bool must_rewrite() const { return Bytecodes::can_rewrite(code()) && check_must_rewrite(); } bool is_active_breakpoint() const { return Bytecodes::is_active_breakpoint_at(bcp()); } - int one_byte_index() const { return byte_at(1); } - int two_byte_index() const { return (byte_at(1) << 8) + byte_at(2); } + int one_byte_index() const { assert_index_size(1); return byte_at(1); } + int two_byte_index() const { assert_index_size(2); return (byte_at(1) << 8) + byte_at(2); } + int offset() const { return (two_byte_index() << 16) >> 16; } address destination() const { return bcp() + offset(); } - int fast_index() const { return Bytes::get_native_u2(addr_at(1)); } // Attribute modification void set_code(Bytecodes::Code code); - void set_fast_index(int i); // Creation inline friend Bytecode* Bytecode_at(address bcp); + + private: + void assert_index_size(int required_size) const { +#ifdef ASSERT + int isize = instruction_size() - 1; + if (isize == 2 && code() == Bytecodes::_iinc) + isize = 1; + else if (isize <= 2) + ; // no change + else if (code() == Bytecodes::_invokedynamic) + isize = 4; + else + isize = 2; + assert(isize = required_size, "wrong index size"); +#endif + } }; inline Bytecode* Bytecode_at(address bcp) { @@ -195,6 +203,9 @@ bool is_invokevirtual() const { return adjusted_invoke_code() == Bytecodes::_invokevirtual; } bool is_invokestatic() const { return adjusted_invoke_code() == Bytecodes::_invokestatic; } bool is_invokespecial() const { return adjusted_invoke_code() == Bytecodes::_invokespecial; } + bool is_invokedynamic() const { return adjusted_invoke_code() == Bytecodes::_invokedynamic; } + + bool has_giant_index() const { return is_invokedynamic(); } bool is_valid() const { return is_invokeinterface() || is_invokevirtual() ||