< prev index next >

src/hotspot/share/interpreter/templateInterpreter.cpp

Print this page
rev 50307 : [mq]: cont


 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;


< prev index next >