Mercurial > hg > truffle
comparison src/share/vm/interpreter/bytecodeStream.hpp @ 726:be93aad57795
6655646: dynamic languages need dynamically linked call sites
Summary: invokedynamic instruction (JSR 292 RI)
Reviewed-by: twisti, never
author | jrose |
---|---|
date | Tue, 21 Apr 2009 23:21:04 -0700 |
parents | a61af66fc99e |
children | bd02caa94611 |
comparison
equal
deleted
inserted
replaced
725:928912ce8438 | 726:be93aad57795 |
---|---|
107 int next_bci() const { return _next_bci; } | 107 int next_bci() const { return _next_bci; } |
108 int end_bci() const { return _end_bci; } | 108 int end_bci() const { return _end_bci; } |
109 | 109 |
110 Bytecodes::Code code() const { return _code; } | 110 Bytecodes::Code code() const { return _code; } |
111 bool is_wide() const { return _is_wide; } | 111 bool is_wide() const { return _is_wide; } |
112 int instruction_size() const { return (_next_bci - _bci); } | |
112 bool is_last_bytecode() const { return _next_bci >= _end_bci; } | 113 bool is_last_bytecode() const { return _next_bci >= _end_bci; } |
113 | 114 |
114 address bcp() const { return method()->code_base() + _bci; } | 115 address bcp() const { return method()->code_base() + _bci; } |
115 address next_bcp() { return method()->code_base() + _next_bci; } | 116 address next_bcp() { return method()->code_base() + _next_bci; } |
116 | 117 |
120 // Bytecode-specific attributes | 121 // Bytecode-specific attributes |
121 int dest() const { return bci() + (short)Bytes::get_Java_u2(bcp() + 1); } | 122 int dest() const { return bci() + (short)Bytes::get_Java_u2(bcp() + 1); } |
122 int dest_w() const { return bci() + (int )Bytes::get_Java_u4(bcp() + 1); } | 123 int dest_w() const { return bci() + (int )Bytes::get_Java_u4(bcp() + 1); } |
123 | 124 |
124 // Unsigned indices, widening | 125 // Unsigned indices, widening |
125 int get_index() const { return (is_wide()) ? Bytes::get_Java_u2(bcp() + 2) : bcp()[1]; } | 126 int get_index() const { assert_index_size(is_wide() ? 2 : 1); |
126 int get_index_big() const { return (int)Bytes::get_Java_u2(bcp() + 1); } | 127 return (is_wide()) ? Bytes::get_Java_u2(bcp() + 2) : bcp()[1]; } |
128 int get_index_big() const { assert_index_size(2); | |
129 return (int)Bytes::get_Java_u2(bcp() + 1); } | |
130 int get_index_int() const { return has_giant_index() ? get_index_giant() : get_index_big(); } | |
131 int get_index_giant() const { assert_index_size(4); return Bytes::get_native_u4(bcp() + 1); } | |
132 int has_giant_index() const { return (code() == Bytecodes::_invokedynamic); } | |
133 | |
134 private: | |
135 void assert_index_size(int required_size) const { | |
136 #ifdef ASSERT | |
137 int isize = instruction_size() - (int)_is_wide - 1; | |
138 if (isize == 2 && code() == Bytecodes::_iinc) | |
139 isize = 1; | |
140 else if (isize <= 2) | |
141 ; // no change | |
142 else if (has_giant_index()) | |
143 isize = 4; | |
144 else | |
145 isize = 2; | |
146 assert(isize = required_size, "wrong index size"); | |
147 #endif | |
148 } | |
127 }; | 149 }; |
128 | 150 |
129 // In BytecodeStream, non-java bytecodes will be translated into the | 151 // In BytecodeStream, non-java bytecodes will be translated into the |
130 // corresponding java bytecodes. | 152 // corresponding java bytecodes. |
131 | 153 |