ab3d4cf7b8
BUG=86442 TEST=mjsunit/keywords-and-reserved_words.js Review URL: http://codereview.chromium.org/7207007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8421 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
178 lines
5.3 KiB
JavaScript
178 lines
5.3 KiB
JavaScript
// Copyright 2011 the V8 project authors. All rights reserved.
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following
|
|
// disclaimer in the documentation and/or other materials provided
|
|
// with the distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived
|
|
// from this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
// Test proper handling of keywords, future reserved words and
|
|
// future reserved words in strict mode as specific by 7.6.1 and 7.6.2
|
|
// in ECMA-262.
|
|
|
|
// This code is based on:
|
|
// http://trac.webkit.org/export/89109/trunk/LayoutTests/fast/js/script-tests/keywords-and-reserved_words.js
|
|
|
|
function isKeyword(x)
|
|
{
|
|
try {
|
|
eval("var " + x + ";");
|
|
} catch(e) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function isStrictKeyword(x)
|
|
{
|
|
try {
|
|
eval("'use strict'; var "+x+";");
|
|
} catch(e) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function classifyIdentifier(x)
|
|
{
|
|
if (isKeyword(x)) {
|
|
// All non-strict keywords are also keywords in strict code.
|
|
if (!isStrictKeyword(x)) {
|
|
return "ERROR";
|
|
}
|
|
return "keyword";
|
|
}
|
|
|
|
// Check for strict mode future reserved words.
|
|
if (isStrictKeyword(x)) {
|
|
return "strict";
|
|
}
|
|
|
|
return "identifier";
|
|
}
|
|
|
|
function testKeyword(word) {
|
|
// Classify word
|
|
assertEquals("keyword", classifyIdentifier(word));
|
|
|
|
// Simple use of a keyword
|
|
assertThrows("var " + word + " = 1;", SyntaxError);
|
|
if (word != "this") {
|
|
assertThrows("typeof (" + word + ");", SyntaxError);
|
|
}
|
|
|
|
// object literal properties
|
|
eval("var x = { " + word + " : 42 };");
|
|
eval("var x = { get " + word + " () {} };");
|
|
eval("var x = { set " + word + " (value) {} };");
|
|
|
|
// object literal with string literal property names
|
|
eval("var x = { '" + word + "' : 42 };");
|
|
eval("var x = { get '" + word + "' () { } };");
|
|
eval("var x = { set '" + word + "' (value) { } };");
|
|
|
|
// Function names and arguments
|
|
assertThrows("function " + word + " () { }", SyntaxError);
|
|
assertThrows("function foo (" + word + ") {}", SyntaxError);
|
|
assertThrows("function foo (a, " + word + ") { }", SyntaxError);
|
|
assertThrows("function foo (" + word + ", a) { }", SyntaxError);
|
|
assertThrows("function foo (a, " + word + ", b) { }", SyntaxError);
|
|
assertThrows("var foo = function (" + word + ") { }", SyntaxError);
|
|
|
|
// setter parameter
|
|
assertThrows("var x = { set foo(" + word + ") { } };", SyntaxError);
|
|
}
|
|
|
|
// Not keywords - these are all just identifiers.
|
|
var identifiers = [
|
|
"x", "keyword",
|
|
"id", "strict",
|
|
"identifier", "use",
|
|
// The following are reserved in ES3 but not in ES5.
|
|
"abstract", "int",
|
|
"boolean", "long",
|
|
"byte", "native",
|
|
"char", "short",
|
|
"double", "synchronized",
|
|
"final", "throws",
|
|
"float", "transient",
|
|
"goto", "volatile" ];
|
|
|
|
for (var i = 0; i < identifiers.length; i++) {
|
|
assertEquals ("identifier", classifyIdentifier(identifiers[i]));
|
|
}
|
|
|
|
// 7.6.1.1 Keywords
|
|
var keywords = [
|
|
"break", "in",
|
|
"case", "instanceof",
|
|
"catch", "new",
|
|
"continue", "return",
|
|
"debugger", "switch",
|
|
"default", "this",
|
|
"delete", "throw",
|
|
"do", "try",
|
|
"else", "typeof",
|
|
"finally", "var",
|
|
"for", "void",
|
|
"function", "while",
|
|
"if", "with",
|
|
// In ES5 "const" is a "future reserved word" but we treat it as a keyword.
|
|
"const" ];
|
|
|
|
for (var i = 0; i < keywords.length; i++) {
|
|
testKeyword(keywords[i]);
|
|
}
|
|
|
|
// 7.6.1.2 Future Reserved Words (without "const")
|
|
var future_reserved_words = [
|
|
"class",
|
|
"enum",
|
|
"export",
|
|
"extends",
|
|
"import",
|
|
"super" ];
|
|
|
|
for (var i = 0; i < future_reserved_words.length; i++) {
|
|
testKeyword(future_reserved_words[i]);
|
|
}
|
|
|
|
// 7.6.1.2 Future Reserved Words, in strict mode only.
|
|
var future_strict_reserved_words = [
|
|
"implements",
|
|
"interface",
|
|
"let",
|
|
"package",
|
|
"private",
|
|
"protected",
|
|
"public",
|
|
"static",
|
|
"yield" ];
|
|
|
|
for (var i = 0; i < future_strict_reserved_words.length; i++) {
|
|
assertEquals ("strict", classifyIdentifier(future_strict_reserved_words[i]));
|
|
}
|
|
|
|
// More strict mode specific tests can be found in mjsunit/strict-mode.js.
|