| Steve Block | a7e24c1 | 2009-10-30 11:49:00 +0000 | [diff] [blame] | 1 | // Copyright 2009 the V8 project authors. All rights reserved. | 
|  | 2 | // Redistribution and use in source and binary forms, with or without | 
|  | 3 | // modification, are permitted provided that the following conditions are | 
|  | 4 | // met: | 
|  | 5 | // | 
|  | 6 | //     * Redistributions of source code must retain the above copyright | 
|  | 7 | //       notice, this list of conditions and the following disclaimer. | 
|  | 8 | //     * Redistributions in binary form must reproduce the above | 
|  | 9 | //       copyright notice, this list of conditions and the following | 
|  | 10 | //       disclaimer in the documentation and/or other materials provided | 
|  | 11 | //       with the distribution. | 
|  | 12 | //     * Neither the name of Google Inc. nor the names of its | 
|  | 13 | //       contributors may be used to endorse or promote products derived | 
|  | 14 | //       from this software without specific prior written permission. | 
|  | 15 | // | 
|  | 16 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
|  | 17 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
|  | 18 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
|  | 19 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
|  | 20 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|  | 21 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
|  | 22 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|  | 23 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
|  | 24 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | 25 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
|  | 26 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | 27 |  | 
|  | 28 | var obj = { | 
|  | 29 | a: 7, | 
|  | 30 | b: { x: 12, y: 24 }, | 
|  | 31 | c: 'Zebra' | 
|  | 32 | } | 
|  | 33 |  | 
|  | 34 | assertEquals(7, obj.a); | 
|  | 35 | assertEquals(12, obj.b.x); | 
|  | 36 | assertEquals(24, obj.b.y); | 
|  | 37 | assertEquals('Zebra', obj.c); | 
|  | 38 |  | 
|  | 39 | var z = 24; | 
|  | 40 |  | 
|  | 41 | var obj2 = { | 
|  | 42 | a: 7, | 
|  | 43 | b: { x: 12, y: z }, | 
|  | 44 | c: 'Zebra' | 
|  | 45 | } | 
|  | 46 |  | 
|  | 47 | assertEquals(7, obj2.a); | 
|  | 48 | assertEquals(12, obj2.b.x); | 
|  | 49 | assertEquals(24, obj2.b.y); | 
|  | 50 | assertEquals('Zebra', obj2.c); | 
|  | 51 |  | 
|  | 52 | var arr = []; | 
|  | 53 | for (var i = 0; i < 2; i++) { | 
|  | 54 | arr[i] = { | 
|  | 55 | a: 7, | 
|  | 56 | b: { x: 12, y: 24 }, | 
|  | 57 | c: 'Zebra' | 
|  | 58 | } | 
|  | 59 | } | 
|  | 60 |  | 
|  | 61 | arr[0].b.x = 2; | 
|  | 62 | assertEquals(2, arr[0].b.x); | 
|  | 63 | assertEquals(12, arr[1].b.x); | 
|  | 64 |  | 
|  | 65 |  | 
|  | 66 | function makeSparseArray() { | 
|  | 67 | return { | 
|  | 68 | '0': { x: 12, y: 24 }, | 
|  | 69 | '1000000': { x: 0, y: 0 } | 
|  | 70 | }; | 
|  | 71 | } | 
|  | 72 |  | 
|  | 73 | var sa1 = makeSparseArray(); | 
|  | 74 | sa1[0].x = 0; | 
|  | 75 | var sa2 = makeSparseArray(); | 
|  | 76 | assertEquals(12, sa2[0].x); | 
|  | 77 |  | 
|  | 78 | // Test that non-constant literals work. | 
|  | 79 | var n = new Object(); | 
|  | 80 |  | 
|  | 81 | function makeNonConstantArray() { return [ [ n ] ]; } | 
|  | 82 |  | 
|  | 83 | var a = makeNonConstantArray(); | 
|  | 84 | a[0][0].foo = "bar"; | 
|  | 85 | assertEquals("bar", n.foo); | 
|  | 86 |  | 
|  | 87 | function makeNonConstantObject() { return { a: { b: n } }; } | 
|  | 88 |  | 
|  | 89 | a = makeNonConstantObject(); | 
|  | 90 | a.a.b.bar = "foo"; | 
|  | 91 | assertEquals("foo", n.bar); | 
|  | 92 |  | 
|  | 93 | // Test that exceptions for regexps still hold. | 
|  | 94 | function makeRegexpInArray() { return [ [ /a*/, {} ] ]; } | 
|  | 95 |  | 
|  | 96 | a = makeRegexpInArray(); | 
|  | 97 | var b = makeRegexpInArray(); | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 98 | assertFalse(a[0][0] === b[0][0]); | 
| Steve Block | a7e24c1 | 2009-10-30 11:49:00 +0000 | [diff] [blame] | 99 | assertFalse(a[0][1] === b[0][1]); | 
|  | 100 |  | 
|  | 101 | function makeRegexpInObject() { return { a: { b: /b*/, c: {} } }; } | 
|  | 102 | a = makeRegexpInObject(); | 
|  | 103 | b = makeRegexpInObject(); | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 104 | assertFalse(a.a.b === b.a.b); | 
| Steve Block | a7e24c1 | 2009-10-30 11:49:00 +0000 | [diff] [blame] | 105 | assertFalse(a.a.c === b.a.c); | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 106 |  | 
|  | 107 |  | 
| Ben Murdoch | 3fb3ca8 | 2011-12-02 17:19:32 +0000 | [diff] [blame^] | 108 | // Test keywords are valid as property names in initializers and dot-access. | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 109 | var keywords = [ | 
|  | 110 | "break", | 
|  | 111 | "case", | 
|  | 112 | "catch", | 
|  | 113 | "const", | 
|  | 114 | "continue", | 
|  | 115 | "debugger", | 
|  | 116 | "default", | 
|  | 117 | "delete", | 
|  | 118 | "do", | 
|  | 119 | "else", | 
|  | 120 | "false", | 
|  | 121 | "finally", | 
|  | 122 | "for", | 
|  | 123 | "function", | 
|  | 124 | "if", | 
|  | 125 | "in", | 
|  | 126 | "instanceof", | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 127 | "new", | 
|  | 128 | "null", | 
|  | 129 | "return", | 
|  | 130 | "switch", | 
|  | 131 | "this", | 
|  | 132 | "throw", | 
|  | 133 | "true", | 
|  | 134 | "try", | 
|  | 135 | "typeof", | 
|  | 136 | "var", | 
|  | 137 | "void", | 
|  | 138 | "while", | 
| Ben Murdoch | 3fb3ca8 | 2011-12-02 17:19:32 +0000 | [diff] [blame^] | 139 | "with" | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 140 | ]; | 
|  | 141 |  | 
|  | 142 | function testKeywordProperty(keyword) { | 
| Ben Murdoch | 3fb3ca8 | 2011-12-02 17:19:32 +0000 | [diff] [blame^] | 143 | var exception = false; | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 144 | try { | 
|  | 145 | // Sanity check that what we get is a keyword. | 
|  | 146 | eval("var " + keyword + " = 42;"); | 
| Ben Murdoch | 3fb3ca8 | 2011-12-02 17:19:32 +0000 | [diff] [blame^] | 147 | } catch (e) { | 
|  | 148 | exception = true; | 
|  | 149 | } | 
|  | 150 | assertTrue(exception); | 
| Iain Merrick | 7568138 | 2010-08-19 15:07:18 +0100 | [diff] [blame] | 151 |  | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 152 | // Simple property, read and write. | 
|  | 153 | var x = eval("({" + keyword + ": 42})"); | 
|  | 154 | assertEquals(42, x[keyword]); | 
|  | 155 | assertEquals(42, eval("x." + keyword)); | 
|  | 156 | eval("x." + keyword + " = 37"); | 
|  | 157 | assertEquals(37, x[keyword]); | 
|  | 158 | assertEquals(37, eval("x." + keyword)); | 
| Iain Merrick | 7568138 | 2010-08-19 15:07:18 +0100 | [diff] [blame] | 159 |  | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 160 | // Getter/setter property, read and write. | 
|  | 161 | var y = eval("({value : 42, get " + keyword + "(){return this.value}," + | 
|  | 162 | " set " + keyword + "(v) { this.value = v; }})"); | 
|  | 163 | assertEquals(42, y[keyword]); | 
|  | 164 | assertEquals(42, eval("y." + keyword)); | 
|  | 165 | eval("y." + keyword + " = 37"); | 
|  | 166 | assertEquals(37, y[keyword]); | 
|  | 167 | assertEquals(37, eval("y." + keyword)); | 
| Iain Merrick | 7568138 | 2010-08-19 15:07:18 +0100 | [diff] [blame] | 168 |  | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 169 | // Quoted keyword works is read back by unquoted as well. | 
|  | 170 | var z = eval("({\"" + keyword + "\": 42})"); | 
|  | 171 | assertEquals(42, z[keyword]); | 
|  | 172 | assertEquals(42, eval("z." + keyword)); | 
| Iain Merrick | 7568138 | 2010-08-19 15:07:18 +0100 | [diff] [blame] | 173 |  | 
| Ben Murdoch | bb769b2 | 2010-08-11 14:56:33 +0100 | [diff] [blame] | 174 | // Function property, called. | 
|  | 175 | var was_called; | 
|  | 176 | function test_call() { this.was_called = true; was_called = true; } | 
|  | 177 | var w = eval("({" + keyword + ": test_call, was_called: false})"); | 
|  | 178 | eval("w." + keyword + "();"); | 
|  | 179 | assertTrue(was_called); | 
|  | 180 | assertTrue(w.was_called); | 
|  | 181 |  | 
|  | 182 | // Function property, constructed. | 
|  | 183 | function construct() { this.constructed = true; } | 
|  | 184 | var v = eval("({" + keyword + ": construct})"); | 
|  | 185 | var vo = eval("new v." + keyword + "()"); | 
|  | 186 | assertTrue(vo instanceof construct); | 
|  | 187 | assertTrue(vo.constructed); | 
|  | 188 | } | 
|  | 189 |  | 
|  | 190 | for (var i = 0; i < keywords.length; i++) { | 
|  | 191 | testKeywordProperty(keywords[i]); | 
| Ben Murdoch | 3fb3ca8 | 2011-12-02 17:19:32 +0000 | [diff] [blame^] | 192 | } |