// secondary entries hold invokedynamic call site bindings
 public ConstantPoolCacheEntry getSecondaryEntryAt(int i) {
   ConstantPoolCacheEntry e = new ConstantPoolCacheEntry(this, decodeSecondaryIndex(i));
   if (Assert.ASSERTS_ENABLED) {
     Assert.that(e.isSecondaryEntry(), "must be a secondary entry");
   }
   return e;
 }
 public void iterateFields(OopVisitor visitor, boolean doVMFields) {
   super.iterateFields(visitor, doVMFields);
   if (doVMFields) {
     visitor.doOop(constants, true);
     for (int i = 0; i < getLength(); i++) {
       ConstantPoolCacheEntry entry = getEntryAt(i);
       entry.iterateFields(visitor);
     }
   }
 }
 public ConstantPoolCacheEntry getMainEntryAt(int i) {
   if (isSecondaryIndex(i)) {
     // run through an extra level of indirection:
     i = getSecondaryEntryAt(i).getMainEntryIndex();
   }
   ConstantPoolCacheEntry e = new ConstantPoolCacheEntry(this, i);
   if (Assert.ASSERTS_ENABLED) {
     Assert.that(!e.isSecondaryEntry(), "must not be a secondary entry");
   }
   return e;
 }