Path: blob/master/runtime/gc_structs/ConstantPoolObjectSlotIterator.cpp
5985 views
1/*******************************************************************************2* Copyright (c) 1991, 2019 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"30#include "j9cp.h"31#include "ModronAssertions.h"3233#include "ConstantPoolObjectSlotIterator.hpp"343536/**37* @return the next object slot in the constant pool38* @return NULL if there are no more object references39*/40j9object_t *41GC_ConstantPoolObjectSlotIterator::nextSlot() {42U_32 slotType;43j9object_t *slotPtr;44j9object_t *result = NULL;4546while (_cpEntryCount) {47if (0 == _cpDescriptionIndex) {48_cpDescription = *_cpDescriptionSlots;49_cpDescriptionSlots += 1;50_cpDescriptionIndex = J9_CP_DESCRIPTIONS_PER_U32;51}5253slotType = _cpDescription & J9_CP_DESCRIPTION_MASK;54slotPtr = _cpEntry;5556/* Determine if the slot should be processed */57switch (slotType) {58case J9CPTYPE_STRING: /* fall through */59case J9CPTYPE_ANNOTATION_UTF8:60result = &(((J9RAMStringRef *) slotPtr)->stringObject);61break;62case J9CPTYPE_METHOD_TYPE:63result = &(((J9RAMMethodTypeRef *) slotPtr)->type);64break;65case J9CPTYPE_METHODHANDLE:66result = &(((J9RAMMethodHandleRef *) slotPtr)->methodHandle);67break;68case J9CPTYPE_CONSTANT_DYNAMIC:69if (NULL != (result = _constantDynamicSlotIterator.nextSlot(slotPtr))) {70/* Do not progress through the function.71* Avoids advancing the slot while a constant dynamic is being iterated */72return result;73}74break;75default:76break;77}7879/* Adjust the CP slot and description information */80_cpEntry = (j9object_t *) (((U_8 *) _cpEntry)81+ sizeof(J9RAMConstantPoolItem));82_cpEntryCount -= 1;8384_cpDescription >>= J9_CP_BITS_PER_DESCRIPTION;85_cpDescriptionIndex -= 1;8687if (NULL != result) {88break;89}9091}92return result;93}94959697