src/share/vm/prims/jvmtiTagMap.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/prims/jvmtiTagMap.cpp	Fri Mar 18 14:59:03 2011
--- new/src/share/vm/prims/jvmtiTagMap.cpp	Fri Mar 18 14:59:03 2011

*** 1,7 **** --- 1,7 ---- /* ! * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright (c) 2003, 2011, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 25,34 **** --- 25,35 ---- #include "precompiled.hpp" #include "classfile/symbolTable.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" #include "jvmtifiles/jvmtiEnv.hpp" + #include "oops/instanceMirrorKlass.hpp" #include "oops/objArrayKlass.hpp" #include "oops/oop.inline2.hpp" #include "prims/jvmtiEventController.hpp" #include "prims/jvmtiEventController.inline.hpp" #include "prims/jvmtiExport.hpp"
*** 2592,2601 **** --- 2593,2607 ---- // many roots are Klasses so we use the java mirror if (o->is_klass()) { klassOop k = (klassOop)o; o = Klass::cast(k)->java_mirror(); + if (o == NULL) { + // Classes without mirrors don't correspond to real Java + // classes so just ignore them. + return; + } } else { // SystemDictionary::always_strong_oops_do reports the application // class loader as a root. We want this root to be reported as // a root kind of "OTHER" rather than "SYSTEM_CLASS".
*** 2832,2845 **** --- 2838,2851 ---- return true; } // verify that a static oop field is in range static inline bool verify_static_oop(instanceKlass* ik, ! klassOop k, int offset) { ! address obj_p = (address)k + offset; ! address start = (address)ik->start_of_static_fields(); ! address end = start + (ik->static_oop_field_size() * heapOopSize); ! oop mirror, int offset) { ! address obj_p = (address)mirror + offset; ! address start = (address)instanceMirrorKlass::start_of_static_fields(mirror); ! address end = start + (java_lang_Class::static_oop_field_count(mirror) * heapOopSize); assert(end >= start, "sanity check"); if (obj_p >= start && obj_p < end) { return true; } else {
*** 2936,2947 **** --- 2942,2953 ---- ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k); for (i=0; i<field_map->field_count(); i++) { ClassFieldDescriptor* field = field_map->field_at(i); char type = field->field_type(); if (!is_primitive_field_type(type)) { ! oop fld_o = k->obj_field(field->field_offset()); ! assert(verify_static_oop(ik, k, field->field_offset()), "sanity check"); ! oop fld_o = mirror->obj_field(field->field_offset()); ! assert(verify_static_oop(ik, mirror, field->field_offset()), "sanity check"); if (fld_o != NULL) { int slot = field->field_index(); if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) { delete field_map; return false;

src/share/vm/prims/jvmtiTagMap.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File