Path: blob/master/runtime/gc_structs/ClassIterator.cpp
5985 views
1/*******************************************************************************2* Copyright (c) 1991, 2021 IBM Corp. and others3*4* This program and the accompanying materials are made available under5* the terms of the Eclipse Public License 2.0 which accompanies this6* distribution and is available at https://www.eclipse.org/legal/epl-2.0/7* or the Apache License, Version 2.0 which accompanies this distribution and8* is available at https://www.apache.org/licenses/LICENSE-2.0.9*10* This Source Code may also be made available under the following11* Secondary Licenses when the conditions for such availability set12* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU13* General Public License, version 2 with the GNU Classpath14* Exception [1] and GNU General Public License, version 2 with the15* OpenJDK Assembly Exception [2].16*17* [1] https://www.gnu.org/software/classpath/license.html18* [2] http://openjdk.java.net/legal/assembly-exception.html19*20* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception21*******************************************************************************/2223/**24* @file25* @ingroup GC_Structs26*/2728#include "j9.h"29#include "j9cfg.h"3031#include "ClassIterator.hpp"3233/**34* Offsets of the slots in J9Class that contain object references.35* NOTE: This can probably be simplified since we shouldn't be adding any more object36* references to the J9Class struct37*/38static const UDATA slotOffsets[] =39{40offsetof(J9Class, classObject),41042};4344/**45* @return the next slot in the class containing an object reference46* @return NULL if there are no more such slots47*/48volatile j9object_t *49GC_ClassIterator::nextSlot()50{51volatile j9object_t *slotPtr;5253switch(_state) {54case classiterator_state_start:55_state += 1;5657case classiterator_state_statics:58slotPtr = _classStaticsIterator.nextSlot();59if (NULL != slotPtr) {60return slotPtr;61}62_state += 1;6364case classiterator_state_constant_pool:65slotPtr = _constantPoolObjectSlotIterator.nextSlot();66if (NULL != slotPtr) {67return slotPtr;68}69_state += 1;7071case classiterator_state_slots:72while (slotOffsets[_scanIndex] != 0) {73/* shouldScanClassObject is true by default, in the case of balanced GC check if object is ClassObject */74if (_shouldScanClassObject || (slotOffsets[_scanIndex] != offsetof(J9Class, classObject))) {75return (j9object_t *)((U_8 *)_clazzPtr + (UDATA)slotOffsets[_scanIndex++]);76} else {77_scanIndex += 1;78}79}80_state += 1;8182case classiterator_state_callsites:83slotPtr = _callSitesIterator.nextSlot();84if (NULL != slotPtr) {85return slotPtr;86}87_state += 1;8889case classiterator_state_methodtypes:90slotPtr = _methodTypesIterator.nextSlot();91if (NULL != slotPtr) {92return slotPtr;93}94_state += 1;9596#if defined(J9VM_OPT_METHOD_HANDLE)97case classiterator_state_varhandlemethodtypes:98slotPtr = _varHandlesMethodTypesIterator.nextSlot();99if (NULL != slotPtr) {100return slotPtr;101}102_state += 1;103#endif /* defined(J9VM_OPT_METHOD_HANDLE) */104105case classiterator_state_valuetypes:106slotPtr = _valueTypesIterator.nextSlot();107if (NULL != slotPtr) {108return slotPtr;109}110_state += 1;111112default:113break;114}115116return NULL;117}118119120121