jvmticapabilities.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 503 行 · 第 1/2 页
C
503 行
/* if this is during OnLoad more capabilities are available */ /* if (JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) { */ either(result, &globals->capabilities.onload, result); either(result, &globals->capabilities.onload_solo_remaining, result); /* } */}void update(){ CVMJvmtiGlobals *globals = &CVMglobals.jvmti; jvmtiCapabilities avail; jboolean interp_events; /* all capabilities */ either(&globals->capabilities.always, &globals->capabilities.always_solo, &avail); interp_events = avail.can_generate_field_access_events || avail.can_generate_field_modification_events || avail.can_generate_single_step_events || avail.can_generate_frame_pop_events || avail.can_generate_method_entry_events || avail.can_generate_method_exit_events; /* * If can_redefine_classes is enabled in the onload phase then we know that * the dependency information recorded by the compiler is complete. */ /* if ((avail.can_redefine_classes || avail.can_retransform_classes) && JvmtiEnv::get_phase() == JVMTI_PHASE_ONLOAD) { JvmtiExport::set_all_dependencies_are_recorded(true); } */ CVMjvmtiSetCanGetSourceDebugExtension(avail.can_get_source_debug_extension); CVMjvmtiSetCanExamineOrDeoptAnywhere( avail.can_generate_breakpoint_events || interp_events || avail.can_redefine_classes || avail.can_retransform_classes || avail.can_access_local_variables || avail.can_get_owned_monitor_info || avail.can_get_current_contended_monitor || avail.can_get_monitor_info || avail.can_get_owned_monitor_stack_depth_info); CVMjvmtiSetCanMaintainOriginalMethodOrder( avail.can_maintain_original_method_order); CVMjvmtiSetCanPostInterpreterEvents(interp_events); CVMjvmtiSetCanHotswapOrPostBreakpoint( avail.can_generate_breakpoint_events || avail.can_redefine_classes || avail.can_retransform_classes); CVMjvmtiSetCanModifyAnyClass( avail.can_generate_breakpoint_events || avail.can_retransform_classes || /* NOTE: remove when there is support for redefine with class sharing */ avail.can_retransform_any_class || avail.can_redefine_classes || /* NOTE: remove when there is support for redefine with class sharing */ avail.can_redefine_any_class || avail.can_generate_all_class_hook_events); CVMjvmtiSetCanWalkAnySpace(avail.can_tag_objects); /* NOTE: remove when IterateOverReachableObjects supports class sharing */ CVMjvmtiSetCanAccessLocalVariables( avail.can_access_local_variables || avail.can_redefine_classes || avail.can_retransform_classes); CVMjvmtiSetCanPostExceptions( avail.can_generate_exception_events || avail.can_generate_frame_pop_events || avail.can_generate_method_exit_events); CVMjvmtiSetCanPostBreakpoint(avail.can_generate_breakpoint_events); CVMjvmtiSetCanPostFieldAccess(avail.can_generate_field_access_events); CVMjvmtiSetCanPostFieldModification( avail.can_generate_field_modification_events); CVMjvmtiSetCanPostMethodEntry(avail.can_generate_method_entry_events); CVMjvmtiSetCanPostMethodExit(avail.can_generate_method_exit_events || avail.can_generate_frame_pop_events); CVMjvmtiSetCanPopFrame(avail.can_pop_frame); CVMjvmtiSetCanForceEarlyReturn(avail.can_force_early_return); CVMjvmtiSetShouldCleanUpHeapObjects(avail.can_generate_breakpoint_events);}jvmtiError CVMjvmtiAddCapabilities(const jvmtiCapabilities *current, const jvmtiCapabilities *prohibited, const jvmtiCapabilities *desired, jvmtiCapabilities *result){ CVMJvmtiGlobals *globals = &CVMglobals.jvmti; /* check that the capabilities being added are potential capabilities */ jvmtiCapabilities temp; CVMjvmtiGetPotentialCapabilities(current, prohibited, &temp); if (hasSome(exclude(desired, &temp, &temp))) { return JVMTI_ERROR_NOT_AVAILABLE; } /* add to the set of ever acquired capabilities */ either(&globals->capabilities.acquired, desired, &globals->capabilities.acquired); /* onload capabilities that got added are now permanent - so, also remove from onload */ both(&globals->capabilities.onload, desired, &temp); either(&globals->capabilities.always, &temp, &globals->capabilities.always); exclude(&globals->capabilities.onload, &temp, &globals->capabilities.onload); /* same for solo capabilities (transferred capabilities in the remaining sets handled as part of standard grab - below) */ both(&globals->capabilities.onload_solo, desired, &temp); either(&globals->capabilities.always_solo, &temp, &globals->capabilities.always_solo); exclude(&globals->capabilities.onload_solo, &temp, &globals->capabilities.onload_solo); /* remove solo capabilities that are now taken */ exclude(&globals->capabilities.always_solo_remaining, desired, &globals->capabilities.always_solo_remaining); exclude(&globals->capabilities.onload_solo_remaining, desired, &globals->capabilities.onload_solo_remaining); /* return the result */ either(current, desired, result); update(); return JVMTI_ERROR_NONE;}void CVMjvmtiRelinquishCapabilities(const jvmtiCapabilities *current, const jvmtiCapabilities *unwanted, jvmtiCapabilities *result){ CVMJvmtiGlobals *globals = &CVMglobals.jvmti; jvmtiCapabilities to_trash; jvmtiCapabilities temp; /* can't give up what you don't have */ both(current, unwanted, &to_trash); /* restore solo capabilities but only those that belong */ either(&globals->capabilities.always_solo_remaining, both(&globals->capabilities.always_solo, &to_trash, &temp), &globals->capabilities.always_solo_remaining); either(&globals->capabilities.onload_solo_remaining, both(&globals->capabilities.onload_solo, &to_trash, &temp), &globals->capabilities.onload_solo_remaining); update(); /* return the result */ exclude(current, unwanted, result);}#ifdef DEBUGvoid print_cr(char *s){ CVMdebugPrintf(("%s\n", s));}void print_capabilities(const jvmtiCapabilities* cap) { print_cr("----- capabilities -----"); if (cap->can_tag_objects) print_cr("can_tag_objects"); if (cap->can_generate_field_modification_events) print_cr("can_generate_field_modification_events"); if (cap->can_generate_field_access_events) print_cr("can_generate_field_access_events"); if (cap->can_get_bytecodes) print_cr("can_get_bytecodes"); if (cap->can_get_synthetic_attribute) print_cr("can_get_synthetic_attribute"); if (cap->can_get_owned_monitor_info) print_cr("can_get_owned_monitor_info"); if (cap->can_get_current_contended_monitor) print_cr("can_get_current_contended_monitor"); if (cap->can_get_monitor_info) print_cr("can_get_monitor_info"); if (cap->can_get_constant_pool) print_cr("can_get_constant_pool"); if (cap->can_pop_frame) print_cr("can_pop_frame"); if (cap->can_force_early_return) print_cr("can_force_early_return"); if (cap->can_redefine_classes) print_cr("can_redefine_classes"); if (cap->can_retransform_classes) print_cr("can_retransform_classes"); if (cap->can_signal_thread) print_cr("can_signal_thread"); if (cap->can_get_source_file_name) print_cr("can_get_source_file_name"); if (cap->can_get_line_numbers) print_cr("can_get_line_numbers"); if (cap->can_get_source_debug_extension) print_cr("can_get_source_debug_extension"); if (cap->can_access_local_variables) print_cr("can_access_local_variables"); if (cap->can_maintain_original_method_order) print_cr("can_maintain_original_method_order"); if (cap->can_generate_single_step_events) print_cr("can_generate_single_step_events"); if (cap->can_generate_exception_events) print_cr("can_generate_exception_events"); if (cap->can_generate_frame_pop_events) print_cr("can_generate_frame_pop_events"); if (cap->can_generate_breakpoint_events) print_cr("can_generate_breakpoint_events"); if (cap->can_suspend) print_cr("can_suspend"); if (cap->can_redefine_any_class) print_cr("can_redefine_any_class"); if (cap->can_retransform_any_class) print_cr("can_retransform_any_class"); if (cap->can_get_current_thread_cpu_time) print_cr("can_get_current_thread_cpu_time"); if (cap->can_get_thread_cpu_time) print_cr("can_get_thread_cpu_time"); if (cap->can_generate_method_entry_events) print_cr("can_generate_method_entry_events"); if (cap->can_generate_method_exit_events) print_cr("can_generate_method_exit_events"); if (cap->can_generate_all_class_hook_events) print_cr("can_generate_all_class_hook_events"); if (cap->can_generate_compiled_method_load_events) print_cr("can_generate_compiled_method_load_events"); if (cap->can_generate_monitor_events) print_cr("can_generate_monitor_events"); if (cap->can_generate_vm_object_alloc_events) print_cr("can_generate_vm_object_alloc_events"); if (cap->can_generate_native_method_bind_events) print_cr("can_generate_native_method_bind_events"); if (cap->can_generate_garbage_collection_events) print_cr("can_generate_garbage_collection_events"); if (cap->can_generate_object_free_events) print_cr("can_generate_object_free_events");}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?