1// Copyright 2013 the V8 project authors. All rights reserved. 2// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions 6// are met: 7// 1. Redistributions of source code must retain the above copyright 8// notice, this list of conditions and the following disclaimer. 9// 2. Redistributions in binary form must reproduce the above copyright 10// notice, this list of conditions and the following disclaimer in the 11// documentation and/or other materials provided with the distribution. 12// 13// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 24description( 25"This test checks that toString() round-trip on a function that has a expression of form 4..x does not lose its meaning." 26+ " The expression accesses the property 'x' from number '4'." 27); 28 29// construct same test-case for different kinds of number literals. the switch is used to avoid 30// individual returns getting optimized away (if the interpreter would do dead code elimination) 31 32// testcase for number literal with decimal point, i.e '4.' 33function f1(a) { 34 switch(a) { 35 case "member": 36 return 4..x; 37 case "arrayget": 38 return 4.["x"]; 39 case "constr": 40 return 4.(); 41 case "funccall": 42 return 4..f(); 43 case "parenfunccall": 44 return (4..x)(); 45 case "assignment": 46 return 4..x = 33; 47 case "assignment2": 48 return 4..x >>>= 1; 49 case "prefix": 50 return ++4..x; 51 case "postfix": 52 return 4..x++; 53 case "delete": 54 delete 4..x; 55 return 4..x; 56 } 57 58 return 0; 59} 60 61// '4. .' 62function f2(a) { 63 switch(a) { 64 case "member": 65 return 4. .x; 66 case "arrayget": 67 return 4. ["x"]; 68 case "constr": 69 return 4.(); 70 case "funccall": 71 return 4. .f(); 72 case "parenfunccall": 73 return (4. .x)(); 74 case "assignment": 75 return 4. .x = 33; 76 case "assignment2": 77 return 4. .x >>>= 1; 78 case "prefix": 79 return ++4. .x; 80 case "postfix": 81 return 4. .x++; 82 case "delete": 83 delete 4. .x; 84 return 4. .x; 85 } 86 87 return 0; 88} 89 90// '4e20' 91function f2(a) { 92 switch(a) { 93 case "member": 94 return 4e20.x; 95 case "arrayget": 96 return 4e20["x"]; 97 case "constr": 98 return 4e20(); 99 case "funccall": 100 return 4e20.f(); 101 case "parenfunccall": 102 return (4e20.x)(); 103 case "assignment": 104 return 4e20.x = 33; 105 case "assignment2": 106 return 4e20.x >>>= 1; 107 case "prefix": 108 return ++4e20.x; 109 case "postfix": 110 return 4e20.x++; 111 case "delete": 112 delete 4e20.x; 113 return 4e20.x; 114 } 115 116 return 0; 117} 118 119// '4.1e-20' 120function f3(a) { 121 switch(a) { 122 case "member": 123 return 4.1e-20.x; 124 case "arrayget": 125 return 4.1e-20["x"]; 126 case "constr": 127 return 4.1e-20(); 128 case "funccall": 129 return 4.1e-20.f(); 130 case "parenfunccall": 131 return (4.1e-20.x)(); 132 case "assignment": 133 return 4.1e-20.x = 33; 134 case "assignment2": 135 return 4.1e-20.x >>>= 1; 136 case "prefix": 137 return ++4.1e-20.x; 138 case "postfix": 139 return 4.1e-20.x++; 140 case "delete": 141 delete 4.1e-20.x; 142 return 4.1e-20.x; 143 } 144 145 return 0; 146} 147 148// '4' 149function f4(a) { 150 switch(a) { 151 case "member": 152 return 4 .x; 153 case "arrayget": 154 return 4["x"]; 155 case "constr": 156 return 4(); 157 case "funccall": 158 return 4 .f(); 159 case "parenfunccall": 160 return (4 .x)(); 161 case "assignment": 162 return 4 .x = 33; 163 case "assignment2": 164 return 4 .x >>>= 1; 165 case "prefix": 166 return ++4 .x; 167 case "postfix": 168 return 4 .x++; 169 case "delete": 170 delete 4 .x; 171 return 4 .x; 172 173 } 174 175 return 0; 176} 177 178// '(4)' 179function f5(a) { 180 switch(a) { 181 case "member": 182 return (4).x; 183 case "arrayget": 184 return (4)["x"]; 185 case "constr": 186 return (4)(); 187 case "funccall": 188 return (4).f(); 189 case "parenfunccall": 190 return ((4).x)(); 191 case "assignment": 192 return (4).x = 33; 193 case "assignment2": 194 return (4).x >>>= 1; 195 case "prefix": 196 return ++(4).x; 197 case "postfix": 198 return (4).x++; 199 case "delete": 200 delete (4).x; 201 return (4).x; 202 } 203 204 return 0; 205} 206unevalf = function(x) { return '(' + x.toString() + ')'; }; 207 208function testToString(fn) 209{ 210 shouldBe("unevalf(eval(unevalf(" + fn + ")))", "unevalf(" + fn + ")"); 211} 212 213for(var i = 1; i < 6; ++i) 214 testToString("f" + i); 215