Bug 790349 - Define keywords with a higher-order macro. r=jorendorff
authorJeff Walden <jwalden@mit.edu>
Mon, 10 Sep 2012 13:27:18 -0700
changeset 107321 0f0affefe76f
parent 107320 da61c2c5d796
child 107322 5a5d2ad4f9e5
push id14974
push userjwalden@mit.edu
push dateTue, 18 Sep 2012 00:53:21 +0000
treeherdermozilla-inbound@5a5d2ad4f9e5 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjorendorff
bugs790349
milestone18.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 790349 - Define keywords with a higher-order macro. r=jorendorff
js/src/Makefile.in
js/src/frontend/TokenStream.cpp
js/src/jskeyword.tbl
js/src/jskwgen.cpp
js/src/vm/Keywords.h
--- a/js/src/Makefile.in
+++ b/js/src/Makefile.in
@@ -825,18 +825,18 @@ endif
 ifneq (,$(SHARED_LIBRARY))
 	$(SYSINSTALL) $(SHARED_LIBRARY) $(DESTDIR)$(libdir)
 endif
 ifneq (,$(IMPORT_LIBRARY))
 	$(SYSINSTALL) $(IMPORT_LIBRARY) $(DESTDIR)$(libdir)
 endif
 	$(MAKE) -C shell install
 
-# Extra dependancies and rules for auto-generated headers
-host_jskwgen.$(OBJ_SUFFIX): jsversion.h jskeyword.tbl
+# Extra dependencies and rules for auto-generated headers
+host_jskwgen.$(OBJ_SUFFIX): jsversion.h vm/Keywords.h
 
 # Use CURDIR to avoid finding a jsautokw.h in the source tree (from a
 # previous build?) via VPATH when we're building in a separate tree.
 $(CURDIR)/jsautokw.h: host_jskwgen$(HOST_BIN_SUFFIX)
 	./host_jskwgen$(HOST_BIN_SUFFIX) $@
 
 host_jsoplengen.$(OBJ_SUFFIX): jsopcode.tbl
 
--- a/js/src/frontend/TokenStream.cpp
+++ b/js/src/frontend/TokenStream.cpp
@@ -27,34 +27,35 @@
 #include "jsversion.h"
 #include "jsexn.h"
 #include "jsnum.h"
 #include "jsopcode.h"
 #include "jsscript.h"
 
 #include "frontend/Parser.h"
 #include "frontend/TokenStream.h"
+#include "vm/Keywords.h"
 #include "vm/RegExpObject.h"
 #include "vm/StringBuffer.h"
 
 #include "jsscriptinlines.h"
 
 #if JS_HAS_XML_SUPPORT
 #include "jsxml.h"
 #endif
 
 using namespace js;
 using namespace js::frontend;
 using namespace js::unicode;
 
 static const KeywordInfo keywords[] = {
-#define JS_KEYWORD(keyword, type, op, version) \
+#define KEYWORD_INFO(keyword, name, type, op, version) \
     {js_##keyword##_str, type, op, version},
-#include "jskeyword.tbl"
-#undef JS_KEYWORD
+    FOR_EACH_JAVASCRIPT_KEYWORD(KEYWORD_INFO)
+#undef KEYWORD_INFO
 };
 
 const KeywordInfo *
 frontend::FindKeyword(const jschar *s, size_t length)
 {
     JS_ASSERT(length != 0);
 
     register size_t i;
deleted file mode 100644
--- a/js/src/jskeyword.tbl
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- * vim: set sw=4 ts=8 et tw=80:
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-JS_KEYWORD(false,       TOK_FALSE,      JSOP_FALSE,     JSVERSION_DEFAULT)
-JS_KEYWORD(true,        TOK_TRUE,       JSOP_TRUE,      JSVERSION_DEFAULT)
-JS_KEYWORD(null,        TOK_NULL,       JSOP_NULL,      JSVERSION_DEFAULT)
-
-/* ES5 Keywords. */
-JS_KEYWORD(break,       TOK_BREAK,      JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(case,        TOK_CASE,       JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(catch,       TOK_CATCH,      JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(continue,    TOK_CONTINUE,   JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(debugger,    TOK_DEBUGGER,   JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(default,     TOK_DEFAULT,    JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(delete,      TOK_DELETE,     JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(do,          TOK_DO,         JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(else,        TOK_ELSE,       JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(finally,     TOK_FINALLY,    JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(for,         TOK_FOR,        JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(function,    TOK_FUNCTION,   JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(if,          TOK_IF,         JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(in,          TOK_IN,         JSOP_IN,        JSVERSION_DEFAULT)
-JS_KEYWORD(instanceof,  TOK_INSTANCEOF, JSOP_INSTANCEOF,JSVERSION_DEFAULT)
-JS_KEYWORD(new,         TOK_NEW,        JSOP_NEW,       JSVERSION_DEFAULT)
-JS_KEYWORD(return,      TOK_RETURN,     JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(switch,      TOK_SWITCH,     JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(this,        TOK_THIS,       JSOP_THIS,      JSVERSION_DEFAULT)
-JS_KEYWORD(throw,       TOK_THROW,      JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(try,         TOK_TRY,        JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(typeof,      TOK_TYPEOF,     JSOP_TYPEOF,    JSVERSION_DEFAULT)
-JS_KEYWORD(var,         TOK_VAR,        JSOP_DEFVAR,    JSVERSION_DEFAULT)
-JS_KEYWORD(void,        TOK_VOID,       JSOP_VOID,      JSVERSION_DEFAULT)
-JS_KEYWORD(while,       TOK_WHILE,      JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(with,        TOK_WITH,       JSOP_NOP,       JSVERSION_DEFAULT)
-
-/* ES5 reserved keywords reserved in all code. */
-JS_KEYWORD(class,       TOK_RESERVED,   JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(enum,        TOK_RESERVED,   JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(extends,     TOK_RESERVED,   JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(super,       TOK_RESERVED,   JSOP_NOP,       JSVERSION_DEFAULT)
-
-/*
- * ES5 reserved keywords with long-implemented behavior, allowed in our
- * implementation to ease code migration.
- */
-#if JS_HAS_CONST
-JS_KEYWORD(const,       TOK_CONST,      JSOP_DEFCONST,  JSVERSION_DEFAULT)
-#else
-JS_KEYWORD(const,       TOK_RESERVED,   JSOP_NOP,       JSVERSION_DEFAULT)
-#endif
-#if JS_HAS_BLOCK_SCOPE
-JS_KEYWORD(let,         TOK_LET,             JSOP_NOP,  JSVERSION_1_7)
-#else
-JS_KEYWORD(let,         TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_1_7)
-#endif
-#if JS_HAS_GENERATORS
-JS_KEYWORD(yield,       TOK_YIELD,           JSOP_NOP,  JSVERSION_1_7)
-#else
-JS_KEYWORD(yield,       TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_1_7)
-#endif
-JS_KEYWORD(export,      TOK_RESERVED,   JSOP_NOP,       JSVERSION_DEFAULT)
-JS_KEYWORD(import,      TOK_RESERVED,   JSOP_NOP,       JSVERSION_DEFAULT)
-
-/* ES5 future reserved keywords in strict mode. */
-JS_KEYWORD(implements,  TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_DEFAULT)
-JS_KEYWORD(interface,   TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_DEFAULT)
-JS_KEYWORD(package,     TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_DEFAULT)
-JS_KEYWORD(private,     TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_DEFAULT)
-JS_KEYWORD(protected,   TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_DEFAULT)
-JS_KEYWORD(public,      TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_DEFAULT)
-JS_KEYWORD(static,      TOK_STRICT_RESERVED, JSOP_NOP,  JSVERSION_DEFAULT)
--- a/js/src/jskwgen.cpp
+++ b/js/src/jskwgen.cpp
@@ -10,20 +10,22 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
 #include <ctype.h>
 
 #include "jsversion.h"
 
+#include "vm/Keywords.h"
+
 const char * const keyword_list[] = {
-#define JS_KEYWORD(keyword, type, op, version) #keyword,
-#include "jskeyword.tbl"
-#undef JS_KEYWORD
+#define KEYWORD_STRING(keyword, name, type, op, version) #keyword,
+    FOR_EACH_JAVASCRIPT_KEYWORD(KEYWORD_STRING)
+#undef KEYWORD_STRING
 };
 
 struct gen_opt {
     FILE *output;                       /* output file for generated source */
     unsigned use_if_threshold;          /* max number of choices to generate
                                            "if" selector instead of "switch" */
     unsigned char_tail_test_threshold;  /* max number of unprocessed columns
                                            to use inlined char compare
new file mode 100644
--- /dev/null
+++ b/js/src/vm/Keywords.h
@@ -0,0 +1,88 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set sw=4 ts=8 et tw=80:
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* A higher-order macro for enumerating keyword tokens. */
+
+#ifndef Keywords_h_
+#define Keywords_h_
+
+#include "jsversion.h"
+
+#if JS_HAS_CONST
+#  define FOR_CONST_KEYWORD(macro) \
+      macro(const, const_, TOK_CONST, JSOP_DEFCONST, JSVERSION_DEFAULT)
+#else
+#  define FOR_CONST_KEYWORD(macro) \
+      macro(const, const_, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
+#endif
+#if JS_HAS_BLOCK_SCOPE
+#  define FOR_LET_KEYWORD(macro) \
+      macro(let, let, TOK_LET, JSOP_NOP, JSVERSION_1_7)
+#else
+#  define FOR_LET_KEYWORD(macro) \
+      macro(let, let, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_1_7)
+#endif
+#if JS_HAS_GENERATORS
+#  define FOR_YIELD_KEYWORD(macro) \
+      macro(yield, yield, TOK_YIELD, JSOP_NOP, JSVERSION_1_7)
+#else
+#  define FOR_YIELD_KEYWORD(macro) \
+      macro(yield, yield, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_1_7)
+#endif
+
+#define FOR_EACH_JAVASCRIPT_KEYWORD(macro) \
+    macro(false, false_, TOK_FALSE, JSOP_FALSE, JSVERSION_DEFAULT) \
+    macro(true, true_, TOK_TRUE, JSOP_TRUE, JSVERSION_DEFAULT) \
+    macro(null, null, TOK_NULL, JSOP_NULL, JSVERSION_DEFAULT) \
+    /* ES5 Keywords. */ \
+    macro(break, break_, TOK_BREAK, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(case, case_, TOK_CASE, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(catch, catch_, TOK_CATCH, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(continue, continue_, TOK_CONTINUE, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(debugger, debugger, TOK_DEBUGGER, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(default, default_, TOK_DEFAULT, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(delete, delete_, TOK_DELETE, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(do, do_, TOK_DO, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(else, else_, TOK_ELSE, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(finally, finally_, TOK_FINALLY, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(for, for_, TOK_FOR, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(function, function, TOK_FUNCTION, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(if, if_, TOK_IF, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(in, in, TOK_IN, JSOP_IN, JSVERSION_DEFAULT) \
+    macro(instanceof, instanceof, TOK_INSTANCEOF, JSOP_INSTANCEOF,JSVERSION_DEFAULT) \
+    macro(new, new_, TOK_NEW, JSOP_NEW, JSVERSION_DEFAULT) \
+    macro(return, return_, TOK_RETURN, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(switch, switch_, TOK_SWITCH, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(this, this_, TOK_THIS, JSOP_THIS, JSVERSION_DEFAULT) \
+    macro(throw, throw_, TOK_THROW, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(try, try_, TOK_TRY, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(typeof, typeof, TOK_TYPEOF, JSOP_TYPEOF, JSVERSION_DEFAULT) \
+    macro(var, var, TOK_VAR, JSOP_DEFVAR, JSVERSION_DEFAULT) \
+    macro(void, void_, TOK_VOID, JSOP_VOID, JSVERSION_DEFAULT) \
+    macro(while, while_, TOK_WHILE, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(with, with, TOK_WITH, JSOP_NOP, JSVERSION_DEFAULT) \
+    /* ES5 reserved keywords reserved in all code. */ \
+    macro(class, class_, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(enum, enum_, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(export, export, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(extends, extends, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(import, import, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(super, super, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    /* ES5 future reserved keywords in strict mode. */ \
+    macro(implements, implements, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(interface, interface, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(package, package, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(private, private_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(protected, protected_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(public, public_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    macro(static, static_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
+    /* Various conditional keywords. */ \
+    FOR_CONST_KEYWORD(macro) \
+    FOR_LET_KEYWORD(macro) \
+    FOR_YIELD_KEYWORD(macro)
+
+#endif /* Keywords_h_ */