| Index: test/mjsunit/object-literal.js | 
| =================================================================== | 
| --- test/mjsunit/object-literal.js	(revision 5191) | 
| +++ test/mjsunit/object-literal.js	(working copy) | 
| @@ -103,3 +103,110 @@ | 
| b = makeRegexpInObject(); | 
| assertTrue(a.a.b === b.a.b); | 
| assertFalse(a.a.c === b.a.c); | 
| + | 
| + | 
| +// Test keywords valid as property names in initializers and dot-access. | 
| +var keywords = [ | 
| +  "break", | 
| +  "case", | 
| +  "catch", | 
| +  "const", | 
| +  "continue", | 
| +  "debugger", | 
| +  "default", | 
| +  "delete", | 
| +  "do", | 
| +  "else", | 
| +  "false", | 
| +  "finally", | 
| +  "for", | 
| +  "function", | 
| +  "if", | 
| +  "in", | 
| +  "instanceof", | 
| +  "native", | 
| +  "new", | 
| +  "null", | 
| +  "return", | 
| +  "switch", | 
| +  "this", | 
| +  "throw", | 
| +  "true", | 
| +  "try", | 
| +  "typeof", | 
| +  "var", | 
| +  "void", | 
| +  "while", | 
| +  "with", | 
| +]; | 
| + | 
| +function testKeywordProperty(keyword) { | 
| +  try { | 
| +    // Sanity check that what we get is a keyword. | 
| +    eval("var " + keyword + " = 42;"); | 
| +    assertUnreachable("Not a keyword: " + keyword); | 
| +  } catch (e) { } | 
| + | 
| +  // Simple property, read and write. | 
| +  var x = eval("({" + keyword + ": 42})"); | 
| +  assertEquals(42, x[keyword]); | 
| +  assertEquals(42, eval("x." + keyword)); | 
| +  eval("x." + keyword + " = 37"); | 
| +  assertEquals(37, x[keyword]); | 
| +  assertEquals(37, eval("x." + keyword)); | 
| + | 
| +  // Getter/setter property, read and write. | 
| +  var y = eval("({value : 42, get " + keyword + "(){return this.value}," + | 
| +               " set " + keyword + "(v) { this.value = v; }})"); | 
| +  assertEquals(42, y[keyword]); | 
| +  assertEquals(42, eval("y." + keyword)); | 
| +  eval("y." + keyword + " = 37"); | 
| +  assertEquals(37, y[keyword]); | 
| +  assertEquals(37, eval("y." + keyword)); | 
| + | 
| +  // Quoted keyword works is read back by unquoted as well. | 
| +  var z = eval("({\"" + keyword + "\": 42})"); | 
| +  assertEquals(42, z[keyword]); | 
| +  assertEquals(42, eval("z." + keyword)); | 
| + | 
| +  // Function property, called. | 
| +  var was_called; | 
| +  function test_call() { this.was_called = true; was_called = true; } | 
| +  var w = eval("({" + keyword + ": test_call, was_called: false})"); | 
| +  eval("w." + keyword + "();"); | 
| +  assertTrue(was_called); | 
| +  assertTrue(w.was_called); | 
| + | 
| +  // Function property, constructed. | 
| +  function construct() { this.constructed = true; } | 
| +  var v = eval("({" + keyword + ": construct})"); | 
| +  var vo = eval("new v." + keyword + "()"); | 
| +  assertTrue(vo instanceof construct); | 
| +  assertTrue(vo.constructed); | 
| +} | 
| + | 
| +for (var i = 0; i < keywords.length; i++) { | 
| +  testKeywordProperty(keywords[i]); | 
| +} | 
| + | 
| +// Test getter and setter properties with string/number literal names. | 
| + | 
| +var obj = {get 42() { return 42; }, | 
| +           get 3.14() { return "PI"; }, | 
| +           get "PI"() { return 3.14; }, | 
| +           readback: 0, | 
| +           set 37(v) { this.readback = v; }, | 
| +           set 1.44(v) { this.readback = v; }, | 
| +           set "Poo"(v) { this.readback = v; }} | 
| + | 
| +assertEquals(42, obj[42]); | 
| +assertEquals("PI", obj[3.14]); | 
| +assertEquals(3.14, obj["PI"]); | 
| +obj[37] = "t1"; | 
| +assertEquals("t1", obj.readback); | 
| +obj[1.44] = "t2"; | 
| +assertEquals("t2", obj.readback); | 
| +obj["Poo"] = "t3"; | 
| +assertEquals("t3", obj.readback); | 
| + | 
| + | 
|  |