// // Helper function for field access // jfieldID _KNI_field_lookup_helper(jclass classHandle, const char* name, const char* signature, bool is_static) { UsingFastOops fast_oops; JavaClassObj::Fast mirror = kni_read_handle(classHandle); InstanceClass::Fast ic = mirror().java_class(); InstanceClass::Fast holder(ic.obj()); GUARANTEE(ic.is_instance_class(), "sanity check"); SETUP_ERROR_CHECKER_ARG; Symbol::Fast n = SymbolTable::check_symbol_for(name _KNI_CHECK_0); Symbol::Fast s = TypeSymbol::parse((char*)signature _KNI_CHECK_0); Field field(&holder, &n, &s); #ifndef PRODUCT // If you're hit by this GUARANTEE, make sure you have use // the DontRenameNonPublicFields option in the -romconfig file for // this class. //GUARANTEE(!field.is_valid(), "Field was renamed by Romizer."); if (!field.is_valid()) { tty->print_cr("WARNING: invalid KNI field access: %s", name); } #endif // No exception check (OutOfMemoryError) done, field lookup will // fail and NULL be returned below anyway. if (!field.is_valid() || (field.is_static() != is_static) || // We do not support field IDs in super classes: (field.is_static() && !holder().equals(&ic))) { return (jfieldID)0; } else { return (jfieldID)((jint)field.offset()); } }
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(); }