Path: blob/master/src/hotspot/share/classfile/loaderConstraints.hpp
40949 views
/*1* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef SHARE_CLASSFILE_LOADERCONSTRAINTS_HPP25#define SHARE_CLASSFILE_LOADERCONSTRAINTS_HPP2627#include "classfile/placeholders.hpp"28#include "utilities/hashtable.hpp"2930class ClassLoaderData;31class LoaderConstraintEntry;32class Symbol;3334class LoaderConstraintTable : public Hashtable<InstanceKlass*, mtClass> {3536private:37LoaderConstraintEntry** find_loader_constraint(Symbol* name,38Handle loader);3940public:4142LoaderConstraintTable(int table_size);4344LoaderConstraintEntry* new_entry(unsigned int hash, Symbol* name,45InstanceKlass* klass, int num_loaders,46int max_loaders);47void free_entry(LoaderConstraintEntry *entry);4849LoaderConstraintEntry* bucket(int i) const {50return (LoaderConstraintEntry*)Hashtable<InstanceKlass*, mtClass>::bucket(i);51}5253LoaderConstraintEntry** bucket_addr(int i) {54return (LoaderConstraintEntry**)Hashtable<InstanceKlass*, mtClass>::bucket_addr(i);55}5657// Check class loader constraints58bool add_entry(Symbol* name, InstanceKlass* klass1, Handle loader1,59InstanceKlass* klass2, Handle loader2);6061// Note: The main entry point for this module is via SystemDictionary.62// SystemDictionary::check_signature_loaders(Symbol* signature,63// Klass* klass_being_linked,64// Handle loader1, Handle loader2,65// bool is_method)6667InstanceKlass* find_constrained_klass(Symbol* name, Handle loader);6869// Class loader constraints7071void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree);72void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader,73InstanceKlass* klass);74void merge_loader_constraints(LoaderConstraintEntry** pp1,75LoaderConstraintEntry** pp2, InstanceKlass* klass);7677bool check_or_update(InstanceKlass* k, Handle loader, Symbol* name);7879void purge_loader_constraints();8081void verify(PlaceholderTable* placeholders);82void print() const;83void print_on(outputStream* st) const;84};8586class LoaderConstraintEntry : public HashtableEntry<InstanceKlass*, mtClass> {87private:88Symbol* _name; // class name89int _num_loaders;90int _max_loaders;91// Loader constraints enforce correct linking behavior.92// Thus, it really operates on ClassLoaderData which represents linking domain,93// not class loaders.94ClassLoaderData** _loaders; // initiating loaders9596public:9798InstanceKlass* klass() { return literal(); }99InstanceKlass** klass_addr() { return literal_addr(); }100void set_klass(InstanceKlass* k) { set_literal(k); }101102LoaderConstraintEntry* next() {103return (LoaderConstraintEntry*)HashtableEntry<InstanceKlass*, mtClass>::next();104}105106LoaderConstraintEntry** next_addr() {107return (LoaderConstraintEntry**)HashtableEntry<InstanceKlass*, mtClass>::next_addr();108}109void set_next(LoaderConstraintEntry* next) {110HashtableEntry<InstanceKlass*, mtClass>::set_next(next);111}112113Symbol* name() { return _name; }114void set_name(Symbol* name) {115_name = name;116if (name != NULL) name->increment_refcount();117}118119int num_loaders() { return _num_loaders; }120void set_num_loaders(int i) { _num_loaders = i; }121122int max_loaders() { return _max_loaders; }123void set_max_loaders(int i) { _max_loaders = i; }124125ClassLoaderData** loaders() { return _loaders; }126void set_loaders(ClassLoaderData** loaders) { _loaders = loaders; }127128ClassLoaderData* loader_data(int i) { return _loaders[i]; }129void set_loader_data(int i, ClassLoaderData* p) { _loaders[i] = p; }130// convenience131void set_loader(int i, oop p);132};133134#endif // SHARE_CLASSFILE_LOADERCONSTRAINTS_HPP135136137