compromise between code safety and speed
This commit is contained in:
+2
-6
@@ -1198,17 +1198,13 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II
|
|||||||
|
|
||||||
if (this.buffer.scrollTop === 0) {
|
if (this.buffer.scrollTop === 0) {
|
||||||
// Determine whether the buffer is going to be trimmed after insertion.
|
// Determine whether the buffer is going to be trimmed after insertion.
|
||||||
const willBufferBeTrimmed = this.buffer.lines.pushWouldTrim();
|
const willBufferBeTrimmed = this.buffer.lines.isFull();
|
||||||
|
|
||||||
// Insert the line using the fastest method
|
// Insert the line using the fastest method
|
||||||
if (bottomRow === this.buffer.lines.length - 1) {
|
if (bottomRow === this.buffer.lines.length - 1) {
|
||||||
if (useRecycling) {
|
if (useRecycling) {
|
||||||
if (willBufferBeTrimmed) {
|
if (willBufferBeTrimmed) {
|
||||||
// push would trim the oldest line in the ringbuffer
|
this.buffer.lines.recycle().copyFrom(newLine);
|
||||||
// therefore we can recycle it here as the new line
|
|
||||||
const recycled = this.buffer.lines.get(0);
|
|
||||||
recycled.copyFrom(newLine);
|
|
||||||
this.buffer.lines.push(recycled);
|
|
||||||
} else {
|
} else {
|
||||||
this.buffer.lines.push(newLine.clone());
|
this.buffer.lines.push(newLine.clone());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,10 +98,24 @@ export class CircularList<T> extends EventEmitter implements ICircularList<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether a push would trim.
|
* Advance ringbuffer index and return current element for recycling.
|
||||||
* True when the ringbuffer is full.
|
* Note: If the ringbuffer is not full this method will return undefined,
|
||||||
|
* Either precheck with isFull() or handle the undefined return value accordingly.
|
||||||
*/
|
*/
|
||||||
public pushWouldTrim(): boolean {
|
public recycle(): T | undefined {
|
||||||
|
if (this._length === this._maxLength) {
|
||||||
|
this._startIndex = ++this._startIndex % this._maxLength;
|
||||||
|
this.emit('trim', 1);
|
||||||
|
} else {
|
||||||
|
this._length++;
|
||||||
|
}
|
||||||
|
return this._array[this._getCyclicIndex(this._length - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ringbuffer is at max length.
|
||||||
|
*/
|
||||||
|
public isFull(): boolean {
|
||||||
return this._length === this._maxLength;
|
return this._length === this._maxLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -28,7 +28,8 @@ export interface ICircularList<T> extends IEventEmitter {
|
|||||||
get(index: number): T | undefined;
|
get(index: number): T | undefined;
|
||||||
set(index: number, value: T): void;
|
set(index: number, value: T): void;
|
||||||
push(value: T): void;
|
push(value: T): void;
|
||||||
pushWouldTrim(): boolean;
|
recycle(): T | undefined;
|
||||||
|
isFull(): boolean;
|
||||||
pop(): T | undefined;
|
pop(): T | undefined;
|
||||||
splice(start: number, deleteCount: number, ...items: T[]): void;
|
splice(start: number, deleteCount: number, ...items: T[]): void;
|
||||||
trimStart(count: number): void;
|
trimStart(count: number): void;
|
||||||
|
|||||||
Reference in New Issue
Block a user