[swift-dev] large dictionary literal overflows swiftc stack

Joseph Pamer jpamer at apple.com
Wed Mar 23 14:03:14 CDT 2016


Thanks for digging into this!

I’m seeing the same thing you are - in Swift 3, we’ve solved the problem for array literals, but dictionary literals are still susceptible. I’ll take a look to see why the current round of optimizations aren’t being applied to them.

- Joe

> On Mar 23, 2016, at 11:56 AM, Rafkind, Jon via swift-dev <swift-dev at swift.org> wrote:
> 
> I ran a test to see the maximum number of elements swift could handle before crashing and the numbers are
> 
> swift 2.2: 1213
> swift 3-dev (mar 16 snapshot): 976
> 
> I don't know why swift 3 is lower than swift 2.2, but I'm guessing its due to the same underlying cause, which is running out of stack space. If the swift 3 snapshot was compiled with different flags than 2.2 then swift 3 could have different stack usage properties, and thus run out of stack space quicker.
> 
> Here is a python script that generates a dictionary literal with some number of elements and runs swift on it, then does binary search to find the maximum number of elements before swift crashes.
> 
> #!/usr/bin/env python
> 
> def make_swift(n):
>    def element(x):
>        return '"x%d": "0"' % x
> 
>    data = "let n = [";
>    data += ',\n'.join([element(x) for x in xrange(0, n)])
>    data += "]"
> 
>    path = 'test-%d.swift' % n
>    file = open(path, 'w')
>    file.write(data)
>    file.write('\n')
>    file.close()
>    return path
> 
> def translate(path):
>    print "Testing %s" % path
>    import subprocess
>    out = subprocess.call(['swift', path])
>    if out == 0:
>        print "  ok"
>    else:
>        print "  failed"
>    return out == 0
> 
> def test(n):
>    path = make_swift(n)
>    return translate(path)
> 
> def binary_search(low, high):
>    while low < high:
>        middle = (low + high) / 2
>        if middle == low:
>            low = high
>            middle = high
>        if test(middle):
>            low = middle
>        else:
>            high = middle
>    return middle
> 
> #test(5000)
> 
> low = 1
> high = 10
> while test(high):
>    low = high
>    high *= 2
> 
> last_failed = binary_search(low, high)
> print "Failed at %d" % last_failed
> 
> On 03/22/2016 09:03 PM, Kyle Jessup via swift-dev wrote:
> 
> Ok I will test with swift 3, but just to avoid any confusion I am not a developer on PerfectLib.
> 
> 
> 
> I am! Admittedly, that dictionary contains many obsolete mime type mappings which could be pruned (anyone serving Lotus 1-2-3 files?). However, 816 items is not an absurdly large number so it’s likely someone else would have run into this in the near future.
> 
> The code does successfully compile for me using the release 2.2 version on my VMWare based Ubuntu 15 system. It also compiles using 3.0.
> 
> -Kyle
> 
> 
> 
> I was just using that file as a test case for my application that is based on the swiftc code base. My application is designed to consume arbitrary swift 2.2 code. If there is a problem with swift 3 then I suppose it can be fixed, but if swift 3 has no issues then it looks like I have few options for remediation.
> 
> On 03/22/2016 12:56 PM, Dmitri Gribenko wrote:
> 
> On Tue, Mar 22, 2016 at 12:17 PM, Rafkind, Jon via swift-dev
> <swift-dev at swift.org <mailto:swift-dev at swift.org>><mailto:swift-dev at swift.org <mailto:swift-dev at swift.org>><mailto:swift-dev at swift.org <mailto:swift-dev at swift.org>><mailto:swift-dev at swift.org <mailto:swift-dev at swift.org>>wrote:
> 
> 
> I have to support swift 2.2 for the time being because I have to support the current release of xcode. I will upgrade to swift 3 when it is released.
> 
> 
> 
> I understand your motivation, but I would still recommend trying to
> update your code (on a branch) to Swift 3. This way you will get a
> preview of the changes, would be able to provide feedback, and maybe
> even find issues with the changes that we are making before Swift 3 is
> finalized in a release. There is benefit for both your library and
> the Swift community.
> 
> Dmitri
> 
> 
> 
> --
> 
> 
> 
> 
> 
> _______________________________________________
> swift-dev mailing list
> swift-dev at swift.org <mailto:swift-dev at swift.org><mailto:swift-dev at swift.org <mailto:swift-dev at swift.org>>
> https://lists.swift.org/mailman/listinfo/swift-dev <https://lists.swift.org/mailman/listinfo/swift-dev>
> 
> 
> 
> --
> _______________________________________________
> swift-dev mailing list
> swift-dev at swift.org <mailto:swift-dev at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-dev <https://lists.swift.org/mailman/listinfo/swift-dev>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160323/60fcde63/attachment.html>


More information about the swift-dev mailing list