43 public: 44 SimpleScopeDesc(CompiledMethod* code, address pc) { 45 PcDesc* pc_desc = code->pc_desc_at(pc); 46 assert(pc_desc != NULL, "Must be able to find matching PcDesc"); 47 DebugInfoReadStream buffer(code, pc_desc->scope_decode_offset()); 48 int ignore_sender = buffer.read_int(); 49 _method = buffer.read_method(); 50 _bci = buffer.read_bci(); 51 } 52 53 Method* method() { return _method; } 54 int bci() { return _bci; } 55 }; 56 57 // ScopeDescs contain the information that makes source-level debugging of 58 // nmethods possible; each scopeDesc describes a method activation 59 60 class ScopeDesc : public ResourceObj { 61 public: 62 // Constructor 63 ScopeDesc(const CompiledMethod* code, int decode_offset, int obj_decode_offset, bool reexecute, bool rethrow_exception, bool return_oop); 64 65 // Calls above, giving default value of "serialized_null" to the 66 // "obj_decode_offset" argument. (We don't use a default argument to 67 // avoid a .hpp-.hpp dependency.) 68 ScopeDesc(const CompiledMethod* code, int decode_offset, bool reexecute, bool rethrow_exception, bool return_oop); 69 70 // Direct access to scope 71 ScopeDesc* at_offset(int decode_offset) { return new ScopeDesc(this, decode_offset); } 72 73 // JVM state 74 Method* method() const { return _method; } 75 int bci() const { return _bci; } 76 bool should_reexecute() const { return _reexecute; } 77 bool rethrow_exception() const { return _rethrow_exception; } 78 bool return_oop() const { return _return_oop; } 79 80 GrowableArray<ScopeValue*>* locals(); 81 GrowableArray<ScopeValue*>* expressions(); 82 GrowableArray<MonitorValue*>* monitors(); 83 GrowableArray<ScopeValue*>* objects(); 84 85 // Stack walking, returns NULL if this is the outer most scope. 86 ScopeDesc* sender() const; 87 88 // Returns where the scope was decoded 89 int decode_offset() const { return _decode_offset; } 90 91 int sender_decode_offset() const { return _sender_decode_offset; } 92 93 // Tells whether sender() returns NULL 94 bool is_top() const; 95 96 private: 97 void initialize(const ScopeDesc* parent, int decode_offset); 98 // Alternative constructors 99 ScopeDesc(const ScopeDesc* parent); 100 ScopeDesc(const ScopeDesc* parent, int decode_offset); 101 102 // JVM state 103 Method* _method; 104 int _bci; 105 bool _reexecute; 106 bool _rethrow_exception; 107 bool _return_oop; 108 109 // Decoding offsets 110 int _decode_offset; 111 int _sender_decode_offset; 112 int _locals_decode_offset; 113 int _expressions_decode_offset; 114 int _monitors_decode_offset; 115 116 // Object pool 117 GrowableArray<ScopeValue*>* _objects; 118 119 // Nmethod information 120 const CompiledMethod* _code; 121 122 // Decoding operations 123 void decode_body(); 124 GrowableArray<ScopeValue*>* decode_scope_values(int decode_offset); 125 GrowableArray<MonitorValue*>* decode_monitor_values(int decode_offset); 126 GrowableArray<ScopeValue*>* decode_object_values(int decode_offset); 127 | 43 public: 44 SimpleScopeDesc(CompiledMethod* code, address pc) { 45 PcDesc* pc_desc = code->pc_desc_at(pc); 46 assert(pc_desc != NULL, "Must be able to find matching PcDesc"); 47 DebugInfoReadStream buffer(code, pc_desc->scope_decode_offset()); 48 int ignore_sender = buffer.read_int(); 49 _method = buffer.read_method(); 50 _bci = buffer.read_bci(); 51 } 52 53 Method* method() { return _method; } 54 int bci() { return _bci; } 55 }; 56 57 // ScopeDescs contain the information that makes source-level debugging of 58 // nmethods possible; each scopeDesc describes a method activation 59 60 class ScopeDesc : public ResourceObj { 61 public: 62 // Constructor 63 ScopeDesc(const CompiledMethod* code, int decode_offset, int obj_decode_offset, bool reexecute, bool rethrow_exception, bool return_oop, bool return_vt); 64 65 // Calls above, giving default value of "serialized_null" to the 66 // "obj_decode_offset" argument. (We don't use a default argument to 67 // avoid a .hpp-.hpp dependency.) 68 ScopeDesc(const CompiledMethod* code, int decode_offset, bool reexecute, bool rethrow_exception, bool return_oop, bool return_vt); 69 70 // Direct access to scope 71 ScopeDesc* at_offset(int decode_offset) { return new ScopeDesc(this, decode_offset); } 72 73 // JVM state 74 Method* method() const { return _method; } 75 int bci() const { return _bci; } 76 bool should_reexecute() const { return _reexecute; } 77 bool rethrow_exception() const { return _rethrow_exception; } 78 bool return_oop() const { return _return_oop; } 79 bool return_vt() const { return _return_vt; } 80 81 GrowableArray<ScopeValue*>* locals(); 82 GrowableArray<ScopeValue*>* expressions(); 83 GrowableArray<MonitorValue*>* monitors(); 84 GrowableArray<ScopeValue*>* objects(); 85 86 // Stack walking, returns NULL if this is the outer most scope. 87 ScopeDesc* sender() const; 88 89 // Returns where the scope was decoded 90 int decode_offset() const { return _decode_offset; } 91 92 int sender_decode_offset() const { return _sender_decode_offset; } 93 94 // Tells whether sender() returns NULL 95 bool is_top() const; 96 97 private: 98 void initialize(const ScopeDesc* parent, int decode_offset); 99 // Alternative constructors 100 ScopeDesc(const ScopeDesc* parent); 101 ScopeDesc(const ScopeDesc* parent, int decode_offset); 102 103 // JVM state 104 Method* _method; 105 int _bci; 106 bool _reexecute; 107 bool _rethrow_exception; 108 bool _return_oop; 109 bool _return_vt; 110 111 // Decoding offsets 112 int _decode_offset; 113 int _sender_decode_offset; 114 int _locals_decode_offset; 115 int _expressions_decode_offset; 116 int _monitors_decode_offset; 117 118 // Object pool 119 GrowableArray<ScopeValue*>* _objects; 120 121 // Nmethod information 122 const CompiledMethod* _code; 123 124 // Decoding operations 125 void decode_body(); 126 GrowableArray<ScopeValue*>* decode_scope_values(int decode_offset); 127 GrowableArray<MonitorValue*>* decode_monitor_values(int decode_offset); 128 GrowableArray<ScopeValue*>* decode_object_values(int decode_offset); 129 |