Skip to content
This repository was archived by the owner on Apr 14, 2022. It is now read-only.

Limit size of exact collections #913

Merged
merged 1 commit into from
Apr 9, 2019
Merged
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 @@ -23,6 +23,8 @@

namespace Microsoft.Python.Analysis.Analyzer.Evaluation {
internal sealed partial class ExpressionEval {
private const int MaxCollectionSize = 1000;

public IMember GetValueFromIndex(IndexExpression expr) {
if (expr?.Target == null) {
return null;
Expand Down Expand Up @@ -56,39 +58,39 @@ public IMember GetValueFromIndex(IndexExpression expr) {

public IMember GetValueFromList(ListExpression expression) {
var contents = new List<IMember>();
foreach (var item in expression.Items) {
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
var value = GetValueFromExpression(item) ?? UnknownType;
contents.Add(value);
}
return PythonCollectionType.CreateList(Module.Interpreter, contents, exact: true);
return PythonCollectionType.CreateList(Module.Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
}

public IMember GetValueFromDictionary(DictionaryExpression expression) {
var contents = new Dictionary<IMember, IMember>();
foreach (var item in expression.Items) {
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
var key = GetValueFromExpression(item.SliceStart) ?? UnknownType;
var value = GetValueFromExpression(item.SliceStop) ?? UnknownType;
contents[key] = value;
}
return new PythonDictionary(Interpreter, contents, exact: true);
return new PythonDictionary(Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
}

private IMember GetValueFromTuple(TupleExpression expression) {
var contents = new List<IMember>();
foreach (var item in expression.Items) {
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
var value = GetValueFromExpression(item) ?? UnknownType;
contents.Add(value);
}
return PythonCollectionType.CreateTuple(Module.Interpreter, contents, exact: true);
return PythonCollectionType.CreateTuple(Module.Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
}

public IMember GetValueFromSet(SetExpression expression) {
var contents = new List<IMember>();
foreach (var item in expression.Items) {
foreach (var item in expression.Items.Take(MaxCollectionSize)) {
var value = GetValueFromExpression(item) ?? UnknownType;
contents.Add(value);
}
return PythonCollectionType.CreateSet(Interpreter, contents, exact: true);
return PythonCollectionType.CreateSet(Interpreter, contents, exact: expression.Items.Count <= MaxCollectionSize);
}

public IMember GetValueFromGenerator(GeneratorExpression expression) {
Expand Down