| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 // Copyright 2016 the V8 project authors. All rights reserved. | 
|  | 2 // Use of this source code is governed by a BSD-style license that can be | 
|  | 3 // found in the LICENSE file. | 
|  | 4 | 
|  | 5 new BenchmarkSuite('Entries', [1000], [ | 
|  | 6   new Benchmark('Basic', false, false, 0, Basic, BasicSetup, BasicTearDown), | 
|  | 7   new Benchmark('BasicMegamorphic', false, false, 0, BasicMegamorphic, | 
|  | 8                 BasicMegamorphicSetup, BasicMegamorphicTearDown) | 
|  | 9 ]); | 
|  | 10 | 
|  | 11 var object; | 
|  | 12 var symbol1; | 
|  | 13 var symbol2; | 
|  | 14 var result; | 
|  | 15 | 
|  | 16 function Basic() { | 
|  | 17   result = Object.entries(object); | 
|  | 18 } | 
|  | 19 | 
|  | 20 | 
|  | 21 function BasicSetup() { | 
|  | 22   result = undefined; | 
|  | 23   symbol1 = Symbol('test'); | 
|  | 24   object = { a: 10 }; | 
|  | 25   object[26.0] = 'third'; | 
|  | 26   object.b = 72; | 
|  | 27   object[symbol1] = 'TEST'; | 
|  | 28   Object.defineProperty(object, 'not-enumerable', { | 
|  | 29       enumerable: false, value: 'nope', writable: true, configurable: true }); | 
|  | 30 } | 
|  | 31 | 
|  | 32 | 
|  | 33 function BasicTearDown() { | 
|  | 34   result = result.map(entry => `[${[String(entry[0]), String(entry[1])]}]`); | 
|  | 35   return result.length === 3 && | 
|  | 36          result.join(', ') === '[a, 10], [26.0, third], [b, 72]'; | 
|  | 37 } | 
|  | 38 | 
|  | 39 // ---------------------------------------------------------------------------- | 
|  | 40 | 
|  | 41 function BasicMegamorphic() { | 
|  | 42   result = [ | 
|  | 43     Object.entries(object[0]), Object.entries(object[1]), Object.entries(object[
     2]), | 
|  | 44     Object.entries(object[3]), Object.entries(object[4]), Object.entries(object[
     5]), | 
|  | 45     Object.entries(object[6]), Object.entries(object[7]), Object.entries(object[
     8]), | 
|  | 46     Object.entries(object[9]), Object.entries(object[10]), Object.entries(object
     [11]), | 
|  | 47     Object.entries(object[12]), Object.entries(object[13]), Object.entries(objec
     t[14]), | 
|  | 48     Object.entries(object[15]), Object.entries(object[16]), Object.entries(objec
     t[17]), | 
|  | 49     Object.entries(object[18]), Object.entries(object[19]), Object.entries(objec
     t[20]), | 
|  | 50     Object.entries(object[21]), Object.entries(object[22]), Object.entries(objec
     t[23]), | 
|  | 51     Object.entries(object[24]), | 
|  | 52     Object.entries(object[0]), Object.entries(object[1]), Object.entries(object[
     2]), | 
|  | 53     Object.entries(object[3]), Object.entries(object[4]), Object.entries(object[
     5]), | 
|  | 54     Object.entries(object[6]), Object.entries(object[7]), Object.entries(object[
     8]), | 
|  | 55     Object.entries(object[9]), Object.entries(object[10]), Object.entries(object
     [11]), | 
|  | 56     Object.entries(object[12]), Object.entries(object[13]), Object.entries(objec
     t[14]), | 
|  | 57     Object.entries(object[15]), Object.entries(object[16]), Object.entries(objec
     t[17]), | 
|  | 58     Object.entries(object[18]), Object.entries(object[19]), Object.entries(objec
     t[20]), | 
|  | 59     Object.entries(object[21]), Object.entries(object[22]), Object.entries(objec
     t[23]), | 
|  | 60     Object.entries(object[24]), | 
|  | 61     Object.entries(object[0]), Object.entries(object[1]), Object.entries(object[
     2]), | 
|  | 62     Object.entries(object[3]), Object.entries(object[4]), Object.entries(object[
     5]), | 
|  | 63     Object.entries(object[6]), Object.entries(object[7]), Object.entries(object[
     8]), | 
|  | 64     Object.entries(object[9]), Object.entries(object[10]), Object.entries(object
     [11]), | 
|  | 65     Object.entries(object[12]), Object.entries(object[13]), Object.entries(objec
     t[14]), | 
|  | 66     Object.entries(object[15]), Object.entries(object[16]), Object.entries(objec
     t[17]), | 
|  | 67     Object.entries(object[18]), Object.entries(object[19]), Object.entries(objec
     t[20]), | 
|  | 68     Object.entries(object[21]), Object.entries(object[22]), Object.entries(objec
     t[23]), | 
|  | 69     Object.entries(object[24]), | 
|  | 70     Object.entries(object[0]), Object.entries(object[1]), Object.entries(object[
     2]), | 
|  | 71     Object.entries(object[3]), Object.entries(object[4]), Object.entries(object[
     5]), | 
|  | 72     Object.entries(object[6]), Object.entries(object[7]), Object.entries(object[
     8]), | 
|  | 73     Object.entries(object[9]), Object.entries(object[10]), Object.entries(object
     [11]), | 
|  | 74     Object.entries(object[12]), Object.entries(object[13]), Object.entries(objec
     t[14]), | 
|  | 75     Object.entries(object[15]), Object.entries(object[16]), Object.entries(objec
     t[17]), | 
|  | 76     Object.entries(object[18]), Object.entries(object[19]), Object.entries(objec
     t[20]), | 
|  | 77     Object.entries(object[21]), Object.entries(object[22]), Object.entries(objec
     t[23]), | 
|  | 78     Object.entries(object[24]), | 
|  | 79   ]; | 
|  | 80 } | 
|  | 81 | 
|  | 82 | 
|  | 83 function BasicMegamorphicSetup() { | 
|  | 84   symbol1 = Symbol('megamorphicTest'); | 
|  | 85   symbol2 = Symbol('megamorphicTest2'); | 
|  | 86   object = [ | 
|  | 87     { a: 1, [symbol1]: 'ignored' }, | 
|  | 88     { q: 'q', [symbol1]: 'ignored', zz: '2' }, | 
|  | 89     { precedence: 13, operator: '*', lhs: 4.7, rhs: 5.9 }, | 
|  | 90     { name: 'Wiggins', occupation: 'woofer', age: 4, breed: 'papillon' }, | 
|  | 91     { author: 'Ted Chiang', title: 'The Lifecycle Of Software Objects', | 
|  | 92       isbn: '978-1-59606-317-4' }, | 
|  | 93     { lemon_zest: true, [symbol1]: 'ignored', }, | 
|  | 94     { elite_status: 'zerpaderp', airline: 'Bambasherp Airways' }, | 
|  | 95     { card_no: 'xxxx-xxxx-xxxx-xxxx', exp_date: 'mm/dd', | 
|  | 96       card_holder: 'Zapp Brannigan', authorized_date: '01/02/3066' }, | 
|  | 97     { [symbol1]: 'ignored', a: 49 }, | 
|  | 98     { a: 64, [symbol1]: 'ignored', b: 45 }, | 
|  | 99     { a: 64, [symbol1]: 'ignored', c: 72 }, | 
|  | 100     { operator: '>>>', lhs: 0x8000, rhs: 2, precedence: 11 }, | 
|  | 101     { [symbol1]: 'ignored', lemon_zest: false, basil: true }, | 
|  | 102     Object.defineProperty({ a: 64, [symbol1]: 'ignored', b: 45 }, '_hidden', { | 
|  | 103       get() { return 'ignored!' }, | 
|  | 104       set() { throw new Error('NO!'); }, | 
|  | 105       enumerable: false, configurable: false | 
|  | 106     }), | 
|  | 107     Object.defineProperty({ exp_date: 'mm/dd', card_no: 'xxx-xxx-xxx-xxx', | 
|  | 108                             card_holder: 'Zapp Brannigan' }, 'declined', { | 
|  | 109       value: '01/02/3066', | 
|  | 110       enumerable: true, | 
|  | 111       configurable: false, | 
|  | 112       writable: false | 
|  | 113     }), | 
|  | 114     { item: 'potato', qty: '6.7kg', date: '02/13/1947' }, | 
|  | 115     { date: '02/27/1948', item: 'scallop', qty: '3.4kg' }, | 
|  | 116     { qty: '448g', item: 'peppercorn', date: '03/17/1948', delivery: true }, | 
|  | 117     { number: 26, name: 'Taft, William Howard', sworn: '03/04/1909' }, | 
|  | 118     { name: 'Roosevelt, Franklin D', sworn: '03/04/1933', number: 32 }, | 
|  | 119     { [symbol2]: 'symbol2', [symbol1]: 'symbol1', token: 'collected' }, | 
|  | 120     { 0: 44, 1: 88, a: 49, b: 68 }, | 
|  | 121     { 44: 1, a: 49, c: 71 }, | 
|  | 122     { count: 984, year: 2016, bugs: 'fixed' }, | 
|  | 123     { cavities: 0, fillers: 0, cracks: 0, color: 'pristine', flosses: 'daily' } | 
|  | 124   ]; | 
|  | 125 } | 
|  | 126 | 
|  | 127 | 
|  | 128 function BasicMegamorphicTearDown() { | 
|  | 129   // TODO(caitp): move these result verifier utilities (from mjsunit.js) to | 
|  | 130   // base.js? Or just load mjsunit.js? | 
|  | 131   var ObjectPrototypeToString = Object.prototype.toString; | 
|  | 132   var NumberPrototypeValueOf = Number.prototype.valueOf; | 
|  | 133   var BooleanPrototypeValueOf = Boolean.prototype.valueOf; | 
|  | 134   var StringPrototypeValueOf = String.prototype.valueOf; | 
|  | 135   var DatePrototypeValueOf = Date.prototype.valueOf; | 
|  | 136   var RegExpPrototypeToString = RegExp.prototype.toString; | 
|  | 137   var ArrayPrototypeMap = Array.prototype.map; | 
|  | 138   var ArrayPrototypeJoin = Array.prototype.join; | 
|  | 139 | 
|  | 140   function classOf(object) { | 
|  | 141     // Argument must not be null or undefined. | 
|  | 142     var string = ObjectPrototypeToString.call(object); | 
|  | 143     // String has format [object <ClassName>]. | 
|  | 144     return string.substring(8, string.length - 1); | 
|  | 145   } | 
|  | 146 | 
|  | 147 | 
|  | 148   function ValueOf(value) { | 
|  | 149     switch (classOf(value)) { | 
|  | 150       case "Number": | 
|  | 151         return NumberPrototypeValueOf.call(value); | 
|  | 152       case "String": | 
|  | 153         return StringPrototypeValueOf.call(value); | 
|  | 154       case "Boolean": | 
|  | 155         return BooleanPrototypeValueOf.call(value); | 
|  | 156       case "Date": | 
|  | 157         return DatePrototypeValueOf.call(value); | 
|  | 158       default: | 
|  | 159         return value; | 
|  | 160     } | 
|  | 161   } | 
|  | 162 | 
|  | 163   function deepObjectEquals(a, b) { | 
|  | 164     var aProps = Object.keys(a); | 
|  | 165     aProps.sort(); | 
|  | 166     var bProps = Object.keys(b); | 
|  | 167     bProps.sort(); | 
|  | 168     if (!deepEquals(aProps, bProps)) { | 
|  | 169       return false; | 
|  | 170     } | 
|  | 171     for (var i = 0; i < aProps.length; i++) { | 
|  | 172       if (!deepEquals(a[aProps[i]], b[aProps[i]])) { | 
|  | 173         return false; | 
|  | 174       } | 
|  | 175     } | 
|  | 176     return true; | 
|  | 177   } | 
|  | 178 | 
|  | 179 | 
|  | 180   function deepEquals(a, b) { | 
|  | 181     if (a === b) { | 
|  | 182       // Check for -0. | 
|  | 183       if (a === 0) return (1 / a) === (1 / b); | 
|  | 184       return true; | 
|  | 185     } | 
|  | 186     if (typeof a !== typeof b) return false; | 
|  | 187     if (typeof a === "number") return isNaN(a) && isNaN(b); | 
|  | 188     if (typeof a !== "object" && typeof a !== "function") return false; | 
|  | 189     // Neither a nor b is primitive. | 
|  | 190     var objectClass = classOf(a); | 
|  | 191     if (objectClass !== classOf(b)) return false; | 
|  | 192     if (objectClass === "RegExp") { | 
|  | 193       // For RegExp, just compare pattern and flags using its toString. | 
|  | 194       return RegExpPrototypeToString.call(a) === | 
|  | 195              RegExpPrototypeToString.call(b); | 
|  | 196     } | 
|  | 197     // Functions are only identical to themselves. | 
|  | 198     if (objectClass === "Function") return false; | 
|  | 199     if (objectClass === "Array") { | 
|  | 200       var elementCount = 0; | 
|  | 201       if (a.length !== b.length) { | 
|  | 202         return false; | 
|  | 203       } | 
|  | 204       for (var i = 0; i < a.length; i++) { | 
|  | 205         if (!deepEquals(a[i], b[i])) return false; | 
|  | 206       } | 
|  | 207       return true; | 
|  | 208     } | 
|  | 209     if (objectClass === "String" || objectClass === "Number" || | 
|  | 210       objectClass === "Boolean" || objectClass === "Date") { | 
|  | 211       if (ValueOf(a) !== ValueOf(b)) return false; | 
|  | 212     } | 
|  | 213     return deepObjectEquals(a, b); | 
|  | 214   } | 
|  | 215 | 
|  | 216   if (!deepEquals([ | 
|  | 217     [['a', 1]], [['q','q'], ['zz', '2']], | 
|  | 218     [['precedence', 13], ['operator', '*'], ['lhs', 4.7], ['rhs', 5.9]], | 
|  | 219     [['name', 'Wiggins'], ['occupation', 'woofer'], ['age', 4], | 
|  | 220      ['breed', 'papillon']], | 
|  | 221     [['author', 'Ted Chiang'], ['title', 'The Lifecycle Of Software Objects'], | 
|  | 222      ['isbn', '978-1-59606-317-4']], | 
|  | 223     [['lemon_zest', true]], | 
|  | 224     [['elite_status', 'zerpaderp'], ['airline', 'Bambasherp Airways']], | 
|  | 225     [['card_no', 'xxxx-xxxx-xxxx-xxxx'], ['exp_date', 'mm/dd'], | 
|  | 226      ['card_holder', 'Zapp Brannigan'], ['authorized_date', '01/02/3066']], | 
|  | 227     [['a', 49]], [['a', 64], ['b', 45]], [['a', 64], ['c', 72]], | 
|  | 228     [['operator', '>>>'], ['lhs', 0x8000], ['rhs', 2], ['precedence', 11]], | 
|  | 229     [['lemon_zest', false], ['basil', true]], | 
|  | 230     [['a', 64], ['b', 45]], | 
|  | 231     [['exp_date', 'mm/dd'], ['card_no', 'xxx-xxx-xxx-xxx'], | 
|  | 232      ['card_holder', 'Zapp Brannigan'], ['declined', '01/02/3066']], | 
|  | 233     [['item', 'potato'], ['qty', '6.7kg'], ['date', '02/13/1947']], | 
|  | 234     [['date', '02/27/1948'], ['item', 'scallop'], ['qty', '3.4kg']], | 
|  | 235     [['qty', '448g'], ['item', 'peppercorn'], ['date', '03/17/1948'], | 
|  | 236      ['delivery', true]], | 
|  | 237     [['number', 26], ['name', 'Taft, William Howard'], ['sworn', '03/04/1909']], | 
|  | 238     [['name', 'Roosevelt, Franklin D'], ['sworn', '03/04/1933'], | 
|  | 239      ['number', 32]], | 
|  | 240     [['token', 'collected']], | 
|  | 241     [['0', 44], ['1', 88], ['a', 49], ['b', 68]], | 
|  | 242     [['44', 1], ['a', 49], ['c', 71]], | 
|  | 243     [['count', 984], ['year', 2016], ['bugs', 'fixed']], | 
|  | 244     [['cavities', 0], ['fillers', 0], ['cracks', 0], ['color', 'pristine'], | 
|  | 245      ['flosses', 'daily']], | 
|  | 246     [['a', 1]], [['q','q'], ['zz', '2']], | 
|  | 247     [['precedence', 13], ['operator', '*'], ['lhs', 4.7], ['rhs', 5.9]], | 
|  | 248     [['name', 'Wiggins'], ['occupation', 'woofer'], ['age', 4], | 
|  | 249      ['breed', 'papillon']], | 
|  | 250     [['author', 'Ted Chiang'], ['title', 'The Lifecycle Of Software Objects'], | 
|  | 251      ['isbn', '978-1-59606-317-4']], | 
|  | 252     [['lemon_zest', true]], | 
|  | 253     [['elite_status', 'zerpaderp'], ['airline', 'Bambasherp Airways']], | 
|  | 254     [['card_no', 'xxxx-xxxx-xxxx-xxxx'], ['exp_date', 'mm/dd'], | 
|  | 255      ['card_holder', 'Zapp Brannigan'], ['authorized_date', '01/02/3066']], | 
|  | 256     [['a', 49]], [['a', 64], ['b', 45]], [['a', 64], ['c', 72]], | 
|  | 257     [['operator', '>>>'], ['lhs', 0x8000], ['rhs', 2], ['precedence', 11]], | 
|  | 258     [['lemon_zest', false], ['basil', true]], | 
|  | 259     [['a', 64], ['b', 45]], | 
|  | 260     [['exp_date', 'mm/dd'], ['card_no', 'xxx-xxx-xxx-xxx'], | 
|  | 261      ['card_holder', 'Zapp Brannigan'], ['declined', '01/02/3066']], | 
|  | 262     [['item', 'potato'], ['qty', '6.7kg'], ['date', '02/13/1947']], | 
|  | 263     [['date', '02/27/1948'], ['item', 'scallop'], ['qty', '3.4kg']], | 
|  | 264     [['qty', '448g'], ['item', 'peppercorn'], ['date', '03/17/1948'], | 
|  | 265      ['delivery', true]], | 
|  | 266     [['number', 26], ['name', 'Taft, William Howard'], ['sworn', '03/04/1909']], | 
|  | 267     [['name', 'Roosevelt, Franklin D'], ['sworn', '03/04/1933'], | 
|  | 268      ['number', 32]], | 
|  | 269     [['token', 'collected']], | 
|  | 270     [['0', 44], ['1', 88], ['a', 49], ['b', 68]], | 
|  | 271     [['44', 1], ['a', 49], ['c', 71]], | 
|  | 272     [['count', 984], ['year', 2016], ['bugs', 'fixed']], | 
|  | 273     [['cavities', 0], ['fillers', 0], ['cracks', 0], ['color', 'pristine'], | 
|  | 274      ['flosses', 'daily']], | 
|  | 275     [['a', 1]], [['q','q'], ['zz', '2']], | 
|  | 276     [['precedence', 13], ['operator', '*'], ['lhs', 4.7], ['rhs', 5.9]], | 
|  | 277     [['name', 'Wiggins'], ['occupation', 'woofer'], ['age', 4], | 
|  | 278      ['breed', 'papillon']], | 
|  | 279     [['author', 'Ted Chiang'], ['title', 'The Lifecycle Of Software Objects'], | 
|  | 280      ['isbn', '978-1-59606-317-4']], | 
|  | 281     [['lemon_zest', true]], | 
|  | 282     [['elite_status', 'zerpaderp'], ['airline', 'Bambasherp Airways']], | 
|  | 283     [['card_no', 'xxxx-xxxx-xxxx-xxxx'], ['exp_date', 'mm/dd'], | 
|  | 284      ['card_holder', 'Zapp Brannigan'], ['authorized_date', '01/02/3066']], | 
|  | 285     [['a', 49]], [['a', 64], ['b', 45]], [['a', 64], ['c', 72]], | 
|  | 286     [['operator', '>>>'], ['lhs', 0x8000], ['rhs', 2], ['precedence', 11]], | 
|  | 287     [['lemon_zest', false], ['basil', true]], | 
|  | 288     [['a', 64], ['b', 45]], | 
|  | 289     [['exp_date', 'mm/dd'], ['card_no', 'xxx-xxx-xxx-xxx'], | 
|  | 290      ['card_holder', 'Zapp Brannigan'], ['declined', '01/02/3066']], | 
|  | 291     [['item', 'potato'], ['qty', '6.7kg'], ['date', '02/13/1947']], | 
|  | 292     [['date', '02/27/1948'], ['item', 'scallop'], ['qty', '3.4kg']], | 
|  | 293     [['qty', '448g'], ['item', 'peppercorn'], ['date', '03/17/1948'], | 
|  | 294      ['delivery', true]], | 
|  | 295     [['number', 26], ['name', 'Taft, William Howard'], ['sworn', '03/04/1909']], | 
|  | 296     [['name', 'Roosevelt, Franklin D'], ['sworn', '03/04/1933'], | 
|  | 297      ['number', 32]], | 
|  | 298     [['token', 'collected']], | 
|  | 299     [['0', 44], ['1', 88], ['a', 49], ['b', 68]], | 
|  | 300     [['44', 1], ['a', 49], ['c', 71]], | 
|  | 301     [['count', 984], ['year', 2016], ['bugs', 'fixed']], | 
|  | 302     [['cavities', 0], ['fillers', 0], ['cracks', 0], ['color', 'pristine'], | 
|  | 303      ['flosses', 'daily']], | 
|  | 304     [['a', 1]], [['q','q'], ['zz', '2']], | 
|  | 305     [['precedence', 13], ['operator', '*'], ['lhs', 4.7], ['rhs', 5.9]], | 
|  | 306     [['name', 'Wiggins'], ['occupation', 'woofer'], ['age', 4], | 
|  | 307      ['breed', 'papillon']], | 
|  | 308     [['author', 'Ted Chiang'], ['title', 'The Lifecycle Of Software Objects'], | 
|  | 309      ['isbn', '978-1-59606-317-4']], | 
|  | 310     [['lemon_zest', true]], | 
|  | 311     [['elite_status', 'zerpaderp'], ['airline', 'Bambasherp Airways']], | 
|  | 312     [['card_no', 'xxxx-xxxx-xxxx-xxxx'], ['exp_date', 'mm/dd'], | 
|  | 313      ['card_holder', 'Zapp Brannigan'], ['authorized_date', '01/02/3066']], | 
|  | 314     [['a', 49]], [['a', 64], ['b', 45]], [['a', 64], ['c', 72]], | 
|  | 315     [['operator', '>>>'], ['lhs', 0x8000], ['rhs', 2], ['precedence', 11]], | 
|  | 316     [['lemon_zest', false], ['basil', true]], | 
|  | 317     [['a', 64], ['b', 45]], | 
|  | 318     [['exp_date', 'mm/dd'], ['card_no', 'xxx-xxx-xxx-xxx'], | 
|  | 319      ['card_holder', 'Zapp Brannigan'], ['declined', '01/02/3066']], | 
|  | 320     [['item', 'potato'], ['qty', '6.7kg'], ['date', '02/13/1947']], | 
|  | 321     [['date', '02/27/1948'], ['item', 'scallop'], ['qty', '3.4kg']], | 
|  | 322     [['qty', '448g'], ['item', 'peppercorn'], ['date', '03/17/1948'], | 
|  | 323      ['delivery', true]], | 
|  | 324     [['number', 26], ['name', 'Taft, William Howard'], ['sworn', '03/04/1909']], | 
|  | 325     [['name', 'Roosevelt, Franklin D'], ['sworn', '03/04/1933'], | 
|  | 326      ['number', 32]], | 
|  | 327     [['token', 'collected']], | 
|  | 328     [['0', 44], ['1', 88], ['a', 49], ['b', 68]], | 
|  | 329     [['44', 1], ['a', 49], ['c', 71]], | 
|  | 330     [['count', 984], ['year', 2016], ['bugs', 'fixed']], | 
|  | 331     [['cavities', 0], ['fillers', 0], ['cracks', 0], ['color', 'pristine'], | 
|  | 332      ['flosses', 'daily']], | 
|  | 333   ], result)) { | 
|  | 334     throw new Error("FAILURE"); | 
|  | 335   } | 
|  | 336   return true; | 
|  | 337 } | 
| OLD | NEW | 
|---|