]> code.ossystems Code Review - openembedded-core.git/commitdiff
bitbake: Anonymous funciton improvements - use methodpool to allow cached code and...
authorRichard Purdie <rpurdie@linux.intel.com>
Tue, 13 Oct 2009 07:37:08 +0000 (08:37 +0100)
committerRichard Purdie <rpurdie@linux.intel.com>
Tue, 13 Oct 2009 07:38:13 +0000 (08:38 +0100)
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
bitbake-dev/lib/bb/parse/parse_py/BBHandler.py
bitbake/lib/bb/parse/parse_py/BBHandler.py

index f92b31fd0a4f497884ee0916610dfbaecb466290..f13bb015baf9db7a7f6e6a66bbdda60071c3c7ee 100644 (file)
@@ -25,7 +25,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-import re, bb, os, sys, time
+import re, bb, os, sys, time, string
 import bb.fetch, bb.build, bb.utils
 from bb import data, fetch, methodpool
 
@@ -89,7 +89,12 @@ def finalise(fn, d):
     try:
         t = data.getVar('T', d)
         data.setVar('T', '${TMPDIR}/anonfunc/', d)
-        build.exec_func("__anonfunc", d)
+        anonfuncs = data.getVar('__BBANONFUNCS', d) or []
+        code = ""
+        for f in anonfuncs:
+            code = code + "    %s(d)\n" % f
+        data.setVar("__anonfunc", code, d)        
+        build.exec_func_python("__anonfunc", d)
         data.delVar('T', d)
         if t:
             data.setVar('T', t, d)
@@ -211,17 +216,17 @@ def feeder(lineno, s, fn, root, d):
     if __infunc__:
         if s == '}':
             __body__.append('')
-            data.setVar(__infunc__, '\n'.join(__body__), d)
-            data.setVarFlag(__infunc__, "func", 1, d)
             if __infunc__ == "__anonymous":
-                anonqueue = bb.data.getVar("__anonqueue", d) or []
-                anonitem = {}
-                anonitem["content"] = bb.data.getVar("__anonymous", d)
-                anonitem["flags"] = bb.data.getVarFlags("__anonymous", d)
-                anonqueue.append(anonitem)
-                bb.data.setVar("__anonqueue", anonqueue, d)
-                bb.data.delVarFlags("__anonymous", d)
-                bb.data.delVar("__anonymous", d)
+                funcname = ("__anon_%s_%s" % (lineno, fn.translate(string.maketrans('/.+-', '____'))))
+                if not funcname in methodpool._parsed_fns:
+                    text = "def %s(d):\n" % (funcname) + '\n'.join(__body__)
+                    methodpool.insert_method(funcname, text, fn)
+                anonfuncs = data.getVar('__BBANONFUNCS', d) or []
+                anonfuncs.append(funcname)
+                data.setVar('__BBANONFUNCS', anonfuncs, d)
+            else:
+                data.setVarFlag(__infunc__, "func", 1, d)
+                data.setVar(__infunc__, '\n'.join(__body__), d)
             __infunc__ = ""
             __body__ = []
         else:
index e918ce3bb85a6533bfff80e0dfd782b5065aecf1..03976d4d8c59aa5e7477969453988e83fffc739d 100644 (file)
@@ -25,7 +25,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-import re, bb, os, sys, time
+import re, bb, os, sys, time, string
 import bb.fetch, bb.build, bb.utils
 from bb import data, fetch, methodpool
 
@@ -89,7 +89,12 @@ def finalise(fn, d):
     try:
         t = data.getVar('T', d)
         data.setVar('T', '${TMPDIR}/', d)
-        build.exec_func("__anonfunc", d)
+        anonfuncs = data.getVar('__BBANONFUNCS', d) or []
+        code = ""
+        for f in anonfuncs:
+            code = code + "    %s(d)\n" % f
+        data.setVar("__anonfunc", code, d)        
+        build.exec_func_python("__anonfunc", d)
         data.delVar('T', d)
         if t:
             data.setVar('T', t, d)
@@ -205,17 +210,17 @@ def feeder(lineno, s, fn, root, d):
     if __infunc__:
         if s == '}':
             __body__.append('')
-            data.setVar(__infunc__, '\n'.join(__body__), d)
-            data.setVarFlag(__infunc__, "func", 1, d)
             if __infunc__ == "__anonymous":
-                anonqueue = bb.data.getVar("__anonqueue", d) or []
-                anonitem = {}
-                anonitem["content"] = bb.data.getVar("__anonymous", d)
-                anonitem["flags"] = bb.data.getVarFlags("__anonymous", d)
-                anonqueue.append(anonitem)
-                bb.data.setVar("__anonqueue", anonqueue, d)
-                bb.data.delVarFlags("__anonymous", d)
-                bb.data.delVar("__anonymous", d)
+                funcname = ("__anon_%s_%s" % (lineno, fn.translate(string.maketrans('/.+-', '____'))))
+                if not funcname in methodpool._parsed_fns:
+                    text = "def %s(d):\n" % (funcname) + '\n'.join(__body__)
+                    methodpool.insert_method(funcname, text, fn)
+                anonfuncs = data.getVar('__BBANONFUNCS', d) or []
+                anonfuncs.append(funcname)
+                data.setVar('__BBANONFUNCS', anonfuncs, d)
+            else:
+                data.setVarFlag(__infunc__, "func", 1, d)
+                data.setVar(__infunc__, '\n'.join(__body__), d)
             __infunc__ = ""
             __body__ = []
         else: