< prev index next >

src/hotspot/share/interpreter/templateInterpreter.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 193,202 **** --- 193,203 ---- EntryPoint TemplateInterpreter::_trace_code; #endif // !PRODUCT EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries]; EntryPoint TemplateInterpreter::_earlyret_entry; EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; + address TemplateInterpreter::_deopt_reexecute_return_entry; EntryPoint TemplateInterpreter::_safept_entry; address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs]; address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs]; address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
*** 246,263 **** return _invokeinterface_return_entry[index]; case Bytecodes::_invokedynamic: return _invokedynamic_return_entry[index]; default: assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code)); ! return _return_entry[length].entry(state); } } address TemplateInterpreter::deopt_entry(TosState state, int length) { guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); ! return _deopt_entry[length].entry(state); } //------------------------------------------------------------------------------------------------------------------------ // Suport for invokes --- 247,268 ---- return _invokeinterface_return_entry[index]; case Bytecodes::_invokedynamic: return _invokedynamic_return_entry[index]; default: assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code)); ! address entry = _return_entry[length].entry(state); ! vmassert(entry != NULL, "unsupported return entry requested, length=%d state=%d", length, index); ! return entry; } } address TemplateInterpreter::deopt_entry(TosState state, int length) { guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); ! address entry = _deopt_entry[length].entry(state); ! vmassert(entry != NULL, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state)); ! return entry; } //------------------------------------------------------------------------------------------------------------------------ // Suport for invokes
*** 311,328 **** // the bytecode. // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases // that do not return "Interpreter::deopt_entry(vtos, 0)" address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) { assert(method->contains(bcp), "just checkin'"); ! Bytecodes::Code code = Bytecodes::java_code_at(method, bcp); ! if (code == Bytecodes::_return) { // This is used for deopt during registration of finalizers // during Object.<init>. We simply need to resume execution at // the standard return vtos bytecode to pop the frame normally. // reexecuting the real bytecode would cause double registration // of the finalizable object. ! return _normal_table.entry(Bytecodes::_return).entry(vtos); } else { return AbstractInterpreter::deopt_reexecute_entry(method, bcp); } } --- 316,333 ---- // the bytecode. // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases // that do not return "Interpreter::deopt_entry(vtos, 0)" address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) { assert(method->contains(bcp), "just checkin'"); ! Bytecodes::Code code = Bytecodes::code_at(method, bcp); ! if (code == Bytecodes::_return_register_finalizer) { // This is used for deopt during registration of finalizers // during Object.<init>. We simply need to resume execution at // the standard return vtos bytecode to pop the frame normally. // reexecuting the real bytecode would cause double registration // of the finalizable object. ! return Interpreter::deopt_reexecute_return_entry(); } else { return AbstractInterpreter::deopt_reexecute_entry(method, bcp); } }
< prev index next >