Potential memory leak or dead recursive during auto completion
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 25/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- typescript
- Lĩnh vực
- compilers
Hướng nghiên cứu
Bắt đầu với bản tái hiện TypeScript Playground được liên kết và kiểu đệ quy PipelineBuilderState đã cung cấp, sau đó kích hoạt tính năng tự động hoàn thành trong khi theo dõi bộ nhớ và khả năng phản hồi. So sánh hành vi khi các thành viên post_delay trùng lặp được loại bỏ và xác định xem compiler có đi vào quá trình xử lý không bị giới hạn hay không. Được xem là hoàn tất khi bản tái hiện không còn rò rỉ bộ nhớ hoặc trở nên không phản hồi trong lúc tự động hoàn thành, đồng thời hành vi liên quan được kiểm thử bằng một regression test.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
🔎 Search Terms
memory leak auto completion
🕗 Version & Regression Information
seems occur since first version that could compile those code.
Please forgive me for providing such a huge source code, as its complexity has to be kept to cause noticeable memory consumption rate (about 30MB/s, at least).
⏯ Playground Link
💻 Code
type RecoType =
| 'DirectHit'
| 'TemplateMatch'
| 'FeatureMatch'
| 'ColorMatch'
| 'OCR'
| 'NeuralNetworkClassify'
| 'NeuralNetworkDetect'
| 'Custom'
type ActType =
| 'DoNothing'
| 'Click'
| 'Swipe'
| 'Key'
| 'Text'
| 'StartApp'
| 'StopApp'
| 'StopTask'
| 'Custom'
type OrderByMap = {
TemplateMatch: 'Horizontal' | 'Vertical' | 'Score' | 'Random'
FeatureMatch: 'Horizontal' | 'Vertical' | 'Score' | 'Area' | 'Random'
ColorMatch: 'Horizontal' | 'Vertical' | 'Score' | 'Area' | 'Random'
OCR: 'Horizontal' | 'Vertical' | 'Area' | 'Length' | 'Random'
NeuralNetworkClassify: 'Horizontal' | 'Vertical' | 'Score' | 'Random'
NeuralNetworkDetect: 'Horizontal' | 'Vertical' | 'Score' | 'Area' | 'Random'
}
type PipelineBuilderState<Json = {}> = {
done: Json
} & ('recognition' extends keyof Json
? {}
: {
recognition<R extends RecoType>(
reco: R
): PipelineRecognitionBuilderState<
Json & {
recognition: R
},
R
>
}) &
('action' extends keyof Json
? {}
: {
action<A extends ActType>(
act: A
): PipelineActionBuilderState<
Json & {
action: A
},
A
>
}) &
('next' extends keyof Json
? {}
: {
next<N extends string[]>(...nxt: [...N]): PipelineBuilderState<Json & { next: N }>
}) &
('interrupt' extends keyof Json
? {}
: {
interrupt<I extends string[]>(
...int: [...I]
): PipelineBuilderState<Json & { interrupt: I }>
}) &
('rate_limit' extends keyof Json
? {}
: {
rate_limit<R extends number>(rate: R): PipelineBuilderState<Json & { rate_limit: R }>
}) &
('timeout' extends keyof Json
? {}
: {
timeout<R extends number>(time: R): PipelineBuilderState<Json & { timeout: R }>
}) &
('on_error' extends keyof Json
? {}
: {
on_error<O extends string[]>(
...err: [...O]
): PipelineBuilderState<Json & { on_error: O }>
}) &
('inverse' extends keyof Json
? {}
: {
inverse<I extends boolean>(inv: I): PipelineBuilderState<Json & { inverse: I }>
}) &
('enabled' extends keyof Json
? {}
: {
enabled<E extends boolean>(en: E): PipelineBuilderState<Json & { enabled: E }>
}) &
('pre_delay' extends keyof Json
? {}
: {
pre_delay<P extends number>(pre: P): PipelineBuilderState<Json & { pre_delay: P }>
}) &
('post_delay' extends keyof Json // <--- here two post_delay are provided, which is the root cause
? {}
: {
post_delay<P extends number>(post: P): PipelineBuilderState<Json & { post_delay: P }>
}) &
('post_delay' extends keyof Json // <---
? {}
: {
post_delay<P extends number>(post: P): PipelineBuilderState<Json & { post_delay: P }>
}) &
('pre_wait_freezes' extends keyof Json
? {}
: {
pre_wait_freezes: PipelineWaitFreezeBuilderState<Json, 'pre_wait_freezes'>
}) &
('focus' extends keyof Json
? {}
: {
focus<F extends boolean>(focus: F): PipelineBuilderState<Json & { focus: F }>
})
type PipelineRecognitionBuilderState<PBJson, Reco extends RecoType, Json = {}> = {
done: PipelineBuilderState<PBJson & Json>
} & (Reco extends 'DirectHit'
? {}
: ('roi' extends keyof Json
? {}
: {
roi<R extends [string] | [number, number, number, number]>(
...roi: R
): PipelineRecognitionBuilderState<
PBJson,
Reco,
Json & { roi: R extends [number, number, number, number] ? R : R[0] }
>
}) &
('roi_offset' extends keyof Json
? {}
: {
roi_offset<R extends [number, number, number, number]>(
...roi: R
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { roi_offset: R }>
})) &
(Reco extends 'TemplateMatch' | 'FeatureMatch'
? 'template' extends keyof Json
? {}
: {
template<T extends string[]>(
...templ: [...T]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { template: T }>
}
: {}) &
(Reco extends 'TemplateMatch' | 'NeuralNetworkDetect'
? 'threshold' extends keyof Json
? {}
: {
threshold<T extends number[]>(
...thres: [...T]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { threshold: T }>
threshold$<T extends number>(
thres: T
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { threshold: T }>
}
: {}) &
(Reco extends keyof OrderByMap
? 'order_by' extends keyof Json
? {}
: {
order_by<O extends OrderByMap[Reco]>(
order: O
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { order_by: O }>
}
: {}) &
(Reco extends keyof OrderByMap
? 'index' extends keyof Json
? {}
: {
index<T extends number>(
idx: T
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { index: T }>
}
: {}) &
(Reco extends 'TemplateMatch'
? 'method' extends keyof Json
? {}
: {
method<M extends 1 | 3 | 5>(
method: M
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { method: M }>
}
: {}) &
(Reco extends 'ColorMatch'
? 'method' extends keyof Json
? {}
: {
method<M extends 4 | 40 | 6>(
method: M
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { method: M }>
}
: {}) &
(Reco extends 'TemplateMatch' | 'FeatureMatch'
? 'green_mask' extends keyof Json
? {}
: {
green_mask<G extends boolean>(
mask: G
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { green_mask: G }>
}
: {}) &
(Reco extends 'FeatureMatch' | 'ColorMatch'
? 'count' extends keyof Json
? {}
: {
count<C extends number>(
count: C
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { count: C }>
}
: {}) &
(Reco extends 'FeatureMatch'
? 'detector' extends keyof Json
? {}
: {
detector<D extends 'SIFT' | 'KAZE' | 'AKAZE' | 'BRISK' | 'ORB'>(
det: D
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { detector: D }>
}
: {}) &
(Reco extends 'FeatureMatch'
? 'ratio' extends keyof Json
? {}
: {
ratio<R extends number>(
ratio: R
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { ratio: R }>
}
: {}) &
(Reco extends 'ColorMatch'
? 'method' extends keyof Json
? ('lower' extends keyof Json
? {}
: Json['method'] extends 4 | 40
? {
lower<L extends [number, number, number][]>(
...lower: [...L]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { lower: L }>
}
: {
lower<L extends [number][]>(
...lower: [...L]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { lower: L }>
}) &
('upper' extends keyof Json
? {}
: Json['method'] extends 4 | 40
? {
upper<L extends [number, number, number][]>(
...upper: [...L]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { upper: L }>
}
: {
upper<U extends [number][]>(
...upper: [...U]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { upper: U }>
})
: {}
: {}) &
(Reco extends 'ColorMatch'
? 'connected' extends keyof Json
? {}
: {
connected<C extends boolean>(
conn: C
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { connected: C }>
}
: {}) &
(Reco extends 'OCR'
? 'expected' extends keyof Json
? {}
: {
expected<E extends string[]>(
...exp: [...E]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { expected: E }>
}
: {}) &
(Reco extends 'NeuralNetworkClassify' | 'NeuralNetworkDetect'
? 'expected' extends keyof Json
? {}
: {
expected<E extends number[]>(
...exp: [...E]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { expected: E }>
}
: {}) &
(Reco extends 'OCR'
? 'replace' extends keyof Json
? {}
: {
replace<R extends [string, string][]>(
...exp: [...R]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { replace: R }>
}
: {}) &
(Reco extends 'OCR'
? 'only_rec' extends keyof Json
? {}
: {
only_rec<O extends boolean>(
rec: O
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { only_rec: O }>
}
: {}) &
(Reco extends 'OCR' | 'NeuralNetworkClassify' | 'NeuralNetworkDetect'
? 'model' extends keyof Json
? {}
: {
model<M extends string>(
model: M
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { model: M }>
}
: {}) &
(Reco extends 'NeuralNetworkClassify' | 'NeuralNetworkDetect'
? 'labels' extends keyof Json
? {}
: {
labels<L extends string[]>(
...label: [...L]
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { labels: L }>
}
: {}) &
(Reco extends 'Custom'
? 'custom_recognition' extends keyof Json
? {}
: {
custom_recognition<C extends string>(
reco: C
): PipelineRecognitionBuilderState<PBJson, Reco, Json & { custom_recognition: C }>
}
: {}) &
(Reco extends 'Custom'
? 'custom_recognition_param' extends keyof Json
? {}
: {
custom_recognition_param<C extends Record<string, unknown>>(
param: C
): PipelineRecognitionBuilderState<
PBJson,
Reco,
Json & { custom_recognition_param: C }
>
}
: {})
type PipelineActionBuilderState<PBJson, Act extends ActType, Json = {}> = {
done: PipelineBuilderState<PBJson & Json>
} & (Act extends 'Click' | 'Custom'
? 'target' extends keyof Json
? {}
: {
target<T extends [true] | [string] | [number, number, number, number]>(
...target: T
): PipelineActionBuilderState<
PBJson,
Act,
Json & { target: T extends [number, number, number, number] ? T : T[0] }
>
}
: {}) &
(Act extends 'Click' | 'Custom'
? 'target_offset' extends keyof Json
? {}
: {
target_offset<O extends [number, number, number, number]>(
...offset: O
): PipelineActionBuilderState<PBJson, Act, Json & { target_offset: O }>
}
: {}) &
(Act extends 'Swipe'
? 'begin' extends keyof Json
? {}
: {
begin<B extends [true] | [string] | [number, number, number, number]>(
...begin: B
): PipelineActionBuilderState<
PBJson,
Act,
Json & { begin: B extends [number, number, number, number] ? B : B[0] }
>
}
: {}) &
(Act extends 'Swipe'
? 'begin_offset' extends keyof Json
? {}
: {
begin_offset<B extends [number, number, number, number]>(
...offset: B
): PipelineActionBuilderState<PBJson, Act, Json & { begin_offset: B }>
}
: {}) &
(Act extends 'Swipe'
? 'end' extends keyof Json
? {}
: {
end<E extends [true] | [string] | [number, number, number, number]>(
...end: E
): PipelineActionBuilderState<
PBJson,
Act,
Json & { end: E extends [number, number, number, number] ? E : E[0] }
>
}
: {}) &
(Act extends 'Swipe'
? 'end_offset' extends keyof Json
? {}
: {
end_offset<E extends [number, number, number, number]>(
...offset: E
): PipelineActionBuilderState<PBJson, Act, Json & { end_offset: E }>
}
: {}) &
(Act extends 'Key'
? 'key' extends keyof Json
? {}
: {
key<K extends number[]>(
...key: [...K]
): PipelineActionBuilderState<PBJson, Act, Json & { key: K }>
}
: {}) &
(Act extends 'InputText'
? 'input_text' extends keyof Json
? {}
: {
input_text<T extends string>(
text: T
): PipelineActionBuilderState<PBJson, Act, Json & { input_text: T }>
}
: {}) &
(Act extends 'StartApp' | 'StopApp'
? 'package' extends keyof Json
? {}
: {
package<P extends string>(
pkg: P
): PipelineActionBuilderState<PBJson, Act, Json & { package: P }>
}
: {}) &
(Act extends 'Custom'
? 'custom_action' extends keyof Json
? {}
: {
custom_action<C extends string>(
act: C
): PipelineActionBuilderState<PBJson, Act, Json & { custom_action: C }>
}
: {}) &
(Act extends 'Custom'
? 'custom_action_param' extends keyof Json
? {}
: {
custom_action_param<C extends Record<string, unknown>>(
param: C
): PipelineActionBuilderState<PBJson, Act, Json & { custom_action_param: C }>
}
: {})
type PipelineWaitFreezeBuilderState<
PBJson,
Key extends 'pre_wait_freezes' | 'post_wait_freezes',
Json = {}
> = {
done: PipelineBuilderState<
PBJson & {
[key in Key]: Json
}
>
} & ('time' extends keyof Json
? {}
: {
time<T extends number>(
time: T
): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { time: T }>
}) &
('target' extends keyof Json
? {}
: {
target<T extends [true] | [string] | [number, number, number, number]>(
...target: T
): PipelineWaitFreezeBuilderState<
PBJson,
Key,
Json & { target: T extends [number, number, number, number] ? T : T[0] }
>
}) &
('target_offset' extends keyof Json
? {}
: {
target_offset<O extends [number, number, number, number]>(
...offset: O
): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { target_offset: O }>
}) &
('threshold' extends keyof Json
? {}
: {
threshold<T extends number>(
thres: T
): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { threshold: T }>
}) &
('method' extends keyof Json
? {}
: {
method<M extends 1 | 3 | 5>(
met: M
): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { method: M }>
}) &
('rate_limit' extends keyof Json
? {}
: {
rate_limit<R extends number>(
rate: R
): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { rate_limit: R }>
})
const v = ({} as PipelineBuilderState).action('Click').done.
🙁 Actual behavior
When requesting auto completion in the last row (via dot), the heap raise quickly.
I've checked out that it is caused by the miss duplication of post_delay property state changing edge.
🙂 Expected behavior
The completion should either fail or succeed quickly. The duplicate edge shouldn't affect completing.
Additional information about the issue
No response
- Ngôn ngữ chính
- Go
- Star
- 111k
- Fork
- 14.4k
- Merge trung bình
- 1 ngày 15 giờ
- Pull request đã merge (30 ngày)
- 106
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của microsoft/TypeScript
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
microsoft/TypeScript#64322 · 2 bình luận · 1 reaction · 2 người được giao ·
-
Possible Improvement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
microsoft/TypeScript#64278 · 1 bình luận · 1 reaction ·
-
Docs
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
microsoft/TypeScript#64118 · 1 bình luận ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
microsoft/TypeScript#64094 ·
-
Docs
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
microsoft/TypeScript#63959 · 5 bình luận ·
Tất cả issue của microsoft/TypeScript
Issue tương tự
-
Type/Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
OpenNSW/nsw-srilanka#497 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
milvus-io/birdwatcher#545 ·
-
kind/bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
kubernetes-sigs/prow#953 · 1 bình luận ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
caddyserver/caddy#8046 ·