]> 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:02:45 +0000 (18:02 -0400)
Fixes gh-2145

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

index 1cd3f53f7aea5defc4d4da0ef0d9a66219aa6ea4..4a8b73985b3a1e443f97af2cdbf3e57518a1b432 100644 (file)
@@ -432,7 +432,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 bdc82245114c2594489b77efe3c1c1542bb06ec6..5d4afb15247ea7d74ed7845a3365e9c8e3e7d35f 100644 (file)
@@ -1202,6 +1202,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);