Blob Blame History Raw
From 5c87167a34c6ed703444af180fffd8a45a7928ee Mon Sep 17 00:00:00 2001
From: Daniel Mensinger <daniel@mensinger-ka.de>
Date: Sat, 31 Jul 2021 17:51:05 +0200
Subject: [PATCH] interpreter: Fix list contains for Holders (fixes #9020
 #9047)

---
 mesonbuild/interpreterbase/interpreterbase.py |  4 ++--
 test cases/common/56 array methods/a.txt      |  0
 test cases/common/56 array methods/b.txt      |  0
 test cases/common/56 array methods/c.txt      |  0
 .../common/56 array methods/meson.build       | 24 +++++++++++++++++++
 5 files changed, 26 insertions(+), 2 deletions(-)
 create mode 100644 test cases/common/56 array methods/a.txt
 create mode 100644 test cases/common/56 array methods/b.txt
 create mode 100644 test cases/common/56 array methods/c.txt

diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py
index b8a6d1a0c..115e24be0 100644
--- a/mesonbuild/interpreterbase/interpreterbase.py
+++ b/mesonbuild/interpreterbase/interpreterbase.py
@@ -783,7 +783,7 @@ The result of this is undefined and will become a hard error in a future Meson r
                           posargs: T.List[TYPE_var],
                           kwargs: TYPE_kwargs) -> T.Union[TYPE_var, InterpreterObject]:
         if method_name == 'contains':
-            def check_contains(el: list) -> bool:
+            def check_contains(el: T.List[TYPE_var]) -> bool:
                 if len(posargs) != 1:
                     raise InterpreterException('Contains method takes exactly one argument.')
                 item = posargs[0]
@@ -795,7 +795,7 @@ The result of this is undefined and will become a hard error in a future Meson r
                     if element == item:
                         return True
                 return False
-            return check_contains(obj)
+            return check_contains([_unholder(x) for x in obj])
         elif method_name == 'length':
             return len(obj)
         elif method_name == 'get':
diff --git a/test cases/common/56 array methods/a.txt b/test cases/common/56 array methods/a.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/test cases/common/56 array methods/a.txt
diff --git a/test cases/common/56 array methods/b.txt b/test cases/common/56 array methods/b.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/test cases/common/56 array methods/b.txt
diff --git a/test cases/common/56 array methods/c.txt b/test cases/common/56 array methods/c.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/test cases/common/56 array methods/c.txt
diff --git a/test cases/common/56 array methods/meson.build b/test cases/common/56 array methods/meson.build
index cdda41dbf..99855bce0 100644
--- a/test cases/common/56 array methods/meson.build	
+++ b/test cases/common/56 array methods/meson.build	
@@ -5,6 +5,22 @@ one = ['abc']
 two = ['def', 'ghi']
 combined = [empty, one, two]
 
+file_list = files('a.txt', 'b.txt')
+file_a = files('a.txt')
+file_c = files('c.txt')
+
+if file_a[0] != file_list[0]
+  error('Files are not equal')
+endif
+
+if not file_list.contains(file_a[0])
+  error('Contains with ObjectHolder lists does not work')
+endif
+
+if file_list.contains(file_c[0])
+  error('Contains with ObjectHolder lists found non existant object')
+endif
+
 if empty.contains('abc')
   error('Empty is not empty.')
 endif
@@ -41,6 +57,14 @@ if not combined.contains('abc')
   error('Combined claims not to contain abc.')
 endif
 
+if not combined.contains(one)
+  error('Combined claims not to contain [abc].')
+endif
+
+if not combined.contains(two)
+  error('Combined claims not to contain [def, ghi].')
+endif
+
 if not combined.contains('ghi')
   error('Combined claims not to contain ghi.')
 endif
-- 
2.32.0