]> 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, 15 Apr 2015 16:47:06 +0000 (12:47 -0400)
Fixes gh-2145

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

index 028d0ac02568fac1c15eb3d9eba3e6531ac32309..7c9c72c291f478415101117ef79f08da02809c6d 100644 (file)
@@ -516,7 +516,12 @@ jQuery.each("Boolean Number String Function Array Date RegExp Object Error".spli
 });
 
 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 ef49999e64c71d763381e7573d9a9528140baddd..3934d3bdeffe55aa5e4ca42ea78dfacdc1c126fe 100644 (file)
@@ -1201,6 +1201,27 @@ test("jQuery.each(Object,Function)", function() {
        equal( i, 2, "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);