| OLD | NEW |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 // Assert that the function code is (not) optimized. If "no sync" is passed | 106 // Assert that the function code is (not) optimized. If "no sync" is passed |
| 107 // as second argument, we do not wait for the concurrent optimization thread to | 107 // as second argument, we do not wait for the concurrent optimization thread to |
| 108 // finish when polling for optimization status. | 108 // finish when polling for optimization status. |
| 109 // Only works with --allow-natives-syntax. | 109 // Only works with --allow-natives-syntax. |
| 110 var assertOptimized; | 110 var assertOptimized; |
| 111 var assertUnoptimized; | 111 var assertUnoptimized; |
| 112 | 112 |
| 113 | 113 |
| 114 (function () { // Scope for utility functions. | 114 (function () { // Scope for utility functions. |
| 115 | 115 |
| 116 var ObjectPrototypeToString = Object.prototype.toString; |
| 117 var NumberPrototypeValueOf = Number.prototype.valueOf; |
| 118 var BooleanPrototypeValueOf = Boolean.prototype.valueOf; |
| 119 var StringPrototypeValueOf = String.prototype.valueOf; |
| 120 var DatePrototypeValueOf = Date.prototype.valueOf; |
| 121 var RegExpPrototypeToString = RegExp.prototype.toString; |
| 122 var ArrayPrototypeMap = Array.prototype.map; |
| 123 var ArrayPrototypeJoin = Array.prototype.join; |
| 124 |
| 116 function classOf(object) { | 125 function classOf(object) { |
| 117 // Argument must not be null or undefined. | 126 // Argument must not be null or undefined. |
| 118 var string = Object.prototype.toString.call(object); | 127 var string = ObjectPrototypeToString.call(object); |
| 119 // String has format [object <ClassName>]. | 128 // String has format [object <ClassName>]. |
| 120 return string.substring(8, string.length - 1); | 129 return string.substring(8, string.length - 1); |
| 121 } | 130 } |
| 122 | 131 |
| 123 | 132 |
| 133 function ValueOf(value) { |
| 134 switch (classOf(value)) { |
| 135 case "Number": |
| 136 return NumberPrototypeValueOf.call(value); |
| 137 case "String": |
| 138 return StringPrototypeValueOf.call(value); |
| 139 case "Boolean": |
| 140 return BooleanPrototypeValueOf.call(value); |
| 141 case "Date": |
| 142 return DatePrototypeValueOf.call(value); |
| 143 default: |
| 144 return value; |
| 145 } |
| 146 } |
| 147 |
| 148 |
| 124 function PrettyPrint(value) { | 149 function PrettyPrint(value) { |
| 125 switch (typeof value) { | 150 switch (typeof value) { |
| 126 case "string": | 151 case "string": |
| 127 return JSON.stringify(value); | 152 return JSON.stringify(value); |
| 128 case "number": | 153 case "number": |
| 129 if (value === 0 && (1 / value) < 0) return "-0"; | 154 if (value === 0 && (1 / value) < 0) return "-0"; |
| 130 // FALLTHROUGH. | 155 // FALLTHROUGH. |
| 131 case "boolean": | 156 case "boolean": |
| 132 case "undefined": | 157 case "undefined": |
| 133 case "function": | 158 case "function": |
| 134 case "symbol": | 159 case "symbol": |
| 135 return String(value); | 160 return String(value); |
| 136 case "object": | 161 case "object": |
| 137 if (value === null) return "null"; | 162 if (value === null) return "null"; |
| 138 var objectClass = classOf(value); | 163 var objectClass = classOf(value); |
| 139 switch (objectClass) { | 164 switch (objectClass) { |
| 140 case "Number": | 165 case "Number": |
| 141 case "String": | 166 case "String": |
| 142 case "Boolean": | 167 case "Boolean": |
| 143 case "Date": | 168 case "Date": |
| 144 return objectClass + "(" + PrettyPrint(value.valueOf()) + ")"; | 169 return objectClass + "(" + PrettyPrint(ValueOf(value)) + ")"; |
| 145 case "RegExp": | 170 case "RegExp": |
| 146 return value.toString(); | 171 return RegExpPrototypeToString.call(value); |
| 147 case "Array": | 172 case "Array": |
| 148 return "[" + value.map(PrettyPrintArrayElement).join(",") + "]"; | 173 var mapped = ArrayPrototypeMap.call(value, PrettyPrintArrayElement); |
| 149 case "Object": | 174 var joined = ArrayPrototypeJoin.call(mapped, ","); |
| 150 break; | 175 return "[" + joined + "]"; |
| 151 default: | 176 case "Object": |
| 152 return objectClass + "()"; | 177 break; |
| 178 default: |
| 179 return objectClass + "()"; |
| 153 } | 180 } |
| 154 // [[Class]] is "Object". | 181 // [[Class]] is "Object". |
| 155 var name = value.constructor.name; | 182 var name = value.constructor.name; |
| 156 if (name) return name + "()"; | 183 if (name) return name + "()"; |
| 157 return "Object()"; | 184 return "Object()"; |
| 158 default: | 185 default: |
| 159 return "-- unknown value --"; | 186 return "-- unknown value --"; |
| 160 } | 187 } |
| 161 } | 188 } |
| 162 | 189 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 return true; | 231 return true; |
| 205 } | 232 } |
| 206 if (typeof a !== typeof b) return false; | 233 if (typeof a !== typeof b) return false; |
| 207 if (typeof a === "number") return isNaN(a) && isNaN(b); | 234 if (typeof a === "number") return isNaN(a) && isNaN(b); |
| 208 if (typeof a !== "object" && typeof a !== "function") return false; | 235 if (typeof a !== "object" && typeof a !== "function") return false; |
| 209 // Neither a nor b is primitive. | 236 // Neither a nor b is primitive. |
| 210 var objectClass = classOf(a); | 237 var objectClass = classOf(a); |
| 211 if (objectClass !== classOf(b)) return false; | 238 if (objectClass !== classOf(b)) return false; |
| 212 if (objectClass === "RegExp") { | 239 if (objectClass === "RegExp") { |
| 213 // For RegExp, just compare pattern and flags using its toString. | 240 // For RegExp, just compare pattern and flags using its toString. |
| 214 return (a.toString() === b.toString()); | 241 return RegExpPrototypeToString.call(a) === |
| 242 RegExpPrototypeToString.call(b); |
| 215 } | 243 } |
| 216 // Functions are only identical to themselves. | 244 // Functions are only identical to themselves. |
| 217 if (objectClass === "Function") return false; | 245 if (objectClass === "Function") return false; |
| 218 if (objectClass === "Array") { | 246 if (objectClass === "Array") { |
| 219 var elementCount = 0; | 247 var elementCount = 0; |
| 220 if (a.length !== b.length) { | 248 if (a.length !== b.length) { |
| 221 return false; | 249 return false; |
| 222 } | 250 } |
| 223 for (var i = 0; i < a.length; i++) { | 251 for (var i = 0; i < a.length; i++) { |
| 224 if (!deepEquals(a[i], b[i])) return false; | 252 if (!deepEquals(a[i], b[i])) return false; |
| 225 } | 253 } |
| 226 return true; | 254 return true; |
| 227 } | 255 } |
| 228 if (objectClass === "String" || objectClass === "Number" || | 256 if (objectClass === "String" || objectClass === "Number" || |
| 229 objectClass === "Boolean" || objectClass === "Date") { | 257 objectClass === "Boolean" || objectClass === "Date") { |
| 230 if (a.valueOf() !== b.valueOf()) return false; | 258 if (ValueOf(a) !== ValueOf(b)) return false; |
| 231 } | 259 } |
| 232 return deepObjectEquals(a, b); | 260 return deepObjectEquals(a, b); |
| 233 } | 261 } |
| 234 | 262 |
| 235 assertSame = function assertSame(expected, found, name_opt) { | 263 assertSame = function assertSame(expected, found, name_opt) { |
| 236 // TODO(mstarzinger): We should think about using Harmony's egal operator | 264 // TODO(mstarzinger): We should think about using Harmony's egal operator |
| 237 // or the function equivalent Object.is() here. | 265 // or the function equivalent Object.is() here. |
| 238 if (found === expected) { | 266 if (found === expected) { |
| 239 if (expected !== 0 || (1 / expected) === (1 / found)) return; | 267 if (expected !== 0 || (1 / expected) === (1 / found)) return; |
| 240 } else if ((expected !== expected) && (found !== found)) { | 268 } else if ((expected !== expected) && (found !== found)) { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 if (sync_opt === undefined) sync_opt = ""; | 417 if (sync_opt === undefined) sync_opt = ""; |
| 390 assertTrue(OptimizationStatus(fun, sync_opt) !== 1, name_opt); | 418 assertTrue(OptimizationStatus(fun, sync_opt) !== 1, name_opt); |
| 391 } | 419 } |
| 392 | 420 |
| 393 assertOptimized = function assertOptimized(fun, sync_opt, name_opt) { | 421 assertOptimized = function assertOptimized(fun, sync_opt, name_opt) { |
| 394 if (sync_opt === undefined) sync_opt = ""; | 422 if (sync_opt === undefined) sync_opt = ""; |
| 395 assertTrue(OptimizationStatus(fun, sync_opt) !== 2, name_opt); | 423 assertTrue(OptimizationStatus(fun, sync_opt) !== 2, name_opt); |
| 396 } | 424 } |
| 397 | 425 |
| 398 })(); | 426 })(); |
| OLD | NEW |