478 VMOp_Type type() const { return VMOp_RedefineClasses; } 479 bool doit_prologue(); 480 void doit(); 481 void doit_epilogue(); 482 483 bool allow_nested_vm_operations() const { return true; } 484 jvmtiError check_error() { return _res; } 485 486 // Modifiable test must be shared between IsModifiableClass query 487 // and redefine implementation 488 static bool is_modifiable_class(oop klass_mirror); 489 }; 490 491 492 // Helper class to mark and unmark metadata used on the stack as either handles 493 // or executing methods, so that it can't be deleted during class redefinition 494 // and class unloading. 495 class MetadataOnStackMark : public StackObj { 496 NOT_PRODUCT(static bool _is_active;) 497 public: 498 MetadataOnStackMark(); 499 ~MetadataOnStackMark(); 500 static void record(Metadata* m); 501 }; 502 503 #endif // SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP | 478 VMOp_Type type() const { return VMOp_RedefineClasses; } 479 bool doit_prologue(); 480 void doit(); 481 void doit_epilogue(); 482 483 bool allow_nested_vm_operations() const { return true; } 484 jvmtiError check_error() { return _res; } 485 486 // Modifiable test must be shared between IsModifiableClass query 487 // and redefine implementation 488 static bool is_modifiable_class(oop klass_mirror); 489 }; 490 491 492 // Helper class to mark and unmark metadata used on the stack as either handles 493 // or executing methods, so that it can't be deleted during class redefinition 494 // and class unloading. 495 class MetadataOnStackMark : public StackObj { 496 NOT_PRODUCT(static bool _is_active;) 497 public: 498 MetadataOnStackMark() NOT_JVMTI_RETURN; 499 ~MetadataOnStackMark() NOT_JVMTI_RETURN; 500 static void record(Metadata* m) NOT_JVMTI_RETURN; 501 }; 502 503 #endif // SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP |