DfType (@NotNull DfaMemoryState state, @NotNull DfaValue arg) { LongRangeSet range = DfLongType.extractRange(state.getDfType(arg)); if (range.isEmpty()) return DfType.TOP; long min = range.min(); long max = range.max(); DfType length; if (min >= 0) { length = intRange(LongRangeSet.range(String.valueOf(min).length(), String.valueOf(max).length())); } else if (max <= 0) { length = intRange(LongRangeSet.range(String.valueOf(max).length(), String.valueOf(min).length())); } else { length = intRange(LongRangeSet.range(1, Math.max(String.valueOf(max).length(), String.valueOf(min).length()))); } return STRING_LENGTH.asDfType(length); }