// Initialize a class on behalf of a task. // When entering here, the class may either be not initialized at all, or it // may be being initialized. // // If not initialized, a task mirror is created. // setup_java_mirror set the task mirror pointer in the task mirror table // of the class in "initializing" state. // set_initialized sets the task mirror pointer in "initialized" state. ReturnOop InstanceClass::initialize_for_task(JVM_SINGLE_ARG_TRAPS){ UsingFastOops fast_oops; TaskMirror::Fast tm; tm = task_mirror_desc(); if (TaskMirrorDesc::is_being_initialized_mirror((TaskMirrorDesc*)tm.obj())) { tm = TaskMirror::clinit_list_lookup(this); if (tm.is_null()) { // allocate Task mirror tm = setup_task_mirror(static_field_size(), vtable_length(), true JVM_CHECK_0); initialize_static_fields(&tm); } } else { return tm.obj(); } GUARANTEE(!tm.is_null(), "null task mirror"); JavaClassObj::Fast m = tm().real_java_mirror(); initialize_internal(Thread::current(), &m JVM_CHECK_0); return tm.obj(); }
void ReferenceTypeImpl::static_field_getter_setter(PacketInputStream *in, PacketOutputStream *out, bool is_setter) { UsingFastOops fast_oops; InstanceClass::Fast clazz = in->read_class_ref(); jint num = in->read_int(); int i; #ifdef AZZERT if (TraceDebugger) { tty->print_cr("Static %s: class=0x%lx, count=%ld", (is_setter ? "Set" : "Get"), clazz.obj(), num); } #endif // Prevent compiler warnings clazz = clazz; // Create a buffered output stream so we can asynchronously send an error // Calculate the size based on half of the items being 'longs' if (!is_setter) { out->write_int(num); } for (i = 0; i < num; i++) { UsingFastOops fast_oops_2; InstanceClass::Fast field_clazz = in->read_class_ref(); TypeArray::Fast fields; jint field_id = in->read_int(); char type_tag; if (field_clazz.is_null()) { out->send_error(JDWP_Error_INVALID_FIELDID); return; } fields = field_clazz().fields(); if (fields.is_null()) { out->send_error(JDWP_Error_INVALID_FIELDID); return; } if (field_id >= fields().length() / Field::NUMBER_OF_SLOTS) { out->send_error(JDWP_Error_INVALID_FIELDID); return; } Field field(&field_clazz, field_id * Field::NUMBER_OF_SLOTS); if (!field.is_static() || (is_setter && field.is_final())) { out->send_error(JDWP_Error_INVALID_FIELDID); return; } type_tag = (field.type() < T_OBJECT ) ? JavaDebugger::get_tag_from_type(field.type()) : JDWP_Tag_OBJECT; Oop::Fast p; #if ENABLE_ISOLATES // Statics don't live at the end of the JavaClassDesc, we need to // find the correct task mirror for this task { SETUP_ERROR_CHECKER_ARG; TaskGCContext tmp(in->transport()->task_id()); TaskMirror::Fast tm = field_clazz().task_mirror_no_check(); if (!TaskMirrorDesc::is_initialized_mirror((TaskMirrorDesc*)tm.obj())) { GUARANTEE(field_clazz().is_interface(), "Non-interface class not initialized"); if (field_clazz().is_interface()) { SAVE_CURRENT_EXCEPTION; // If an interface contains only non-object data then // it will not get initialized since javac will only // create a reference to the interface class if you // are accessing some static object like a static array // We need to at least initialized the statics tm = task_barrier(Thread::current(), field_clazz.obj() JVM_NO_CHECK); if (tm.is_null()) { // oome RESTORE_CURRENT_EXCEPTION; out->send_error(JDWP_Error_OUT_OF_MEMORY); return; } RESTORE_CURRENT_EXCEPTION; } } p = tm(); } #else p = field_clazz(); #endif if (is_setter) { ObjectReferenceImpl::read_value_to_address(in, &p, field.offset(), type_tag, true); } else { ObjectReferenceImpl::write_value_from_address(out, &p, field.offset(), type_tag, true, true); } #ifdef AZZERT if (TraceDebugger) { tty->print(" "); JavaDebugger::print_class(&field_clazz); tty->print("."); JavaDebugger::print_field(&field); tty->print(": "); ObjectReferenceImpl::print_value_from_address(&p, field.offset(), type_tag); tty->print_cr(""); } #endif } out->send_packet(); }