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