1.1 --- a/src/share/vm/classfile/loaderConstraints.hpp Fri Aug 31 16:39:35 2012 -0700 1.2 +++ b/src/share/vm/classfile/loaderConstraints.hpp Sat Sep 01 13:25:18 2012 -0400 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -30,8 +30,9 @@ 1.11 #include "utilities/hashtable.hpp" 1.12 1.13 class LoaderConstraintEntry; 1.14 +class Symbol; 1.15 1.16 -class LoaderConstraintTable : public Hashtable<klassOop, mtClass> { 1.17 +class LoaderConstraintTable : public Hashtable<Klass*, mtClass> { 1.18 friend class VMStructs; 1.19 private: 1.20 1.21 @@ -48,45 +49,45 @@ 1.22 LoaderConstraintTable(int nof_buckets); 1.23 1.24 LoaderConstraintEntry* new_entry(unsigned int hash, Symbol* name, 1.25 - klassOop klass, int num_loaders, 1.26 + Klass* klass, int num_loaders, 1.27 int max_loaders); 1.28 void free_entry(LoaderConstraintEntry *entry); 1.29 1.30 LoaderConstraintEntry* bucket(int i) { 1.31 - return (LoaderConstraintEntry*)Hashtable<klassOop, mtClass>::bucket(i); 1.32 + return (LoaderConstraintEntry*)Hashtable<Klass*, mtClass>::bucket(i); 1.33 } 1.34 1.35 LoaderConstraintEntry** bucket_addr(int i) { 1.36 - return (LoaderConstraintEntry**)Hashtable<klassOop, mtClass>::bucket_addr(i); 1.37 + return (LoaderConstraintEntry**)Hashtable<Klass*, mtClass>::bucket_addr(i); 1.38 } 1.39 1.40 - // GC support 1.41 - void oops_do(OopClosure* f); 1.42 + // Enhanced Class Redefinition support 1.43 + void classes_do(KlassClosure* f); 1.44 1.45 // Check class loader constraints 1.46 - bool add_entry(Symbol* name, klassOop klass1, Handle loader1, 1.47 - klassOop klass2, Handle loader2); 1.48 + bool add_entry(Symbol* name, Klass* klass1, Handle loader1, 1.49 + Klass* klass2, Handle loader2); 1.50 1.51 // Note: The main entry point for this module is via SystemDictionary. 1.52 // SystemDictionary::check_signature_loaders(Symbol* signature, 1.53 // Handle loader1, Handle loader2, 1.54 // bool is_method, TRAPS) 1.55 1.56 - klassOop find_constrained_klass(Symbol* name, Handle loader); 1.57 + Klass* find_constrained_klass(Symbol* name, Handle loader); 1.58 1.59 // Class loader constraints 1.60 1.61 void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree); 1.62 void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader, 1.63 - klassOop klass); 1.64 + Klass* klass); 1.65 void merge_loader_constraints(LoaderConstraintEntry** pp1, 1.66 - LoaderConstraintEntry** pp2, klassOop klass); 1.67 + LoaderConstraintEntry** pp2, Klass* klass); 1.68 1.69 bool check_or_update(instanceKlassHandle k, Handle loader, 1.70 Symbol* name); 1.71 1.72 1.73 - void purge_loader_constraints(BoolObjectClosure* is_alive); 1.74 + void purge_loader_constraints(); 1.75 1.76 void verify(Dictionary* dictionary, PlaceholderTable* placeholders); 1.77 #ifndef PRODUCT 1.78 @@ -94,29 +95,32 @@ 1.79 #endif 1.80 }; 1.81 1.82 -class LoaderConstraintEntry : public HashtableEntry<klassOop, mtClass> { 1.83 +class LoaderConstraintEntry : public HashtableEntry<Klass*, mtClass> { 1.84 friend class VMStructs; 1.85 private: 1.86 Symbol* _name; // class name 1.87 int _num_loaders; 1.88 int _max_loaders; 1.89 - oop* _loaders; // initiating loaders 1.90 + // Loader constraints enforce correct linking behavior. 1.91 + // Thus, it really operates on ClassLoaderData which represents linking domain, 1.92 + // not class loaders. 1.93 + ClassLoaderData** _loaders; // initiating loaders 1.94 1.95 public: 1.96 1.97 - klassOop klass() { return literal(); } 1.98 - klassOop* klass_addr() { return literal_addr(); } 1.99 - void set_klass(klassOop k) { set_literal(k); } 1.100 + Klass* klass() { return literal(); } 1.101 + Klass** klass_addr() { return literal_addr(); } 1.102 + void set_klass(Klass* k) { set_literal(k); } 1.103 1.104 LoaderConstraintEntry* next() { 1.105 - return (LoaderConstraintEntry*)HashtableEntry<klassOop, mtClass>::next(); 1.106 + return (LoaderConstraintEntry*)HashtableEntry<Klass*, mtClass>::next(); 1.107 } 1.108 1.109 LoaderConstraintEntry** next_addr() { 1.110 - return (LoaderConstraintEntry**)HashtableEntry<klassOop, mtClass>::next_addr(); 1.111 + return (LoaderConstraintEntry**)HashtableEntry<Klass*, mtClass>::next_addr(); 1.112 } 1.113 void set_next(LoaderConstraintEntry* next) { 1.114 - HashtableEntry<klassOop, mtClass>::set_next(next); 1.115 + HashtableEntry<Klass*, mtClass>::set_next(next); 1.116 } 1.117 1.118 Symbol* name() { return _name; } 1.119 @@ -131,13 +135,13 @@ 1.120 int max_loaders() { return _max_loaders; } 1.121 void set_max_loaders(int i) { _max_loaders = i; } 1.122 1.123 - oop* loaders() { return _loaders; } 1.124 - void set_loaders(oop* loaders) { _loaders = loaders; } 1.125 + ClassLoaderData** loaders() { return _loaders; } 1.126 + void set_loaders(ClassLoaderData** loaders) { _loaders = loaders; } 1.127 1.128 - oop loader(int i) { return _loaders[i]; } 1.129 - oop* loader_addr(int i) { return &_loaders[i]; } 1.130 - void set_loader(int i, oop p) { _loaders[i] = p; } 1.131 - 1.132 + ClassLoaderData* loader_data(int i) { return _loaders[i]; } 1.133 + void set_loader_data(int i, ClassLoaderData* p) { _loaders[i] = p; } 1.134 + // convenience 1.135 + void set_loader(int i, oop p); 1.136 }; 1.137 1.138 #endif // SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP