diff -r 6061df52d610 -r 53ccc37bda19 hotspot/src/share/vm/oops/klassVtable.cpp --- a/hotspot/src/share/vm/oops/klassVtable.cpp Wed Mar 15 11:44:46 2017 +0100 +++ b/hotspot/src/share/vm/oops/klassVtable.cpp Wed Mar 15 10:25:37 2017 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ #include "utilities/copy.hpp" inline InstanceKlass* klassVtable::ik() const { - return InstanceKlass::cast(_klass()); + return InstanceKlass::cast(_klass); } bool klassVtable::is_preinitialized_vtable() { @@ -128,8 +128,8 @@ // Copy super class's vtable to the first part (prefix) of this class's vtable, // and return the number of entries copied. Expects that 'super' is the Java // super class (arrays can have "array" super classes that must be skipped). -int klassVtable::initialize_from_super(KlassHandle super) { - if (super.is_null()) { +int klassVtable::initialize_from_super(Klass* super) { + if (super == NULL) { return 0; } else if (is_preinitialized_vtable()) { // A shared class' vtable is preinitialized at dump time. No need to copy @@ -160,18 +160,18 @@ void klassVtable::initialize_vtable(bool checkconstraints, TRAPS) { // Note: Arrays can have intermediate array supers. Use java_super to skip them. - KlassHandle super (THREAD, klass()->java_super()); + Klass* super = _klass->java_super(); int nofNewEntries = 0; bool is_shared = _klass->is_shared(); - if (!klass()->is_array_klass()) { + if (!_klass->is_array_klass()) { ResourceMark rm(THREAD); log_develop_debug(vtables)("Initializing: %s", _klass->name()->as_C_string()); } #ifdef ASSERT - oop* end_of_obj = (oop*)_klass() + _klass()->size(); + oop* end_of_obj = (oop*)_klass + _klass->size(); oop* end_of_vtable = (oop*)&table()[_length]; assert(end_of_vtable <= end_of_obj, "vtable extends beyond end"); #endif @@ -184,7 +184,7 @@ } int super_vtable_len = initialize_from_super(super); - if (klass()->is_array_klass()) { + if (_klass->is_array_klass()) { assert(super_vtable_len == _length, "arrays shouldn't introduce new methods"); } else { assert(_klass->is_instance_klass(), "must be InstanceKlass"); @@ -327,7 +327,7 @@ } static void log_vtables(int i, bool overrides, methodHandle target_method, - KlassHandle target_klass, Method* super_method, + Klass* target_klass, Method* super_method, Thread* thread) { #ifndef PRODUCT if (log_develop_is_enabled(Trace, vtables)) { @@ -432,7 +432,7 @@ Symbol* name = target_method()->name(); Symbol* signature = target_method()->signature(); - KlassHandle target_klass(THREAD, target_method()->method_holder()); + Klass* target_klass = target_method()->method_holder(); if (target_klass == NULL) { target_klass = _klass; } @@ -955,7 +955,7 @@ if (!(*trace_name_printed)) { log_info(redefine, class, update) ("adjust: klassname=%s for methods from name=%s", - klass()->external_name(), old_method->method_holder()->external_name()); + _klass->external_name(), old_method->method_holder()->external_name()); *trace_name_printed = true; } log_debug(redefine, class, update, vtables) @@ -1025,17 +1025,17 @@ } } -klassItable::klassItable(instanceKlassHandle klass) { +klassItable::klassItable(InstanceKlass* klass) { _klass = klass; if (klass->itable_length() > 0) { itableOffsetEntry* offset_entry = (itableOffsetEntry*)klass->start_of_itable(); if (offset_entry != NULL && offset_entry->interface_klass() != NULL) { // Check that itable is initialized // First offset entry points to the first method_entry - intptr_t* method_entry = (intptr_t *)(((address)klass()) + offset_entry->offset()); + intptr_t* method_entry = (intptr_t *)(((address)klass) + offset_entry->offset()); intptr_t* end = klass->end_of_itable(); - _table_offset = (intptr_t*)offset_entry - (intptr_t*)klass(); + _table_offset = (intptr_t*)offset_entry - (intptr_t*)klass; _size_offset_table = (method_entry - ((intptr_t*)offset_entry)) / itableOffsetEntry::size(); _size_method_table = (end - method_entry) / itableMethodEntry::size(); assert(_table_offset >= 0 && _size_offset_table >= 0 && _size_method_table >= 0, "wrong computation"); @@ -1056,7 +1056,7 @@ if (_klass->is_interface()) { // This needs to go after vtable indices are assigned but // before implementors need to know the number of itable indices. - assign_itable_indices_for_interface(_klass()); + assign_itable_indices_for_interface(_klass); } // Cannot be setup doing bootstrapping, interfaces don't have @@ -1078,9 +1078,9 @@ for(i = 0; i < num_interfaces; i++) { itableOffsetEntry* ioe = offset_entry(i); HandleMark hm(THREAD); - KlassHandle interf_h (THREAD, ioe->interface_klass()); - assert(interf_h() != NULL && ioe->offset() != 0, "bad offset entry in itable"); - initialize_itable_for_interface(ioe->offset(), interf_h, checkconstraints, CHECK); + Klass* interf = ioe->interface_klass(); + assert(interf != NULL && ioe->offset() != 0, "bad offset entry in itable"); + initialize_itable_for_interface(ioe->offset(), interf, checkconstraints, CHECK); } } @@ -1169,14 +1169,14 @@ } -void klassItable::initialize_itable_for_interface(int method_table_offset, KlassHandle interf_h, bool checkconstraints, TRAPS) { - Array* methods = InstanceKlass::cast(interf_h())->methods(); +void klassItable::initialize_itable_for_interface(int method_table_offset, Klass* interf, bool checkconstraints, TRAPS) { + Array* methods = InstanceKlass::cast(interf)->methods(); int nof_methods = methods->length(); HandleMark hm; assert(nof_methods > 0, "at least one method must exist for interface to be in vtable"); - Handle interface_loader (THREAD, InstanceKlass::cast(interf_h())->class_loader()); + Handle interface_loader (THREAD, InstanceKlass::cast(interf)->class_loader()); - int ime_count = method_count_for_interface(interf_h()); + int ime_count = method_count_for_interface(interf); for (int i = 0; i < nof_methods; i++) { Method* m = methods->at(i); methodHandle target; @@ -1189,7 +1189,7 @@ // Entry does not resolve. Leave it empty for AbstractMethodError. if (!(target == NULL) && !target->is_public()) { // Stuff an IllegalAccessError throwing method in there instead. - itableOffsetEntry::method_entry(_klass(), method_table_offset)[m->itable_index()]. + itableOffsetEntry::method_entry(_klass, method_table_offset)[m->itable_index()]. initialize(Universe::throw_illegal_access_error()); } } else { @@ -1215,7 +1215,7 @@ const char* loader1 = SystemDictionary::loader_name(method_holder_loader()); char* current = _klass->name()->as_C_string(); const char* loader2 = SystemDictionary::loader_name(interface_loader()); - char* iface = InstanceKlass::cast(interf_h())->name()->as_C_string(); + char* iface = InstanceKlass::cast(interf)->name()->as_C_string(); char* failed_type_name = failed_type_symbol->as_C_string(); size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) + strlen(current) + strlen(loader2) + strlen(iface) + @@ -1231,14 +1231,14 @@ // ime may have moved during GC so recalculate address int ime_num = m->itable_index(); assert(ime_num < ime_count, "oob"); - itableOffsetEntry::method_entry(_klass(), method_table_offset)[ime_num].initialize(target()); + itableOffsetEntry::method_entry(_klass, method_table_offset)[ime_num].initialize(target()); if (log_develop_is_enabled(Trace, itables)) { ResourceMark rm(THREAD); if (target() != NULL) { outputStream* logst = Log(itables)::trace_stream(); char* sig = target()->name_and_sig_as_C_string(); logst->print("interface: %s, ime_num: %d, target: %s, method_holder: %s ", - interf_h()->internal_name(), ime_num, sig, + interf->internal_name(), ime_num, sig, target()->method_holder()->internal_name()); logst->print("target_method flags: "); target()->print_linkage_flags(logst); @@ -1408,7 +1408,7 @@ // Fill out offset table and interface klasses into the itable space -void klassItable::setup_itable_offset_table(instanceKlassHandle klass) { +void klassItable::setup_itable_offset_table(InstanceKlass* klass) { if (klass->itable_length() == 0) return; assert(!klass->is_interface(), "Should have zero length itable"); @@ -1433,7 +1433,7 @@ assert((oop*)(end) == (oop*)(ime + nof_methods), "wrong offset calculation (2)"); // Visit all interfaces and initialize itable offset table - SetupItableClosure sic((address)klass(), ioe, ime); + SetupItableClosure sic((address)klass, ioe, ime); visit_all_interfaces(klass->transitive_interfaces(), &sic); #ifdef ASSERT @@ -1476,7 +1476,7 @@ if (!forced && _verify_count == Universe::verify_count()) return; _verify_count = Universe::verify_count(); #endif - oop* end_of_obj = (oop*)_klass() + _klass()->size(); + oop* end_of_obj = (oop*)_klass + _klass->size(); oop* end_of_vtable = (oop *)&table()[_length]; if (end_of_vtable > end_of_obj) { fatal("klass %s: klass object too short (vtable extends beyond end)", @@ -1516,8 +1516,7 @@ void vtableEntry::verify(klassVtable* vt, outputStream* st) { NOT_PRODUCT(FlagSetting fs(IgnoreLockingAssertions, true)); - KlassHandle vtklass_h = vt->klass(); - Klass* vtklass = vtklass_h(); + Klass* vtklass = vt->klass(); if (vtklass->is_instance_klass() && (InstanceKlass::cast(vtklass)->major_version() >= klassVtable::VTABLE_TRANSITIVE_OVERRIDE_VERSION)) { assert(method() != NULL, "must have set method"); @@ -1525,7 +1524,7 @@ if (method() != NULL) { method()->verify(); // we sub_type, because it could be a miranda method - if (!vtklass_h->is_subtype_of(method()->method_holder())) { + if (!vtklass->is_subtype_of(method()->method_holder())) { #ifndef PRODUCT print(); #endif