tobool.js (3106B)
1 var success = 0; 2 var expected_bool = 0; 3 var expected_int = 0; 4 var expected_double = 0; 5 var expected_string = 0; 6 var expected_object = 0; 7 var expected_symbol = 0; 8 9 function test_type_stable_ic() { 10 // Initialize as falsy where possible. 11 var a = undefined; // No Change, never succeeds 12 var b = null; // No Change, never succeeds 13 var c = false; // Alternate between true and false. 14 var d = 0; // Int32 cache checker, change int values 15 var e = ""; // String cache checker, change string values 16 var f = Symbol(); // No change, always succeed, no cache. 17 var g = {}; // Change objects, always succeed. 18 var h = -0; // Double cache checker, change double values. 19 20 for (var i =0; i < 30; i++) { 21 // Switch between values to ensure the caches fire. 22 switch (i % 3) { 23 case 0: 24 d = 0; 25 e = "hi"; expected_string++; 26 c = true; expected_bool++; 27 h = 0; 28 break; 29 case 1: 30 d = 1; expected_int++; 31 e = ""; 32 c = false; 33 h = NaN; 34 break; 35 case 2: 36 d = 2; expected_int++; 37 h = 1.234; expected_double++; 38 g = {}; 39 break; 40 } 41 42 if (a) { success++; } 43 if (b) { success++; } 44 if (c) { success++; } 45 if (d) { success++; } 46 if (e) { success++; } 47 if (f) { success++; } expected_symbol++; // Symbol succeed 48 if (g) { success++; } expected_object++; // Object success 49 if (h) { success++; } 50 } 51 } 52 53 test_type_stable_ic(); 54 55 assertEq(success, expected_bool + expected_double + expected_int + expected_object + expected_string + expected_symbol); 56 57 58 // Test cache failures. 59 function helper(fun, arg, n) 60 { 61 var r = 0; 62 for (var i = 0; i < n; i++) { 63 r = fun(arg); 64 } 65 return r ? 1 : 0; 66 } 67 68 function test_transition(fun, load, test, before, after) { 69 var a = helper(fun, load, 30); 70 var x = helper(fun, test, 5) 71 assertEq(a, before); 72 assertEq(x, after) 73 } 74 75 var fun1 = (x) => { if (x) return true; else return false; }; 76 var fun2 = (x) => { if (x) return true; else return false; }; 77 var fun3 = (x) => { if (x) return true; else return false; }; 78 var fun4 = (x) => { if (x) return true; else return false; }; 79 var fun5 = (x) => { if (x) return true; else return false; }; 80 var fun6 = (x) => { if (x) return true; else return false; }; 81 var fun7 = (x) => { if (x) return true; else return false; }; 82 var fun8 = (x) => { if (x) return true; else return false; }; 83 84 // NaN -> Int32 85 test_transition(fun1, NaN, 1, 0, 1); 86 test_transition(fun2, 1, NaN, 1, 0); 87 // NaN -> Object / Object -> NaN 88 test_transition(fun3, NaN, {}, 0, 1); 89 test_transition(fun4, {}, NaN, 1, 0); 90 // Object -> null / null -> Object 91 test_transition(fun5, {}, null, 1, 0); 92 test_transition(fun6, null, {}, 0, 1); 93 // Symbol -> null, null -> Symbol 94 test_transition(fun7, Symbol('hi'), null, 1, 0); 95 test_transition(fun8, null, Symbol('lo'), 0, 1);