Skip to content
This repository was archived by the owner on Nov 4, 2024. It is now read-only.

Commit 494f854

Browse files
authored
Limit size of exact collections (microsoft#913)
Fixes microsoft#877. Limit the size of exact collections to 1000 items (when they are created from the expressions). This is set high in order to not affect potentially large `__all__` definitions. probablepeople has a dictionary with more than 150,000 key/value pairs, which takes a very long time to process; 1000 doesn't take very long.
1 parent 47ceb5e commit 494f854

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/Analysis/Ast/Impl/Analyzer/Evaluation/ExpressionEval.Collections.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
namespace Microsoft.Python.Analysis.Analyzer.Evaluation {
2525
internal sealed partial class ExpressionEval {
26+
private const int MaxCollectionSize = 1000;
27+
2628
public IMember GetValueFromIndex(IndexExpression expr) {
2729
if (expr?.Target == null) {
2830
return null;
@@ -56,39 +58,39 @@ public IMember GetValueFromIndex(IndexExpression expr) {
5658

5759
public IMember GetValueFromList(ListExpression expression) {
5860
var contents = new List<IMember>();
59-
foreach (var item in expression.Items) {
61+
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
6062
var value = GetValueFromExpression(item) ?? UnknownType;
6163
contents.Add(value);
6264
}
63-
return PythonCollectionType.CreateList(Module.Interpreter, contents, exact: true);
65+
return PythonCollectionType.CreateList(Module.Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
6466
}
6567

6668
public IMember GetValueFromDictionary(DictionaryExpression expression) {
6769
var contents = new Dictionary<IMember, IMember>();
68-
foreach (var item in expression.Items) {
70+
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
6971
var key = GetValueFromExpression(item.SliceStart) ?? UnknownType;
7072
var value = GetValueFromExpression(item.SliceStop) ?? UnknownType;
7173
contents[key] = value;
7274
}
73-
return new PythonDictionary(Interpreter, contents, exact: true);
75+
return new PythonDictionary(Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
7476
}
7577

7678
private IMember GetValueFromTuple(TupleExpression expression) {
7779
var contents = new List<IMember>();
78-
foreach (var item in expression.Items) {
80+
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
7981
var value = GetValueFromExpression(item) ?? UnknownType;
8082
contents.Add(value);
8183
}
82-
return PythonCollectionType.CreateTuple(Module.Interpreter, contents, exact: true);
84+
return PythonCollectionType.CreateTuple(Module.Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
8385
}
8486

8587
public IMember GetValueFromSet(SetExpression expression) {
8688
var contents = new List<IMember>();
87-
foreach (var item in expression.Items) {
89+
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
8890
var value = GetValueFromExpression(item) ?? UnknownType;
8991
contents.Add(value);
9092
}
91-
return PythonCollectionType.CreateSet(Interpreter, contents, exact: true);
93+
return PythonCollectionType.CreateSet(Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
9294
}
9395

9496
public IMember GetValueFromGenerator(GeneratorExpression expression) {

0 commit comments

Comments
 (0)