]> source.dussan.org Git - jquery.git/commitdiff
Core: add workaround for iOS JIT error in isArrayLike
authorTimmy Willison <timmywillisn@gmail.com>
Sat, 4 Apr 2015 19:34:07 +0000 (15:34 -0400)
committerTimmy Willison <timmywillisn@gmail.com>
Wed, 29 Apr 2015 22:03:32 +0000 (18:03 -0400)
Fixes gh-2145

src/core.js
test/unit/core.js

index 21a995f382711bc4892faff071163e155a61507e..889fcd51327a1b9fcff086e7a384790dcfb5590c 100644 (file)
@@ -484,7 +484,12 @@ function(i, name) {
 });
 
 function isArraylike( obj ) {
-       var length = obj.length,
+
+       // Support: iOS 8.2 (not reproducible in simulator)
+       // `in` check used to prevent JIT error (gh-2145)
+       // hasOwn isn't used here due to false negatives
+       // regarding Nodelist length in IE
+       var length = "length" in obj && obj.length,
                type = jQuery.type( obj );
 
        if ( type === "function" || jQuery.isWindow( obj ) ) {
index 2c40139d38617081287e51a35974678695150c82..cccb2df981942e2cdd073abf97a10b8fa45f786c 100644 (file)
@@ -1186,6 +1186,27 @@ test("jQuery.each(Object,Function)", function() {
        equal( i, document.styleSheets.length, "Iteration over document.styleSheets" );
 });
 
+test( "JIT compilation does not interfere with length retrieval (gh-2145)", function() {
+       expect( 4 );
+
+       var i;
+
+       // Trigger JIT compilation of jQuery.each – and therefore isArraylike – in iOS.
+       // Convince JSC to use one of its optimizing compilers
+       // by providing code which can be LICM'd into nothing.
+       for ( i = 0; i < 1000; i++ ) {
+               jQuery.each( [] );
+       }
+
+       i = 0;
+       jQuery.each( { 1: "1", 2: "2", 3: "3" }, function( index ) {
+               equal( ++i, index, "Iteration over object with solely " +
+                       "numeric indices (gh-2145 JIT iOS 8 bug)" );
+       });
+       equal( i, 3, "Iteration over object with solely " +
+               "numeric indices (gh-2145 JIT iOS 8 bug)" );
+});
+
 test("jQuery.makeArray", function(){
        expect(15);