/* * Copyright (c) 1997, 2021, 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. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. *
*/
// A vframeArray is an array used for momentarily storing off stack Java method activations // during deoptimization. Essentially it is an array of vframes where each vframe // data is stored off stack. This structure will never exist across a safepoint so // there is no need to gc any oops that are stored in the structure.
class LocalsClosure; class ExpressionStackClosure; class MonitorStackClosure; class MonitorArrayElement; class StackValueCollection;
// A vframeArrayElement is an element of a vframeArray. Each element // represent an interpreter frame which will eventually be created.
class vframeArrayElement { friendclass VMStructs;
private:
frame _frame; // the interpreter frame we will unpack into int _bci; // raw bci for this vframe bool _reexecute; // whether we should reexecute this bytecode
Method* _method; // the method for this vframe
MonitorChunk* _monitors; // active monitors for this vframe
StackValueCollection* _locals;
StackValueCollection* _expressions; #ifdef ASSERT bool _removed_monitors; #endif
// Returns the on stack word size for this frame // callee_parameters is the number of callee locals residing inside this frame int on_stack_size(int callee_parameters, int callee_locals, bool is_top_frame, int popframe_extra_stack_expression_els) const;
// Unpacks the element to skeletal interpreter frame void unpack_on_stack(int caller_actual_parameters, int callee_parameters, int callee_locals,
frame* caller, bool is_top_frame, bool is_bottom_frame, int exec_mode);
// this can be a ResourceObj if we don't save the last one... // but it does make debugging easier even if we can't look // at the data in each vframeElement
class vframeArray: public CHeapObj<mtCompiler> { friendclass VMStructs;
private:
// Here is what a vframeArray looks like in memory
/* fixed part description of the original frame _frames - number of vframes in this array adapter info callee register save area variable part vframeArrayElement [ 0 ] ... vframeArrayElement [_frames - 1]
*/
JavaThread* _owner_thread;
frame _original; // the original frame of the deoptee
frame _caller; // caller of root frame in vframeArray
frame _sender;
Deoptimization::UnrollBlock* _unroll_block; int _frame_size;
int _frames; // number of javavframes in the array (does not count any adapter)
// Allocates a new vframe in the array and fills the array with vframe information in chunk void fill_in(JavaThread* thread, int frame_size, GrowableArray<compiledVFrame*>* chunk, const RegisterMap *reg_map, bool realloc_failures);
// Returns the owner of this vframeArray
JavaThread* owner_thread() const { return _owner_thread; }
// Returns the size of the frame that got deoptimized int frame_size() const { return _frame_size; }
// Unpack the array on the stack passed in stack interval void unpack_to_stack(frame &unpack_frame, int exec_mode, int caller_actual_parameters);
// Deallocates monitor chunks allocated during deoptimization. // This should be called when the array is not used anymore. void deallocate_monitor_chunks();
// Accessor for register map
address register_location(int i) const;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.