hotspot/src/share/vm/interpreter/interpreter.cpp
changeset 7913 dd096a83bdbb
parent 7397 5b173b4ca846
child 8076 96d498ec7ae1
equal deleted inserted replaced
7901:ea3d83447861 7913:dd096a83bdbb
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2011, 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.
   235 
   235 
   236 
   236 
   237 // Return true if the interpreter can prove that the given bytecode has
   237 // Return true if the interpreter can prove that the given bytecode has
   238 // not yet been executed (in Java semantics, not in actual operation).
   238 // not yet been executed (in Java semantics, not in actual operation).
   239 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) {
   239 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) {
   240   address bcp = method->bcp_from(bci);
   240   Bytecodes::Code code = method()->code_at(bci);
   241   Bytecodes::Code code = Bytecodes::code_at(bcp, method());
   241 
   242 
   242   if (!Bytecodes::must_rewrite(code)) {
   243   if (!Bytecode_at(bcp)->must_rewrite(code)) {
       
   244     // might have been reached
   243     // might have been reached
   245     return false;
   244     return false;
   246   }
   245   }
   247 
   246 
   248   // the bytecode might not be rewritten if the method is an accessor, etc.
   247   // the bytecode might not be rewritten if the method is an accessor, etc.
   284 // Deoptimization support
   283 // Deoptimization support
   285 
   284 
   286 // If deoptimization happens, this function returns the point of next bytecode to continue execution
   285 // If deoptimization happens, this function returns the point of next bytecode to continue execution
   287 address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) {
   286 address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) {
   288   assert(method->contains(bcp), "just checkin'");
   287   assert(method->contains(bcp), "just checkin'");
   289   Bytecodes::Code code   = Bytecodes::java_code_at(bcp);
   288   Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
   290   assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
   289   assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
   291   int             bci    = method->bci_from(bcp);
   290   int             bci    = method->bci_from(bcp);
   292   int             length = -1; // initial value for debugging
   291   int             length = -1; // initial value for debugging
   293   // compute continuation length
   292   // compute continuation length
   294   length = Bytecodes::length_at(bcp);
   293   length = Bytecodes::length_at(method, bcp);
   295   // compute result type
   294   // compute result type
   296   BasicType type = T_ILLEGAL;
   295   BasicType type = T_ILLEGAL;
   297 
   296 
   298   switch (code) {
   297   switch (code) {
   299     case Bytecodes::_invokevirtual  :
   298     case Bytecodes::_invokevirtual  :
   301     case Bytecodes::_invokestatic   :
   300     case Bytecodes::_invokestatic   :
   302     case Bytecodes::_invokeinterface: {
   301     case Bytecodes::_invokeinterface: {
   303       Thread *thread = Thread::current();
   302       Thread *thread = Thread::current();
   304       ResourceMark rm(thread);
   303       ResourceMark rm(thread);
   305       methodHandle mh(thread, method);
   304       methodHandle mh(thread, method);
   306       type = Bytecode_invoke_at(mh, bci)->result_type(thread);
   305       type = Bytecode_invoke(mh, bci).result_type(thread);
   307       // since the cache entry might not be initialized:
   306       // since the cache entry might not be initialized:
   308       // (NOT needed for the old calling convension)
   307       // (NOT needed for the old calling convension)
   309       if (!is_top_frame) {
   308       if (!is_top_frame) {
   310         int index = Bytes::get_native_u2(bcp+1);
   309         int index = Bytes::get_native_u2(bcp+1);
   311         method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
   310         method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
   315 
   314 
   316    case Bytecodes::_invokedynamic: {
   315    case Bytecodes::_invokedynamic: {
   317       Thread *thread = Thread::current();
   316       Thread *thread = Thread::current();
   318       ResourceMark rm(thread);
   317       ResourceMark rm(thread);
   319       methodHandle mh(thread, method);
   318       methodHandle mh(thread, method);
   320       type = Bytecode_invoke_at(mh, bci)->result_type(thread);
   319       type = Bytecode_invoke(mh, bci).result_type(thread);
   321       // since the cache entry might not be initialized:
   320       // since the cache entry might not be initialized:
   322       // (NOT needed for the old calling convension)
   321       // (NOT needed for the old calling convension)
   323       if (!is_top_frame) {
   322       if (!is_top_frame) {
   324         int index = Bytes::get_native_u4(bcp+1);
   323         int index = Bytes::get_native_u4(bcp+1);
   325         method->constants()->cache()->secondary_entry_at(index)->set_parameter_size(callee_parameters);
   324         method->constants()->cache()->secondary_entry_at(index)->set_parameter_size(callee_parameters);
   332     case Bytecodes::_ldc2_w:
   331     case Bytecodes::_ldc2_w:
   333       {
   332       {
   334         Thread *thread = Thread::current();
   333         Thread *thread = Thread::current();
   335         ResourceMark rm(thread);
   334         ResourceMark rm(thread);
   336         methodHandle mh(thread, method);
   335         methodHandle mh(thread, method);
   337         type = Bytecode_loadconstant_at(mh, bci)->result_type();
   336         type = Bytecode_loadconstant(mh, bci).result_type();
   338         break;
   337         break;
   339       }
   338       }
   340 
   339 
   341     default:
   340     default:
   342       type = Bytecodes::result_type(code);
   341       type = Bytecodes::result_type(code);
   354 // the bytecode.
   353 // the bytecode.
   355 // Note: Bytecodes::_athrow is a special case in that it does not return
   354 // Note: Bytecodes::_athrow is a special case in that it does not return
   356 //       Interpreter::deopt_entry(vtos, 0) like others
   355 //       Interpreter::deopt_entry(vtos, 0) like others
   357 address AbstractInterpreter::deopt_reexecute_entry(methodOop method, address bcp) {
   356 address AbstractInterpreter::deopt_reexecute_entry(methodOop method, address bcp) {
   358   assert(method->contains(bcp), "just checkin'");
   357   assert(method->contains(bcp), "just checkin'");
   359   Bytecodes::Code code   = Bytecodes::java_code_at(bcp);
   358   Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
   360 #ifdef COMPILER1
   359 #ifdef COMPILER1
   361   if(code == Bytecodes::_athrow ) {
   360   if(code == Bytecodes::_athrow ) {
   362     return Interpreter::rethrow_exception_entry();
   361     return Interpreter::rethrow_exception_entry();
   363   }
   362   }
   364 #endif /* COMPILER1 */
   363 #endif /* COMPILER1 */