summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/data_smart.py50
1 files changed, 23 insertions, 27 deletions
diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py
index 7b2c0a8943..ecc71bd644 100644
--- a/bitbake/lib/bb/data_smart.py
+++ b/bitbake/lib/bb/data_smart.py
@@ -105,11 +105,7 @@ class VariableParse:
105 if self.varname and key: 105 if self.varname and key:
106 if self.varname == key: 106 if self.varname == key:
107 raise Exception("variable %s references itself!" % self.varname) 107 raise Exception("variable %s references itself!" % self.varname)
108 if key in self.d.expand_cache: 108 var = self.d.getVarFlag(key, "_content")
109 varparse = self.d.expand_cache[key]
110 var = varparse.value
111 else:
112 var = self.d.getVarFlag(key, "_content")
113 self.references.add(key) 109 self.references.add(key)
114 if var is not None: 110 if var is not None:
115 return var 111 return var
@@ -412,9 +408,6 @@ class DataSmart(MutableMapping):
412 if not isinstance(s, str): # sanity check 408 if not isinstance(s, str): # sanity check
413 return VariableParse(varname, self, s) 409 return VariableParse(varname, self, s)
414 410
415 if varname and varname in self.expand_cache:
416 return self.expand_cache[varname]
417
418 varparse = VariableParse(varname, self) 411 varparse = VariableParse(varname, self)
419 412
420 while s.find('${') != -1: 413 while s.find('${') != -1:
@@ -438,9 +431,6 @@ class DataSmart(MutableMapping):
438 431
439 varparse.value = s 432 varparse.value = s
440 433
441 if varname:
442 self.expand_cache[varname] = varparse
443
444 return varparse 434 return varparse
445 435
446 def expand(self, s, varname = None): 436 def expand(self, s, varname = None):
@@ -509,6 +499,7 @@ class DataSmart(MutableMapping):
509 499
510 def setVar(self, var, value, **loginfo): 500 def setVar(self, var, value, **loginfo):
511 #print("var=" + str(var) + " val=" + str(value)) 501 #print("var=" + str(var) + " val=" + str(value))
502 self.expand_cache = {}
512 parsing=False 503 parsing=False
513 if 'parsing' in loginfo: 504 if 'parsing' in loginfo:
514 parsing=True 505 parsing=True
@@ -521,7 +512,7 @@ class DataSmart(MutableMapping):
521 512
522 if 'op' not in loginfo: 513 if 'op' not in loginfo:
523 loginfo['op'] = "set" 514 loginfo['op'] = "set"
524 self.expand_cache = {} 515
525 match = __setvar_regexp__.match(var) 516 match = __setvar_regexp__.match(var)
526 if match and match.group("keyword") in __setvar_keyword__: 517 if match and match.group("keyword") in __setvar_keyword__:
527 base = match.group('base') 518 base = match.group('base')
@@ -672,6 +663,7 @@ class DataSmart(MutableMapping):
672 self.setVar(var + "_prepend", value, ignore=True, parsing=True) 663 self.setVar(var + "_prepend", value, ignore=True, parsing=True)
673 664
674 def delVar(self, var, **loginfo): 665 def delVar(self, var, **loginfo):
666 self.expand_cache = {}
675 if '_remote_data' in self.dict: 667 if '_remote_data' in self.dict:
676 connector = self.dict["_remote_data"]["_content"] 668 connector = self.dict["_remote_data"]["_content"]
677 res = connector.delVar(var) 669 res = connector.delVar(var)
@@ -681,7 +673,6 @@ class DataSmart(MutableMapping):
681 loginfo['detail'] = "" 673 loginfo['detail'] = ""
682 loginfo['op'] = 'del' 674 loginfo['op'] = 'del'
683 self.varhistory.record(**loginfo) 675 self.varhistory.record(**loginfo)
684 self.expand_cache = {}
685 self.dict[var] = {} 676 self.dict[var] = {}
686 if var in self.overridedata: 677 if var in self.overridedata:
687 del self.overridedata[var] 678 del self.overridedata[var]
@@ -704,13 +695,13 @@ class DataSmart(MutableMapping):
704 override = None 695 override = None
705 696
706 def setVarFlag(self, var, flag, value, **loginfo): 697 def setVarFlag(self, var, flag, value, **loginfo):
698 self.expand_cache = {}
707 if '_remote_data' in self.dict: 699 if '_remote_data' in self.dict:
708 connector = self.dict["_remote_data"]["_content"] 700 connector = self.dict["_remote_data"]["_content"]
709 res = connector.setVarFlag(var, flag, value) 701 res = connector.setVarFlag(var, flag, value)
710 if not res: 702 if not res:
711 return 703 return
712 704
713 self.expand_cache = {}
714 if 'op' not in loginfo: 705 if 'op' not in loginfo:
715 loginfo['op'] = "set" 706 loginfo['op'] = "set"
716 loginfo['flag'] = flag 707 loginfo['flag'] = flag
@@ -732,6 +723,17 @@ class DataSmart(MutableMapping):
732 self.dict["__exportlist"]["_content"].add(var) 723 self.dict["__exportlist"]["_content"].add(var)
733 724
734 def getVarFlag(self, var, flag, expand=True, noweakdefault=False, parsing=False): 725 def getVarFlag(self, var, flag, expand=True, noweakdefault=False, parsing=False):
726 if flag == "_content":
727 cachename = var
728 else:
729 if not flag:
730 bb.warn("Calling getVarFlag with flag unset is invalid")
731 return None
732 cachename = var + "[" + flag + "]"
733
734 if expand and cachename in self.expand_cache:
735 return self.expand_cache[cachename].value
736
735 local_var, overridedata = self._findVar(var) 737 local_var, overridedata = self._findVar(var)
736 value = None 738 value = None
737 if flag == "_content" and overridedata is not None and not parsing: 739 if flag == "_content" and overridedata is not None and not parsing:
@@ -796,14 +798,9 @@ class DataSmart(MutableMapping):
796 if match: 798 if match:
797 value = r + value 799 value = r + value
798 800
799 if expand and value: 801 if expand:
800 # Only getvar (flag == _content) hits the expand cache 802 self.expand_cache[cachename] = self.expandWithRefs(value, cachename)
801 cachename = None 803 value = self.expand_cache[cachename].value
802 if flag == "_content":
803 cachename = var
804 else:
805 cachename = var + "[" + flag + "]"
806 value = self.expand(value, cachename)
807 804
808 if value and flag == "_content" and local_var is not None and "_remove" in local_var and not parsing: 805 if value and flag == "_content" and local_var is not None and "_remove" in local_var and not parsing:
809 removes = [] 806 removes = []
@@ -821,20 +818,19 @@ class DataSmart(MutableMapping):
821 filtered = filter(lambda v: v not in removes, 818 filtered = filter(lambda v: v not in removes,
822 __whitespace_split__.split(value)) 819 __whitespace_split__.split(value))
823 value = "".join(filtered) 820 value = "".join(filtered)
824 if expand and var in self.expand_cache: 821 if expand and cachename in self.expand_cache:
825 # We need to ensure the expand cache has the correct value 822 self.expand_cache[cachename].value = value
826 # flag == "_content" here 823
827 self.expand_cache[var].value = value
828 return value 824 return value
829 825
830 def delVarFlag(self, var, flag, **loginfo): 826 def delVarFlag(self, var, flag, **loginfo):
827 self.expand_cache = {}
831 if '_remote_data' in self.dict: 828 if '_remote_data' in self.dict:
832 connector = self.dict["_remote_data"]["_content"] 829 connector = self.dict["_remote_data"]["_content"]
833 res = connector.delVarFlag(var, flag) 830 res = connector.delVarFlag(var, flag)
834 if not res: 831 if not res:
835 return 832 return
836 833
837 self.expand_cache = {}
838 local_var, _ = self._findVar(var) 834 local_var, _ = self._findVar(var)
839 if not local_var: 835 if not local_var:
840 return 836 return