[Webkit-unassigned] [Bug 135879] New: iOS 8 beta 5 Set forEach sometimes triggers wrong number of times

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Wed Aug 13 07:08:48 PDT 2014


https://bugs.webkit.org/show_bug.cgi?id=135879

           Summary: iOS 8 beta 5 Set forEach sometimes triggers wrong
                    number of times
           Product: WebKit
           Version: 528+ (Nightly build)
          Platform: iOS
               URL: http://www.scirra.com/labs/bugs/sbtestbug2/
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: P2
         Component: JavaScriptCore
        AssignedTo: webkit-unassigned at lists.webkit.org
        ReportedBy: ashley at scirra.com


In our HTML5 game engine we use Sets when supported, and the latest iOS 8 betas have turned up a strange issue that does not happen in any other browser that supports Set: sometimes Set forEach will fire its callback a different number of times to the Set.size property.

I can only reproduce this in a real-world example of our engine, which is pretty complex: http://www.scirra.com/labs/bugs/sbtestbug2/

After about a minute or so, the game will alert a message like "Set forEach mismatch: iterated 7 times when Set size returns 6".

The code in question is below. ObjectSet_.update_cache aims to dump the contents of the Set in to the array this.values_cache.

var current_arr = null;
    var current_index = 0;

    function set_append_to_arr(x)
    {
        current_arr[current_index++] = x;
    };

    ObjectSet_.prototype.update_cache = function ()
    {
        if (this.cache_valid)
            return;

        if (supports_set)
        {
            this.values_cache.length = this.s["size"];

            current_arr = this.values_cache;
            current_index = 0;

            this.s["forEach"](set_append_to_arr);

            // CHECK FOR THE BUG
            if (current_index !== this.s["size"])
            {
                alert("Set forEach mismatch: iterated " + current_index + " times when Set size returns " + this.s["size"]);
            }

            current_arr = null;
            current_index = 0;
        }
        else
        {
            // (unrelated workaround when Set not supported)
        }

        // Cache now up to date
        this.cache_valid = true;
    };

I tried to reproduce this in a standalone example trying to emulate what our engine does, but it does not reproduce. For what it's worth, the example that appears to demonstrate everything working is here: http://www.scirra.com/labs/bugs/testsetforeach.html

I know it's difficult to investigate bugs without a standalone repro, but in this case I can't make one outside of the actual game engine, but it does reproduce every time here.

-- 
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.



More information about the webkit-unassigned mailing list