From 83ec5eaed411225d16a4fc4dc92323e3acc9f5cd Mon Sep 17 00:00:00 2001
From: Holger Freyther <ich@tamarin.(none)>
Date: Tue, 19 May 2009 13:53:12 +0200
Subject: bitbake: [parser] Cache parsed .inc and .bbclass files for a parse
 speedup

Have a growing dict with .inc and .bbclass'es. This avoids to reparse
files we have already seen.

Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
---
 bitbake/lib/bb/parse/parse_py/BBHandler.py | 37 +++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 14 deletions(-)

(limited to 'bitbake/lib')

diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py
index 9b8ad0b9ec..ab479c1eb2 100644
--- a/bitbake/lib/bb/parse/parse_py/BBHandler.py
+++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py
@@ -50,6 +50,8 @@ __body__   = []
 __classname__ = ""
 classes = [ None, ]
 
+cached_statements = {}
+
 # We need to indicate EOF to the feeder. This code is so messy that
 # factoring it out to a close_parse_file method is out of question.
 # We will use the IN_PYTHON_EOF as an indicator to just close the method
@@ -79,20 +81,27 @@ def inherit(files, d):
             __inherit_cache = data.getVar('__inherit_cache', d) or []
 
 def get_statements(filename, absolsute_filename, base_name, file):
-    statements = ast.StatementGroup()
-
-    lineno = 0
-    while 1:
-        lineno = lineno + 1
-        s = file.readline()
-        if not s: break
-        s = s.rstrip()
-        feeder(lineno, s, filename, base_name, statements)
-    if __inpython__:
-        # add a blank line to close out any python definition
-        feeder(IN_PYTHON_EOF, "", filename, base_name, statements)
-
-    return statements
+    global cached_statements
+
+    try:
+        return cached_statements[absolsute_filename]
+    except KeyError:
+        statements = ast.StatementGroup()
+
+        lineno = 0
+        while 1:
+            lineno = lineno + 1
+            s = file.readline()
+            if not s: break
+            s = s.rstrip()
+            feeder(lineno, s, filename, base_name, statements)
+        if __inpython__:
+            # add a blank line to close out any python definition
+            feeder(IN_PYTHON_EOF, "", filename, base_name, statements)
+
+        if filename.endswith(".bbclass") or filename.endswith(".inc"):
+            cached_statements[absolsute_filename] = statements
+        return statements
 
 def handle(fn, d, include):
     global __func_start_regexp__, __inherit_regexp__, __export_func_regexp__, __addtask_regexp__, __addhandler_regexp__, __infunc__, __body__, __residue__
-- 
cgit v1.2.3