src/share/vm/prims/jvmtiEnvBase.hpp
Print this page
*** 332,342 ****
--- 332,394 ----
}
JvmtiEnv* first() { return JvmtiEnvBase::head_environment(); }
JvmtiEnv* next(JvmtiEnvBase* env) { return env->next_environment(); }
};
+ // VM operation to update for pop top frame.
+ class VM_UpdateForPopTopFrame : public VM_Operation {
+ private:
+ JvmtiThreadState* _state;
+ jvmtiError _result;
+ public:
+ VM_UpdateForPopTopFrame(JvmtiThreadState* state) {
+ _state = state;
+ _result = JVMTI_ERROR_NONE;
+ }
+ VMOp_Type type() const { return VMOp_UpdateForPopTopFrame; }
+ jvmtiError result() { return _result; }
+ void doit() {
+ JavaThread* jt = _state->get_thread();
+ if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) {
+ _state->update_for_pop_top_frame();
+ } else {
+ _result = JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+ }
+ };
+
+ // VM operation to set frame pop.
+ class VM_SetFramePop : public VM_Operation {
+ private:
+ JvmtiEnv *_env;
+ JvmtiThreadState* _state;
+ jint _depth;
+ jvmtiError _result;
+
+ public:
+ VM_SetFramePop(JvmtiEnv *env, JvmtiThreadState* state, jint depth) {
+ _env = env;
+ _state = state;
+ _depth = depth;
+ _result = JVMTI_ERROR_NONE;
+ }
+ bool allow_nested_vm_operations() const { return true; }
+ VMOp_Type type() const { return VMOp_SetFramePop; }
+ jvmtiError result() { return _result; }
+ void doit() {
+ JavaThread* jt = _state->get_thread();
+ if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) {
+ int frame_number = _state->count_frames() - _depth;
+ _state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_pop(frame_number);
+ } else {
+ _result = JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+ }
+ };
+
+
// VM operation to get monitor information with stack depth.
class VM_GetOwnedMonitorInfo : public VM_Operation {
private:
JvmtiEnv *_env;
JavaThread* _calling_thread;