String s = iter == null ? null : iter.next();
String s = ( iter == null  || !iter.hasNext() )? null : iter.next();
	public void initEntryFact(TypeFrame result) {		// Make the frame valid		result.setValid();		int slot = 0;		// Clear the stack slots in the frame		result.clearStack();		// Add local for "this" pointer, if present		if (!methodGen.isStatic())			result.setValue(slot++, ObjectTypeFactory.getInstance(methodGen.getClassName()));		// [Added: Support for Generics]		// Get a parser that reads the generic signature of the method and		// can be used to get the correct GenericObjectType if an argument		// has a class type		Iterator<String> iter = 			GenericSignatureParser.getGenericSignatureIterator(methodGen.getMethod());				// Add locals for parameters.		// Note that long and double parameters need to be handled		// specially because they occupy two locals.		Type[] argumentTypes = methodGen.getArgumentTypes();				for (Type argType : argumentTypes) {			// Add special "extra" type for long or double params.			// These occupy the slot before the "plain" type.			if (argType.getType() == Constants.T_LONG) {				result.setValue(slot++, TypeFrame.getLongExtraType());			} else if (argType.getType() == Constants.T_DOUBLE) {				result.setValue(slot++, TypeFrame.getDoubleExtraType());			}						// [Added: Support for Generics]			String s = iter == null ? null : iter.next();			if (	s != null && 					(argType instanceof ObjectType || argType instanceof ArrayType) &&					!(argType instanceof ExceptionObjectType) 				) {				// replace with a generic version of the type				try { 					argType = GenericUtilities.getType(s);				} catch (RuntimeException e) {} // degrade gracefully			}			// Add the plain parameter type.			result.setValue(slot++, argType);		}		// Set remaining locals to BOTTOM; this will cause any		// uses of them to be flagged		while (slot < methodGen.getMaxLocals())			result.setValue(slot++, TypeFrame.getBottomType());	}