Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -416,10 +416,12 @@ private static StringCollection GenerateLinesWithoutWordWrap(DisplayCells displa

for (int k = 0; k < lines.Length; k++)
{
if (lines[k] == null || displayCells.Length(lines[k]) <= firstLineLen)
string currentLine = lines[k];

if (currentLine == null || displayCells.Length(currentLine) <= firstLineLen)
{
// we do not need to split further, just add
retVal.Add(lines[k]);
retVal.Add(currentLine);
continue;
}

Expand All @@ -432,15 +434,15 @@ private static StringCollection GenerateLinesWithoutWordWrap(DisplayCells displa

int offset = 0; // offset into the line we are splitting

while (true)
while (offset < currentLine.Length)
{
// acquire the current active display line length (it can very from call to call)
int currentDisplayLen = accumulator.ActiveLen;

// determine if the current tail would fit or not

// for the remaining part of the string, determine its display cell count
int currentCellsToFit = displayCells.Length(lines[k], offset);
int currentCellsToFit = displayCells.Length(currentLine, offset);

// determine if we fit into the line
int excessCells = currentCellsToFit - currentDisplayLen;
Expand All @@ -449,7 +451,7 @@ private static StringCollection GenerateLinesWithoutWordWrap(DisplayCells displa
{
// we are not at the end of the string, select a sub string
// that would fit in the remaining display length
int charactersToAdd = displayCells.GetHeadSplitLength(lines[k], offset, currentDisplayLen);
int charactersToAdd = displayCells.GetHeadSplitLength(currentLine, offset, currentDisplayLen);

if (charactersToAdd <= 0)
{
Expand All @@ -463,7 +465,7 @@ private static StringCollection GenerateLinesWithoutWordWrap(DisplayCells displa
else
{
// of the given length, add it to the accumulator
accumulator.AddLine(lines[k].Substring(offset, charactersToAdd));
accumulator.AddLine(currentLine.Substring(offset, charactersToAdd));
}

// increase the offset by the # of characters added
Expand All @@ -472,7 +474,7 @@ private static StringCollection GenerateLinesWithoutWordWrap(DisplayCells displa
else
{
// we reached the last (partial) line, we add it all
accumulator.AddLine(lines[k].Substring(offset));
accumulator.AddLine(currentLine.Substring(offset));
break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,15 @@ internal DisplayCellsPSHost(PSHostRawUserInterface rawUserInterface)

internal override int Length(string str, int offset)
{
Dbg.Assert(offset >= 0, "offset >= 0");
Dbg.Assert(string.IsNullOrEmpty(str) || (offset < str.Length), "offset < str.Length");
if (string.IsNullOrEmpty(str))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iSazonov Why are changes to this method necessary to fix the issue? In particular do we need replace assert with exception in this internal method?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change is not direct fix for the issue. It is related the issue. It makes the code more reliable.
If we don't change the method we will have different behavior for debug and release code that might confuse.

{
return 0;
}

if (offset < 0 || offset >= str.Length)
{
throw PSTraceSource.NewArgumentException(nameof(offset));
}

try
{
Expand All @@ -100,7 +107,7 @@ internal override int Length(string str, int offset)
// we will fallback to the default value.
}

return string.IsNullOrEmpty(str) ? 0 : str.Length - offset;
return str.Length - offset;
}

internal override int Length(string str)
Expand Down