From 3c58f7a44a33cb4521c17befd4c107021e5733cb Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Mon, 10 Sep 2012 13:27:18 -0700 Subject: [PATCH] Bug 790349 - Define keywords with a higher-order macro. r=jorendorff --HG-- extra : rebase_source : 728450bd46473d7d741c119ecfcf4c3c3f98cbad --- js/src/Makefile.in | 4 +- js/src/frontend/TokenStream.cpp | 7 +-- js/src/jskeyword.tbl | 75 ---------------------------- js/src/jskwgen.cpp | 8 +-- js/src/vm/Keywords.h | 88 +++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 83 deletions(-) delete mode 100644 js/src/jskeyword.tbl create mode 100644 js/src/vm/Keywords.h diff --git a/js/src/Makefile.in b/js/src/Makefile.in index b1c000c449c5..345fad3606c6 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -830,8 +830,8 @@ ifneq (,$(IMPORT_LIBRARY)) 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. diff --git a/js/src/frontend/TokenStream.cpp b/js/src/frontend/TokenStream.cpp index 266eed97bbb5..98b05f7b8c71 100644 --- a/js/src/frontend/TokenStream.cpp +++ b/js/src/frontend/TokenStream.cpp @@ -32,6 +32,7 @@ #include "frontend/Parser.h" #include "frontend/TokenStream.h" +#include "vm/Keywords.h" #include "vm/RegExpObject.h" #include "vm/StringBuffer.h" @@ -46,10 +47,10 @@ 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 * diff --git a/js/src/jskeyword.tbl b/js/src/jskeyword.tbl deleted file mode 100644 index c88fd2fd7710..000000000000 --- 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) diff --git a/js/src/jskwgen.cpp b/js/src/jskwgen.cpp index d0f4c8092be5..c488184603f7 100644 --- a/js/src/jskwgen.cpp +++ b/js/src/jskwgen.cpp @@ -15,10 +15,12 @@ #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 { diff --git a/js/src/vm/Keywords.h b/js/src/vm/Keywords.h new file mode 100644 index 000000000000..0f0409a2e150 --- /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_ */