private void updateNextResultIfNeeded() {
		DataIterator it = null;
		while (currentDataResult == null && (it = currentIt()) != null) {
			dataCandidateCount++;

			Data data = it.next();
			DataType dt = data.getBaseDataType();

			if (StringDataInstance.isString(data)) {
				currentDataResult = data;
				return;
			}
			else if (dt instanceof Array arrayDT) {
				// Will only get here for arrays of stuff that aren't char/wchar/int, which will
				// be handled earlier by isString(data)
				DataType elementDT = arrayDT.getDataType();
				if (containsStringDataType(elementDT)) {
					itStack.addLast(new DataComponentIterator(data));
				}
				// side-effect: don't iterate arrays that have elements that aren't strings
			}
			else if (dt instanceof Composite comp && containsStringDataType(comp)) {
				itStack.addLast(comp instanceof Structure
						? new StructDtcIterator(data, comp)
						: new DataComponentIterator(data));
			}
		}
	}
LIFO stack of iterators.  Newly found iterators of sub-components are
pushed onto the end and become the current iterator.  When an iterator is exhausted, 
it is popped of the end and the uncovered iterator is now the current.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefinedStringIterator.java