[Lldb-commits] [lldb] r285542 - [Test Suite] Pull generateSource into lldbtest

Chris Bieneman via lldb-commits lldb-commits at lists.llvm.org
Tue Nov 8 10:32:13 PST 2016


Did a little post-patch (and post-fix) research. Looks like this is a difference between Py2 and Py3. It is well explained here:

http://bugs.python.org/issue5242 <http://bugs.python.org/issue5242>

Apparently eval only grabs locals and globals, and in Py3 list comprehensions have their own function scopes, which isn’t how they worked in py2.

In general we should probably look for ways to remove eval calls from the test suite. They are widely discouraged in python code.

-Chris

> On Nov 8, 2016, at 10:05 AM, Chris Bieneman via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> 
> I pushed an attempted fix in r286254.
> 
> I wonder if this is a difference between python 2.7 and 3. The comprehension should capture everything, as should the eval call. I wonder if one of those captures less in python 3 compared to python 2.7.
> 
> Hopefully my patch will resolve the issue for you.
> 
> -Chris
> 
>> On Nov 8, 2016, at 7:37 AM, Zachary Turner <zturner at google.com <mailto:zturner at google.com>> wrote:
>> 
>> 
>> 
>> On Sun, Oct 30, 2016 at 9:57 PM Chris Bieneman via lldb-commits <lldb-commits at lists.llvm.org <mailto:lldb-commits at lists.llvm.org>> wrote:
>> 
>> Modified: lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py?rev=285542&r1=285541&r2=285542&view=diff <http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py?rev=285542&r1=285541&r2=285542&view=diff>
>> ==============================================================================
>> --- lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py (original)
>> +++ lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py Sun Oct 30 23:48:19 2016
>> @@ -1848,6 +1848,33 @@ class TestBase(Base):
>>                  folder = os.path.dirname(folder)
>>                  continue
>> 
>> +    def generateSource(self, source):
>> +        template = source + '.template'
>> +        temp = os.path.join(os.getcwd(), template)
>> +        with open(temp, 'r') as f:
>> +            content = f.read()
>> +
>> +        public_api_dir = os.path.join(
>> +            os.environ["LLDB_SRC"], "include", "lldb", "API")
>> +
>> +        # Look under the include/lldb/API directory and add #include statements
>> +        # for all the SB API headers.
>> +        public_headers = os.listdir(public_api_dir)
>> +        # For different platforms, the include statement can vary.
>> +        if self.hasDarwinFramework():
>> +            include_stmt = "'#include <%s>' % os.path.join('LLDB', header)"
>> +        else:
>> +            include_stmt = "'#include <%s>' % os.path.join(public_api_dir, header)"
>> +        list = [eval(include_stmt) for header in public_headers if (
>> +            header.startswith("SB") and header.endswith(".h"))]
>> +        includes = '\n'.join(list)
>> +        new_content = content.replace('%include_SB_APIs%', includes)
>> +        src = os.path.join(os.getcwd(), source)
>> +        with open(src, 'w') as f:
>> +            f.write(new_content)
>> +
>> +        self.addTearDownHook(lambda: os.remove(src))
>> +
>> 
>> The non hasDarwinFramework codepath is broken here, and I don't believe it to be a Windows specific issue.  I'm getting the following error in multiple tests.
>> 
>> Traceback (most recent call last):
>>   File "C:\src\llvm\tools\lldb\packages\Python\lldbsuite\test\functionalities\plugins\commands\TestPluginCommands.py", line 23, in setUp
>>     self.generateSource('plugin.cpp')
>>   File "C:\src\llvm\tools\lldb\packages\Python\lldbsuite\test\lldbtest.py", line 1868, in generateSource
>>     list = [eval(include_stmt) for header in public_headers if (
>>   File "C:\src\llvm\tools\lldb\packages\Python\lldbsuite\test\lldbtest.py", line 1869, in <listcomp>
>>     header.startswith("SB") and header.endswith(".h"))]
>>   File "<string>", line 1, in <module>
>> NameError: name 'public_api_dir' is not defined
>> Config=i686-C:\src\llvmbuild\ninja_release\bin\clang.exe 
>> 
>> I'm hypothesizing that the problem is that from inside of a list comprehension, your set of locals is not the same as outside of the list comprehension, and so the eval statement does not see the variable `public_api_dir`.  Is there any way you could provide a fix for this?
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20161108/64648cbe/attachment.html>


More information about the lldb-commits mailing list