176 }
177 return true;
178 }
179
180 address TemplateInterpreter::_remove_activation_entry = NULL;
181 address TemplateInterpreter::_remove_activation_preserving_args_entry = NULL;
182
183
184 address TemplateInterpreter::_throw_ArrayIndexOutOfBoundsException_entry = NULL;
185 address TemplateInterpreter::_throw_ArrayStoreException_entry = NULL;
186 address TemplateInterpreter::_throw_ArithmeticException_entry = NULL;
187 address TemplateInterpreter::_throw_ClassCastException_entry = NULL;
188 address TemplateInterpreter::_throw_NullPointerException_entry = NULL;
189 address TemplateInterpreter::_throw_StackOverflowError_entry = NULL;
190 address TemplateInterpreter::_throw_exception_entry = NULL;
191
192 #ifndef PRODUCT
193 EntryPoint TemplateInterpreter::_trace_code;
194 #endif // !PRODUCT
195 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
196 EntryPoint TemplateInterpreter::_earlyret_entry;
197 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
198 address TemplateInterpreter::_deopt_reexecute_return_entry;
199 EntryPoint TemplateInterpreter::_safept_entry;
200
201 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
202 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
203 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
204
205 DispatchTable TemplateInterpreter::_active_table;
206 DispatchTable TemplateInterpreter::_normal_table;
207 DispatchTable TemplateInterpreter::_safept_table;
208 address TemplateInterpreter::_wentry_point[DispatchTable::length];
209
210
211 //------------------------------------------------------------------------------------------------------------------------
212 // Entry points
213
214 /**
215 * Returns the return entry table for the given invoke bytecode.
216 */
217 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
218 switch (code) {
219 case Bytecodes::_invokestatic:
220 case Bytecodes::_invokespecial:
221 case Bytecodes::_invokevirtual:
222 case Bytecodes::_invokehandle:
223 return Interpreter::invoke_return_entry_table();
224 case Bytecodes::_invokeinterface:
225 return Interpreter::invokeinterface_return_entry_table();
226 case Bytecodes::_invokedynamic:
227 return Interpreter::invokedynamic_return_entry_table();
228 default:
229 fatal("invalid bytecode: %s", Bytecodes::name(code));
230 return NULL;
231 }
232 }
233
234 /**
235 * Returns the return entry address for the given top-of-stack state and bytecode.
236 */
237 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
238 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
239 const int index = TosState_as_index(state);
240 switch (code) {
241 case Bytecodes::_invokestatic:
242 case Bytecodes::_invokespecial:
243 case Bytecodes::_invokevirtual:
244 case Bytecodes::_invokehandle:
245 return _invoke_return_entry[index];
246 case Bytecodes::_invokeinterface:
247 return _invokeinterface_return_entry[index];
248 case Bytecodes::_invokedynamic:
249 return _invokedynamic_return_entry[index];
250 default:
251 assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code));
252 address entry = _return_entry[length].entry(state);
253 vmassert(entry != NULL, "unsupported return entry requested, length=%d state=%d", length, index);
254 return entry;
255 }
256 }
257
258
259 address TemplateInterpreter::deopt_entry(TosState state, int length) {
260 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
261 address entry = _deopt_entry[length].entry(state);
262 vmassert(entry != NULL, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state));
263 return entry;
264 }
265
266 //------------------------------------------------------------------------------------------------------------------------
267 // Suport for invokes
268
269 int TemplateInterpreter::TosState_as_index(TosState state) {
270 assert( state < number_of_states , "Invalid state in TosState_as_index");
271 assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds");
272 return (int)state;
|
176 }
177 return true;
178 }
179
180 address TemplateInterpreter::_remove_activation_entry = NULL;
181 address TemplateInterpreter::_remove_activation_preserving_args_entry = NULL;
182
183
184 address TemplateInterpreter::_throw_ArrayIndexOutOfBoundsException_entry = NULL;
185 address TemplateInterpreter::_throw_ArrayStoreException_entry = NULL;
186 address TemplateInterpreter::_throw_ArithmeticException_entry = NULL;
187 address TemplateInterpreter::_throw_ClassCastException_entry = NULL;
188 address TemplateInterpreter::_throw_NullPointerException_entry = NULL;
189 address TemplateInterpreter::_throw_StackOverflowError_entry = NULL;
190 address TemplateInterpreter::_throw_exception_entry = NULL;
191
192 #ifndef PRODUCT
193 EntryPoint TemplateInterpreter::_trace_code;
194 #endif // !PRODUCT
195 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
196 EntryPoint TemplateInterpreter::_return_entryX[TemplateInterpreter::number_of_return_entries];
197 EntryPoint TemplateInterpreter::_earlyret_entry;
198 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
199 address TemplateInterpreter::_deopt_reexecute_return_entry;
200 EntryPoint TemplateInterpreter::_safept_entry;
201
202 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
203 address TemplateInterpreter::_invoke_return_entryX[TemplateInterpreter::number_of_return_addrs];
204 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
205 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
206
207 DispatchTable TemplateInterpreter::_active_table;
208 DispatchTable TemplateInterpreter::_normal_table;
209 DispatchTable TemplateInterpreter::_safept_table;
210 address TemplateInterpreter::_wentry_point[DispatchTable::length];
211
212
213 //------------------------------------------------------------------------------------------------------------------------
214 // Entry points
215
216 /**
217 * Returns the return entry table for the given invoke bytecode.
218 */
219 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
220 switch (code) {
221 case Bytecodes::_invokestatic:
222 case Bytecodes::_invokespecial:
223 case Bytecodes::_invokevirtual:
224 case Bytecodes::_invokehandle:
225 return Interpreter::invoke_return_entry_table();
226 case Bytecodes::_invokeinterface:
227 return Interpreter::invokeinterface_return_entry_table();
228 case Bytecodes::_invokedynamic:
229 return Interpreter::invokedynamic_return_entry_table();
230 default:
231 fatal("invalid bytecode: %s", Bytecodes::name(code));
232 return NULL;
233 }
234 }
235
236 /**
237 * Returns the return entry address for the given top-of-stack state and bytecode.
238 */
239 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
240 return return_entry(state, length, code, false);
241 }
242
243 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code, bool X) {
244 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
245 const int index = TosState_as_index(state);
246 switch (code) {
247 case Bytecodes::_invokestatic:
248 case Bytecodes::_invokespecial:
249 case Bytecodes::_invokevirtual:
250 case Bytecodes::_invokehandle:
251 return X ? _invoke_return_entryX[index] : _invoke_return_entry[index];
252 case Bytecodes::_invokeinterface:
253 return _invokeinterface_return_entry[index];
254 case Bytecodes::_invokedynamic:
255 return _invokedynamic_return_entry[index];
256 default:
257 assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code));
258 address entry = (X ? _return_entryX[length] : _return_entry[length]).entry(state);
259 vmassert(entry != NULL, "unsupported return entry requested, length=%d state=%d", length, index);
260 return entry;
261 }
262 }
263
264
265 address TemplateInterpreter::deopt_entry(TosState state, int length) {
266 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
267 address entry = _deopt_entry[length].entry(state);
268 vmassert(entry != NULL, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state));
269 return entry;
270 }
271
272 //------------------------------------------------------------------------------------------------------------------------
273 // Suport for invokes
274
275 int TemplateInterpreter::TosState_as_index(TosState state) {
276 assert( state < number_of_states , "Invalid state in TosState_as_index");
277 assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds");
278 return (int)state;
|