diff --git a/lib/bb/codeparser.py b/lib/bb/codeparser.py
index 6ce0c5182..afde88f44 100644
--- a/lib/bb/codeparser.py
+++ b/lib/bb/codeparser.py
@@ -224,44 +224,84 @@ class PythonParser():
 
     def visit_Call(self, node):
         name = self.called_node_name(node.func)
-        if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
-            if isinstance(node.args[0], ast.Constant) and isinstance(node.args[0].value, str):
-                varname = node.args[0].value
-                if name in self.containsfuncs and isinstance(node.args[1], ast.Constant):
-                    if varname not in self.contains:
-                        self.contains[varname] = set()
-                    self.contains[varname].add(node.args[1].value)
-                elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Constant):
-                    if varname not in self.contains:
-                        self.contains[varname] = set()
-                    self.contains[varname].update(node.args[1].value.split())
-                elif name.endswith(self.getvarflags):
-                    if isinstance(node.args[1], ast.Constant):
-                        self.references.add('%s[%s]' % (varname, node.args[1].value))
+        if sys.version_info[:3] < (3,8,0):
+            if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
+                if isinstance(node.args[0], ast.Str):
+                    varname = node.args[0].s
+                    if name in self.containsfuncs and isinstance(node.args[1], ast.Str):
+                        if varname not in self.contains:
+                            self.contains[varname] = set()
+                        self.contains[varname].add(node.args[1].s)
+                    elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Str):
+                        if varname not in self.contains:
+                            self.contains[varname] = set()
+                        self.contains[varname].update(node.args[1].s.split())
+                    elif name.endswith(self.getvarflags):
+                        if isinstance(node.args[1], ast.Str):
+                            self.references.add('%s[%s]' % (varname, node.args[1].s))
+                        else:
+                            self.warn(node.func, node.args[1])
                     else:
-                        self.warn(node.func, node.args[1])
+                        self.references.add(varname)
                 else:
-                    self.references.add(varname)
-            else:
-                self.warn(node.func, node.args[0])
-        elif name and name.endswith(".expand"):
-            if isinstance(node.args[0], ast.Constant):
-                value = node.args[0].value
-                d = bb.data.init()
-                parser = d.expandWithRefs(value, self.name)
-                self.references |= parser.references
-                self.execs |= parser.execs
-                for varname in parser.contains:
-                    if varname not in self.contains:
-                        self.contains[varname] = set()
-                    self.contains[varname] |= parser.contains[varname]
-        elif name in self.execfuncs:
-            if isinstance(node.args[0], ast.Constant):
-                self.var_execs.add(node.args[0].value)
-            else:
-                self.warn(node.func, node.args[0])
-        elif name and isinstance(node.func, (ast.Name, ast.Attribute)):
-            self.execs.add(name)
+                    self.warn(node.func, node.args[0])
+            elif name and name.endswith(".expand"):
+                if isinstance(node.args[0], ast.Str):
+                    value = node.args[0].s
+                    d = bb.data.init()
+                    parser = d.expandWithRefs(value, self.name)
+                    self.references |= parser.references
+                    self.execs |= parser.execs
+                    for varname in parser.contains:
+                        if varname not in self.contains:
+                            self.contains[varname] = set()
+                        self.contains[varname] |= parser.contains[varname]
+            elif name in self.execfuncs:
+                if isinstance(node.args[0], ast.Str):
+                    self.var_execs.add(node.args[0].s)
+                else:
+                    self.warn(node.func, node.args[0])
+            elif name and isinstance(node.func, (ast.Name, ast.Attribute)):
+                self.execs.add(name)
+        else:
+            if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
+                if isinstance(node.args[0], ast.Constant) and isinstance(node.args[0].value, str):
+                    varname = node.args[0].value
+                    if name in self.containsfuncs and isinstance(node.args[1], ast.Constant):
+                        if varname not in self.contains:
+                            self.contains[varname] = set()
+                        self.contains[varname].add(node.args[1].value)
+                    elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Constant):
+                        if varname not in self.contains:
+                            self.contains[varname] = set()
+                        self.contains[varname].update(node.args[1].value.split())
+                    elif name.endswith(self.getvarflags):
+                        if isinstance(node.args[1], ast.Constant):
+                            self.references.add('%s[%s]' % (varname, node.args[1].value))
+                        else:
+                            self.warn(node.func, node.args[1])
+                    else:
+                        self.references.add(varname)
+                else:
+                    self.warn(node.func, node.args[0])
+            elif name and name.endswith(".expand"):
+                if isinstance(node.args[0], ast.Constant):
+                    value = node.args[0].value
+                    d = bb.data.init()
+                    parser = d.expandWithRefs(value, self.name)
+                    self.references |= parser.references
+                    self.execs |= parser.execs
+                    for varname in parser.contains:
+                        if varname not in self.contains:
+                            self.contains[varname] = set()
+                        self.contains[varname] |= parser.contains[varname]
+            elif name in self.execfuncs:
+                if isinstance(node.args[0], ast.Constant):
+                    self.var_execs.add(node.args[0].value)
+                else:
+                    self.warn(node.func, node.args[0])
+            elif name and isinstance(node.func, (ast.Name, ast.Attribute)):
+                self.execs.add(name)
 
     def called_node_name(self, node):
         """Given a called node, return its original string form"""
